这次以腾讯视频的《青云志》的最新短评作为抓取目标(ps:不得不吐槽这烂片,好好的神魔巨著拍成了偶像剧,演员演技渣如shit。。真是一个烂片如潮的时代)
网页链接:http://v.qq.com/x/cover/0dfpyvfa7tp0ewe.html
找到最新短评,随便复制其中的一条评论,到网页源码中查找,发现0条信息,再通过F12打开chrome的抓包工具,打开Network选项,刷新网页,发现有些内容过一段时间就会更新,由以上说明该网页使用了AJAX技术。
- AJAX介绍
AJAX即" Asynchronous JavaScript And XML",翻译过来就是异步JavaScript和XML,是一种创建交互式网页应用的开发技术。 AJAX通过在后台与服务器进行数据交换,实现网页异步更新,也就是可以在不重新加载整个网页的情况下,对网页的某部分进行更新。 它的特点是加载速度快、不刷新网页就能更新信息,网页源代码与网页内容不同,因此在源码里无法查找被更新的这部分内容,需要通过解析其json文件才可获得。
2.获取Json文件
搜了下json文件,说是后端和前端之间交互的资源文件?,就是说 它很重要(之前做一些deep learning实验,很多模型的权值参数等最终都以json文件格式保存,后来加载保存的json一直报错,所以对它可是记忆犹新了)。
在chrome的F12里的Network里,搜索关键字comment进行模糊查找(额,要一个个文件的试,通过对它们解析,看看哪个有和最新短评相关的内容),对json文件的解析通过以下code实现:
# -*- coding: utf-8 -*-
"""
Created on Fri Oct 07 08:52:58 2016
@author: Sirius
解析网页json文件,提取动态网页AJAX的url
"""
import json
import requests
head={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1'}
url='http://coral.qq.com/article/1485749985/comment?commentid=0&reqnum=10'
jscontent=requests.get(url,headers=head).content
jsDict=json.loads(jscontent)
这里的jsDict中包含了很多内容,是一个字典,如下图,它的结构大概是:jsDict---data---commentid, commentid是一个列表,列表下的值是一个字典,字典里的content就是我们需要的最新评论了~~
因此,编写这样的code来输出我们想要的评论:
# -*- coding: utf-8 -*-
"""
Created on Fri Oct 07 08:52:58 2016
@author: Sirius
解析网页json文件,提取动态网页AJAX的url
"""
import json
import requests
head={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1'}
url='http://coral.qq.com/article/1485749985/comment?commentid=0&reqnum=10'
jscontent=requests.get(url,headers=head).content
jsDict=json.loads(jscontent)
jsData=jsDict['data']
comments=jsData['commentid']
for each in comments:
print each['content']
再看看输出结果如下图:
和腾讯视频网站上的评论是一致的:
3.从资源文件json中获取url
我们已经知道了最新短评被隐藏在json文件中,并也知道怎样解析json和提取里面的信息,那么该怎样获取上述code中的url呢?
之前我们是在network下找到的这个json的链接的:
就是这个comment:
http://coral.qq.com/article/1485749985/comment?commentid=0&reqnum=10&tag=&callback=jQuery11200748446479302258_1475809825081&_=1475809825082
看看这个url,最后面的1475809825082是时间戳(时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。在python中可以通过
import time
a=time.time()
print a
获得当前的时间戳),所以我们可以把时间戳给去掉,还可以去掉一些冗余信息来简化url,只要其中的 {"targetid":1485749985,"commentnum":"101484"}
不变就可以,最终得到这样一个url:
http://coral.qq.com/article/1485749985/comment?commentid=0&reqnum=10
10代表评论条数,可以手动添加。
我们最主要的得到是1485749985,就可以构造自己想要的url了,但直接从网页源代码里是找不到1485749985这个值的,因此我们还要从某个文件中获取这个值,还是从F12的network中找这样的一个包含1485749985的文件,通过分析,发现在一个comment_id下存在这个值,这个comment_id的url为:
http://ncgi.video.qq.com/fcgi-bin/video_comment_id?otype=json&callback=jQuery191006831671877102763_1475809819093&op=3&vid=y0021yzp8ab&_=1475809819113
还是对其进行分析简化,最后得到这样一个简化版的url,里面存在1485749985这个值
http://ncgi.video.qq.com/fcgi-bin/video_comment_id?otype=json&op=3&vid=y0021yzp8ab
我们再来看看这个url,里面的vid可以在网页源代码中查找得到,因此~~~~~~~~~我们通过在网页源代码中查找vid-----再通过vid查找到comment_id下的1485749985------再通过1485749985构建url----最后得到最新短评!!!!!!
4.最终code
# -*- coding: utf-8 -*-
"""
Created on Fri Oct 07 08:52:58 2016
@author: Sirius
解析网页json文件,提取动态网页AJAX的url
"""
import json
import requests
import re
head={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1'}
#t_url='http://coral.qq.com/article/1485749985/comment?commentid=0&reqnum=10'
start_url='http://v.qq.com/x/cover/0dfpyvfa7tp0ewe/n0021zrdqeh.html'
temp_u='http://sns.video.qq.com/fcgi-bin/video_comment_id?otype=json&op=3&vid='
id_url='http://coral.qq.com/article/%s/comment?commentid=0&reqnum=10'
jsc=requests.get(start_url,headers=head).content#获取网页源码
vid=re.search('<span class="item " id="(.*?)" r-class="',jsc,re.S).group(1) #查找源码中的vid
temp_url=temp_u+vid #构建一个临时url来查找id码
kljso=requests.get(temp_url,headers=head).content
com_id=re.search('comment_id":"(.*?)",',kljso,re.S).group(1)
url_tatol=id_url%(com_id) #查找得id码与url结合,构成存放最新短评的json文件的url
print url_tatol
jscontent=requests.get(url_tatol,headers=head).content
jsDict=json.loads(jscontent)
jsData=jsDict['data']
comments=jsData['commentid']
for each in comments:
print each['content']