scrapy爬取多页
前言
前面已经实现了模拟登陆,以及爬取单页数据和照片并保存,那么如果要爬取多页内容该如何实现呢?
scrapy发送翻页请求
学习目标:
- 应用 完善并使用Item数据类
- 应用 构造Request对象,并发送请求
1 翻页请求的思路
使用requests模块实现翻页请求的:
- 找到下一页的URL地址
- 调用requests.get(url)
scrapy实现翻页的思路:
- 找到下一页的url地址
- 构造url地址的请求,传递给引擎
2 scrapy实现翻页请求
2.1实现方法
- 确定url地址
- 构造请求,scrapy.Request(url,callback)
callback:指定解析函数名称,表示该请求返回的响应使用哪一个函数进行解析 - 把请求交给引擎:yield scrapy.Request(url,callback)
2.2 某段子网站
通过爬取段子页面的信息,学习如何实现翻页请求
思路分析
- 获取首页的数据
- 寻找下一页的地址,进行翻页,获取数据
注意:
在settings中设置User-Agent:
DEFAULT_REQUEST_HEADERS = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en",
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
}
2.3 代码实现
- 在dz.py中实现
import scrapy
from duanzi.items import DuanziItem
class DzSpider(scrapy.Spider):
name = "dz"
allowed_domains = ["抓取的网站域名"]
start_urls = ["抓取的起始网站"]
def parse(self, response, **kwargs):
# 网站的多页urlguilv
url = '使用与网页多页url有规律的url'
for i in range(1, 11):
new_url = url%i
yield scrapy.Request(new_url, callback=self.parse_detail)
def parse_detail(self, response, **kwargs):
"""
解析页面详细提取数据的方法
"""
# print(response.text)
article_list = response.xpath('//article[@class="excerpt"]')
for article in article_list:
item = DuanziItem()
title = article.xpath('./header/h2/a/text()').extract_first()
con = article.xpath('./p[@class="note"]/text()').extract_first()
# print(response.url, title, con)
item['title'] = title
item['con'] = con
print(item)
yield item
- 在items.py中实现
import scrapy
class DuanziItem(scrapy.Item):
# define the fields for your item here like:
title = scrapy.Field()
con = scrapy.Field()
2.4 scrapy.Request的更多参数
scrapy.Request(url[,callback,method="GET",headers,body,cookies,
meta,dont_filter=False])
参数解释
- 中括号中的参数为可选参数
- callback:表示当前的url的响应交给哪个函数去处理
- meta:实现数据在不同的解析函数中传递,meta默认带有部分数据,比如下载延迟,请求深度等
- dont_filter:默认为False,会过滤请求的url地址,即请求过的url地址不会继续被请求,对需要重复请求的url地址可以把它设置为Ture,比如贴吧的翻页请求,页面的数据总是在变化;start_urls中的地址会被反复请求,否则程序不会启动
- method:指定POST或GET请求
- headers:接收一个字典,其中不包括cookies
- cookies:接收一个字典,专门放置cookies
- body:接收一个字典,为POST的数据
2.5 结果展示
总结
- 完善并使用Item数据类:
- 在items.py中完善要爬取的字段
- 在爬虫文件中先导入Item
- 实力化Item对象后,像字典一样直接使用
- 构造Request对象,并发送请求:
- 导入scrapy.Request类
- 在解析函数中提取url
- yield scrapy.Request(url, callback=self.parse_detail, meta={})