python实现动态网页_python实现动态网页信息抓取

这次以腾讯视频的《青云志》的最新短评作为抓取目标(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就是我们需要的最新评论了~~

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

import time

a=time.time()

print a

获得当前的时间戳),所以我们可以把时间戳给去掉,还可以去掉一些冗余信息来简化url,只要其中的 {"targetid":1485749985,"commentnum":"101484"}

不变就可以,最终得到这样一个url:

我们最主要的得到是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,里面的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('

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']

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值