一文带你读懂Python爬虫

一、什么是爬虫?

按照一定的规则编写程序,让其模拟人使用浏览器上网,自动抓取互联网中数据的过程,称之为爬虫。

二、爬虫分类:

通用网络爬虫:通用网络爬虫又称全网爬虫(Scalable Web Crawler),爬行整个 Web站点,主要为门户站点搜索引擎和大型 Web 服务提供商采集数据。 这类网络爬虫的爬行范围和数量大,对于爬行速度和存储空间要求较高。

通用网络爬虫的结构大致可以分为页面爬行模块 、页面分析模块、链接过滤模块、页面数据库、URL 队列、初始 URL 集合几个部分。为提高工作效率,通用网络爬虫会采取一定的爬行策略。 常用的爬行策略有:深度优先策略、广度优先策略。

聚焦网络爬虫:聚焦网络爬虫(Focused Crawler),又称主题网络爬虫(Topical Crawler),是指有选择性地爬取预先定义好的相关主题页面。 和通用网络爬虫相比,聚焦爬虫只需要爬行与主题相关的页面,极大地节省了硬件和网络资源 。

增量式网络爬虫:增量式网络爬虫(Incremental Web Crawler)是指对已下载网页采取增量式更新和只爬行新产生的或者已经发生变化网页的爬虫,它能够在一定程度上保证所爬行的页面是尽可能新的页面。 和周期性爬行和刷新页面的网络爬虫相比,增量式爬虫只会在需要的时候爬行新产生或发生更新的页面 ,并不重新下载没有发生变化的页面,可有效减少数据下载量,及时更新已爬行的网页,减小时间和空间上的耗费,但是增加了爬行算法的复杂度和实现难度。

Deep Web 爬虫:Web 页面按存在方式可以分为表层网页(Surface Web)和深层网页(Deep Web,也称 Invisible Web Pages 或 Hidden Web)。 表层网页是指传统搜索引擎可以索引的页面,以超链接可以到达的静态网页为主构成的 Web 页面。Deep Web 是那些大部分内容不能通过静态链接获取的、隐藏在搜索表单后的,只有用户提交一些关键词才能获得的 Web 页面。例如那些用户注册后内容才可见的网页就属于 Deep Web。

Deep Web 爬虫体系结构包含六个基本功能模块 (爬行控制器、解析器、表单分析器、表单处理器、响应分析器、LVS 控制器)和两个爬虫内部数据结构(URL 列表、LVS 表)。 其中 LVS(Label Value Set)表示标签/数值集合,用来表示填充表单的数据源。

相关推荐:《Python相关教程》

三、requests模块基础使用

requests常用方法:

request():构造一个请求,支撑一下各种方法的基础方法

get():获取HTML网页的主要方法,对应于HTTP的GET

head():获取HTML网页头信息的方法,对应于HTTP的HEAD

post():向HTML网页提交OST请求的方法,对应于HTTP的POST请求

put():向HTML网页提交PUT请求的方法,对应于HTTP的PUT

patch():向HTML网页提交局部修改请求,对应于HTTP的PATCH

deleete():向HTML页面提交删除请求,对应于HTTP的DELETE

1、爬取百度页面

import requests
import os
BASE_PATH = os.path.abspath(os.path.dirname(__file__))
BASE_PATH = os.path.join(BASE_PATH,'html')
file_name = os.path.join(BASE_PATH,'demo.html')
url = 'https://www.baidu.com/s?wd=python'
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.
    3729.131 Safari/537.36'
}
response = requests.get(url=url,headers=headers)
response.encoding = response.apparent_encoding  
with open(file_name,mode='w',encoding='utf-8') as f:
    f.write(response.text)

2、获取KFC北京的位置信息

import requests
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.
    3729.131 Safari/537.36'
}
for i in range(1,8):
    data = {
        "cname":"",
        "pid":"",
        "keyword": "北京",
        "pageIndex": i,
        "pageSize": '10'
    }
    response = requests.post(url,headers=headers,data=data).json()
    print(f'第{i}页')
    for j in response.get('Table1'):
        print(j['addressDetail'])