irpas技术客

Scrapy抓取滚动加载的页面_guo_zhen_qian

irpas 5942

在之前的文章中我们讲了如何安装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('数据抓取完毕')

最终看执行结果


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #Scrapy抓取滚动加载的页面