很多时候,在我们爬取一些网站时,都会发现他们有多页的数据,通过观察能够发现,不同页的url之间有相似之处的,而且网页的url和对应的页码也是有关系的。所以之前我们会做一个循环,遍历所有页面中的数据
当我们使用scrapy框架处理多页数据时有两种方法
-
将每一页对应的url存放到爬虫文件的
start_urls
,但如果页数较多时,列表就会变得很大 -
使用Request方法手动发起请求(推荐使用)
-
案例:使用Request方法向页面手动发起请求,爬取古诗文网每一页的古诗的标题
import scrapy
class GushiSpider(scrapy.Spider):
name = 'gushi'
start_urls = ['https://www.gushiwen.org/']
pageNum = 2 #pageNum为2,第一页已经爬取过了
url = 'https://www.gushiwen.cn/default_%d.aspx' #每页的url是类似的
def parse(self, response):
div_list = response.xpath('//div[@class="sons"]/div[1]/p[1]')
print(str(len(div_list))+"首古诗")
for div in div_list:
title = div.xpath('./a/b/text()').extract()
print(title)
print("------------------------")
# 爬取所有页码数据
if self.pageNum <= 10: #一共爬取10页(共10页)
self.pageNum += 1
url = format(self.url % self.pageNum) # 每一页的url和pageNum有关
# 手动发起请求: scrapy.Request(url,callback,meta)
## url是需要发起请求的url,
## callback参数的值是回调函数,即发起请求后需要调用哪一个方法
## meta参数的值是一个 字典,表示的是向回调函数传递什么样的参数
# 向上面格式化的url发起请求,callback递归调用parse()方法,将得到的数据继续进行解析
yield scrapy.Request(url=url,callback=self.parse)
输出结果:
- 注意事项
- 首先,因为
scrapy.Request()
会递归调用解析方法,所以必须要有一个递归结束条件,即if self.pageNum <= 10:
- 其次,要找到每一页url之间的差异,用
format()
方法格式化url scrapy.Request(url=url,callback=self.parse)
在使用callback
时,要将调用的解析方法作为参数值传给callback
- 首先,因为