网页抓取qq(腾讯视频的VIP电影动态抓取(第二十五期))
优采云 发布时间: 2021-10-21 00:13网页抓取qq(腾讯视频的VIP电影动态抓取(第二十五期))
今天我们就来聊聊动态爬取。所谓动态爬取,其实就是我们在爬取网页数据的时候。待抓取的数据在查看网页源代码时找不到对应的数据。比如我们要抓取腾讯视频的VIP电影
腾讯视频
如上图,网页中有,但查看源码时,源码中没有;这是怎么回事,这其实是因为它的数据是动态加载的,一般是通过js代码实时到服务器端来获取数据,接下来我们抓取这样的东西网站。
既然要获取数据,首先要找出请求数据的代码在哪里,打开Chrome浏览器的开发者工具,选择网络选项
Chrome 开发者工具
然后我们刷新一下我们要爬取的网页,下面可以看到很多东西,一般请求的代码在XHR或者JS中,所以我们直接找这两个,通过搜索可以看到到如下结果:
好像是这个文件请求的数据。接下来我们选择Headers查看其请求地址
我们复制这个请求链接,直接在浏览器中打开
看来,这确实是我们要找的。它的数据类型是json类型,所以我们只需要抓取数据,然后解析就可以了!接下来开始写代码:
首先是捕获json数据:
# -*- coding:utf-8 -*-
import requests
url = 'http://list.video.qq.com/fcgi-bin/list_common_cgi?otype=json&novalue=1&platform=1&version=10000&intfname=web_vip_movie_new&tid=687&a*敏*感*词*ey=c8094537f5337021&appid=200010596&type=1&sourcetype=1&itype=-1&iyear=-1&iarea=-1&iawards=-1&sort=17&pagesize=30&offset=0&callback=jQuery19108734160972013745_1494380383266&_=1494380383271'
data = requests.get(url).content
print data
输出结果
捕获数据后,下一步就是解析数据。因为是json类型,我们导入json包进行分析。首先用正则表达式去掉前面不相关的jQuery1910...那个字符串,只留下这个字符串{"cgi_cost_time:...}的数据从链接打开的网页结果中可以看出我们刚刚复制了请求,需要的数据在{...;'jsonvalue':{...;'results':[. ..];...};...},也就是key字典中是jsonvalue,jsonvalue的值是一个字典,这个字典中的key值是results.data,results对应的值是一个list,分析清楚后,很容易得到数据,直接上代码:
# -*- coding:utf-8 -*-
import requests
import json
import re
url = 'http://list.video.qq.com/fcgi-bin/list_common_cgi?otype=json&novalue=1&platform=1&version=10000&intfname=web_vip_movie_new&tid=687&a*敏*感*词*ey=c8094537f5337021&appid=200010596&type=1&sourcetype=1&itype=-1&iyear=-1&iarea=-1&iawards=-1&sort=17&pagesize=30&offset=0&callback=jQuery19108734160972013745_1494380383266&_=1494380383271'
data = requests.get(url).content
# print data
#正则表达式去除不相干数据
data = re.search(re.compile(r'jQuery.+?\((.+)+\)'),data)
if data is not None:
a = json.loads(data.group(1))
data = a['jsonvalue']['results'] #找到results这个列表
#遍历列表
for i in data:
#列表中的值为字典,所以用字典取对应的值
print u'电影名称: '+i['fields']['title']
print u'电影简介: '+i['fields']['second_title']
print u'电影封面: '+i['fields']['vertical_pic_url']
print u'电影评分: '+i['fields']['score']['score']
print u'电影ID: '+i['id']
print '\n'
输出结果
然后得到数据。当然,这只是爬取一页的内容。如果我们想抓取所有页面,可以多次点击页面的下一页,然后对比请求链接,可以找到请求链接规律
请求链接
通过对比可以发现,每添加一个页面,这个数字就增加30个,所以只需要动态改变请求链接就可以捕获所有数据。