python实现动态网页信息抓取

这次以腾讯视频的《青云志》的最新短评作为抓取目标(ps:不得不吐槽这烂片,好好的神魔巨著拍成了偶像剧,演员演技渣如shit。。真是一个烂片如潮的时代)
网页链接:http://v.qq.com/x/cover/0dfpyvfa7tp0ewe.html

找到最新短评,随便复制其中的一条评论,到网页源码中查找,发现0条信息,再通过F12打开chrome的抓包工具,打开Network选项,刷新网页,发现有些内容过一段时间就会更新,由以上说明该网页使用了AJAX技术。

  1. 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就是我们需要的最新评论了~~

Paste_Image.png

因此,编写这样的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']

再看看输出结果如下图:

Paste_Image.png

和腾讯视频网站上的评论是一致的:

Paste_Image.png

3.从资源文件json中获取url
我们已经知道了最新短评被隐藏在json文件中,并也知道怎样解析json和提取里面的信息,那么该怎样获取上述code中的url呢?
之前我们是在network下找到的这个json的链接的:

Paste_Image.png

就是这个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

Paste_Image.png

还是对其进行分析简化,最后得到这样一个简化版的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']

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容