今天我们聊一聊动态抓取,所谓的动态抓取其实就是我们在抓取网页数据的时候,要抓取的数据在查看网页源代码时是找不到对应的数据的,就比如我们今天要爬取的腾讯视频的VIP电影
如上图所示,网页中有,但是在查看源代码时,源代码中没有;这事怎么回事呢,这其实就是因为它的数据是动态加载的,一般都是通过js
代码来向服务器实时获取数据的,接下来我们就抓取一下这样的网站。
既然要获取数据,那我们肯定要先找到请求数据的代码在哪儿,打开Chrome浏览器的开发者工具,我们选中network
选项
接着我们刷新一下我们要抓取的网页,可以看到下面多出来很多的东西,一般请求的代码都是在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&appkey=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
里面才是真正的数据,而results
对应的value是一个列表,分析清楚了接下来获取数据就简单了,直接上代码:
# -*- 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&appkey=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,所以只需要动态的改变请求链接,就能抓取所有的数据。