在之前的文章中我们讲了如何安装scrapy,以及使用一个简单的示例程序抓取的腾讯视频的一些数据。链接https://blog.csdn.net/guo_zhen_qian/article/details/119732629
实际使用过程中,我们会遇到很多可以无限滚动加载的页面,对于这些页面,我们如何抓取数据呢。我们还以腾讯视频为例来做一个示例程序
分析网页
我喜欢看喜剧,所以我们还选取喜剧类型的电影
网页链接,https://v.qq.com/channel/movie?listpage=1&channel=movie&itype=100004
当鼠标往下滚动的时候,你会发现底部出现了一个小加载框在加载数据
打开chrome的debug模式,我们可以看到请求的具体情况
itype=100004表示喜剧,那我们就过滤一下itype=100004看看有什么收获
收获不小,我们可以看到,原来腾讯视频是用这两个参数来控制加载更多内容的
那么加载到哪一页停止呢,看请求的返回,我翻到了2190的时候还有数据
继续往下翻,终于在offset为4080的时候,我们看到下一页按钮的class变为page_next disabled,所以我们可以以这个为标准判断是不是到头了
在上个项目的基础上,我们加上分页抓取的代码逻辑
编写spider
打开qqmovie.py
import scrapy
from movies.items import MoviesItem
class QqmovieSpider(scrapy.Spider):
name = 'qqmovie'
allowed_domains = ['v.qq.com']
# 抓取开始的URL
start_urls = ['https://v.qq.com/channel/movie?listpage=1&channel=movie&itype=100004']
# 偏移标志位
offset = 0
def parse(self, response):
# 通过class=list_item的div标签提取数据
movies = response.xpath('//div[@class="list_item"]')
for i in movies:
item = MoviesItem()
# 提取<a>标签的title作为名称
item['name'] = i.xpath('./a/@title').get()
# 提取<div>标签的title作为主演
item['starring'] = i.xpath('./div/div/@title').get()
yield item
mod_page = response.xpath('//div[@class="mod_pages"]')
# 按下一页按钮的正常class提取,提取不到说明翻页到头了
next_page = mod_page.xpath('//button[@class="page_next "]').extract_first('not found')
if next_page != 'not found':
# 原有网页的逻辑是一页30条数据
self.offset += 30
url = 'https://v.qq.com/x/bu/pagesheet/list?append=1&channel=movie&itype=100004&listpage=2&offset={}&pagesize=30'.format(str(self.offset))
yield scrapy.Request(url=url, callback=self.parse)
else:
print('数据抓取完毕')
最终看执行结果