Scrapy处理翻页数据抓取三种方案:
根据业务场景灵活选择。
-
分析网页url地址变化规律,在通过自增量拼接完整的url,发送请求获取响应,可以根据响应内容 或 响应状态码 做为停止条件。
- 适合动态页面 json 文件的抓取,不依赖网页 标签
-
分析网页下一页链接,并提取链接发送请求获取响应,再判断是否是最后一页做为停止条件。
- 适合 html 文件的抓取,依赖网页 标签
- 对于页码经常变动的网页,可以灵活获取所有页面
-
将所有需要发送的请求url地址,全部存在 start_urls 中,做为第一批请求全部交给下载器发送,下载器根据并发量进行处理,可以充分利用Scrapy的高并发。
- 可以通过 读取文件、数据库,或 列表推导式的方式,获取所有的url地址
Scrapy处理多级页面的数据抓取:
1 . 列表页 和 详情页 的数据保存在 不同的 item 中
- 在
items.py
里构建不同的 item 类 - 在
spider
中处理数据提取,并保存在不同的item对象中,并 yield item 给管道 - 在
pipelines
里处理数据分类(可以根据item字段,或 isinstance() 判断),分别处理数据
2 . 列表页 和 详情页 的数据保存在 同一个 item 中
- 在
items.py
里构建一个可以存储所有字段数据的 item 类 - 在
spider
中处理数据提取,保存一级页面数据,并通过构建 Request() 的meta参数,传递当前的item meta
接收一个字段,可以包含多个键值对,并且做为 该请求 对应的响应 的meta属性,传递到回调函数里- 根据需求,可以继续向下传递,直到所有的数据提取完毕,再
yield item
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url, callback=self.parse, dont_filter=True)
1 start_requests()
方法用以处理 start_urls
里的每个请求发送方式,可以重写该方法自定义处理。
2 默认start_urls
里的请求 不去重,dont_filter默认为False(去重)dont_filter(不去重)
CrawlSpider:
start_urls
里的响应,默认 follow 是 True
rules = [
Rule( LinkExtractor(allow=r'start=\d+'), follow=True),
Rule( LinkExtractor(allow=r'position_detail\.php\?id=\d+'), callback='parse_detail', follow=False),
]
rules
是一个可以存储多个Rule规则的 列表/元组,引擎会迭代 rules 处理每个Rule
每个 Rule 规则,都表示一种 网页链接提取方式 和 响应处理方式
-
LinkExtractor()
表示链接提取方式,并且发送这些链接的请求,返回的响应根据 callback 和 follow 决定: -
callback
表示 这些响应交给指定的 回调函数 解析 -
follow
是一个 bool 值 :-
follow = False
表示这些响应,不再通过 任何Rule 的 LinkExtractor 提取链接 -
follow = True
表示这些响应,会经过 每个Rule的 LinkExtractor 提取链接,再次发送这些新链接请求,这些新链接的响应 会根据所属的follow值判断,如果为 True 会继续经过 每个Rule的 LinkExtractor 提取链接,一直递归下去…当所有的能被提取的链接全部发送过,且没有新的请求了,程序结束。
-
CrawlSpider 专为整站抓取而设计的爬虫类:
start_urls
首页 (提供一级链接) Rule(LinkExtractor(allow=r’一级页面的规则’), follow=True)
一级页面(提供二级链接)Rule(LinkExtractor(allow=r’二级页面的规则’), follow=True)
二级页面(提供三级链接)Rule(LinkExtractor(allow=r’三级级页面规则’), follow=True)
三级页面(提供四级链接)Rule(LinkExtractor(allow=r’四级页面的规则’), callback=“parse_page”, follow=False)
四级页面(提供数据)
没有callback,默认follow=True
有callback,默认follow=False