這次以騰訊視頻的《青云志》的最新短評(píng)作為抓取目標(biāo)(ps:不得不吐槽這爛片,好好的神魔巨著拍成了偶像劇,演員演技渣如shit。。真是一個(gè)爛片如潮的時(shí)代)
網(wǎng)頁(yè)鏈接:http://v.qq.com/x/cover/0dfpyvfa7tp0ewe.html
找到最新短評(píng),隨便復(fù)制其中的一條評(píng)論,到網(wǎng)頁(yè)源碼中查找,發(fā)現(xiàn)0條信息,再通過(guò)F12打開(kāi)chrome的抓包工具,打開(kāi)Network選項(xiàng),刷新網(wǎng)頁(yè),發(fā)現(xiàn)有些內(nèi)容過(guò)一段時(shí)間就會(huì)更新,由以上說(shuō)明該網(wǎng)頁(yè)使用了AJAX技術(shù)。
- AJAX介紹
AJAX即" Asynchronous JavaScript And XML",翻譯過(guò)來(lái)就是異步JavaScript和XML,是一種創(chuàng)建交互式網(wǎng)頁(yè)應(yīng)用的開(kāi)發(fā)技術(shù)。 AJAX通過(guò)在后臺(tái)與服務(wù)器進(jìn)行數(shù)據(jù)交換,實(shí)現(xiàn)網(wǎng)頁(yè)異步更新,也就是可以在不重新加載整個(gè)網(wǎng)頁(yè)的情況下,對(duì)網(wǎng)頁(yè)的某部分進(jìn)行更新。 它的特點(diǎn)是加載速度快、不刷新網(wǎng)頁(yè)就能更新信息,網(wǎng)頁(yè)源代碼與網(wǎng)頁(yè)內(nèi)容不同,因此在源碼里無(wú)法查找被更新的這部分內(nèi)容,需要通過(guò)解析其json文件才可獲得。
2.獲取Json文件
搜了下json文件,說(shuō)是后端和前端之間交互的資源文件?,就是說(shuō) 它很重要(之前做一些deep learning實(shí)驗(yàn),很多模型的權(quán)值參數(shù)等最終都以json文件格式保存,后來(lái)加載保存的json一直報(bào)錯(cuò),所以對(duì)它可是記憶猶新了)。
在chrome的F12里的Network里,搜索關(guān)鍵字comment進(jìn)行模糊查找(額,要一個(gè)個(gè)文件的試,通過(guò)對(duì)它們解析,看看哪個(gè)有和最新短評(píng)相關(guān)的內(nèi)容),對(duì)json文件的解析通過(guò)以下code實(shí)現(xiàn):
# -*- coding: utf-8 -*-
"""
Created on Fri Oct 07 08:52:58 2016
@author: Sirius
解析網(wǎng)頁(yè)json文件,提取動(dòng)態(tài)網(wǎng)頁(yè)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中包含了很多內(nèi)容,是一個(gè)字典,如下圖,它的結(jié)構(gòu)大概是:jsDict---data---commentid, commentid是一個(gè)列表,列表下的值是一個(gè)字典,字典里的content就是我們需要的最新評(píng)論了~~

因此,編寫(xiě)這樣的code來(lái)輸出我們想要的評(píng)論:
# -*- coding: utf-8 -*-
"""
Created on Fri Oct 07 08:52:58 2016
@author: Sirius
解析網(wǎng)頁(yè)json文件,提取動(dòng)態(tài)網(wǎng)頁(yè)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']
再看看輸出結(jié)果如下圖:

和騰訊視頻網(wǎng)站上的評(píng)論是一致的:

3.從資源文件json中獲取url
我們已經(jīng)知道了最新短評(píng)被隱藏在json文件中,并也知道怎樣解析json和提取里面的信息,那么該怎樣獲取上述code中的url呢?
之前我們是在network下找到的這個(gè)json的鏈接的:

就是這個(gè)comment:
http://coral.qq.com/article/1485749985/comment?commentid=0&reqnum=10&tag=&callback=jQuery11200748446479302258_1475809825081&_=1475809825082
看看這個(gè)url,最后面的1475809825082是時(shí)間戳(時(shí)間戳是指格林威治時(shí)間1970年01月01日00時(shí)00分00秒(北京時(shí)間1970年01月01日08時(shí)00分00秒)起至現(xiàn)在的總秒數(shù)。在python中可以通過(guò)
import time
a=time.time()
print a
獲得當(dāng)前的時(shí)間戳),所以我們可以把時(shí)間戳給去掉,還可以去掉一些冗余信息來(lái)簡(jiǎn)化url,只要其中的 {"targetid":1485749985,"commentnum":"101484"}
不變就可以,最終得到這樣一個(gè)url:
http://coral.qq.com/article/1485749985/comment?commentid=0&reqnum=10
10代表評(píng)論條數(shù),可以手動(dòng)添加。
我們最主要的得到是1485749985,就可以構(gòu)造自己想要的url了,但直接從網(wǎng)頁(yè)源代碼里是找不到1485749985這個(gè)值的,因此我們還要從某個(gè)文件中獲取這個(gè)值,還是從F12的network中找這樣的一個(gè)包含1485749985的文件,通過(guò)分析,發(fā)現(xiàn)在一個(gè)comment_id下存在這個(gè)值,這個(gè)comment_id的url為:
http://ncgi.video.qq.com/fcgi-bin/video_comment_id?otype=json&callback=jQuery191006831671877102763_1475809819093&op=3&vid=y0021yzp8ab&_=1475809819113

還是對(duì)其進(jìn)行分析簡(jiǎn)化,最后得到這樣一個(gè)簡(jiǎn)化版的url,里面存在1485749985這個(gè)值
http://ncgi.video.qq.com/fcgi-bin/video_comment_id?otype=json&op=3&vid=y0021yzp8ab
我們?cè)賮?lái)看看這個(gè)url,里面的vid可以在網(wǎng)頁(yè)源代碼中查找得到,因此~~~~~~~~~我們通過(guò)在網(wǎng)頁(yè)源代碼中查找vid-----再通過(guò)vid查找到comment_id下的1485749985------再通過(guò)1485749985構(gòu)建url----最后得到最新短評(píng)?。。。。?!
4.最終code
# -*- coding: utf-8 -*-
"""
Created on Fri Oct 07 08:52:58 2016
@author: Sirius
解析網(wǎng)頁(yè)json文件,提取動(dòng)態(tài)網(wǎng)頁(yè)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#獲取網(wǎng)頁(yè)源碼
vid=re.search('<span class="item " id="(.*?)" r-class="',jsc,re.S).group(1) #查找源碼中的vid
temp_url=temp_u+vid #構(gòu)建一個(gè)臨時(shí)url來(lái)查找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結(jié)合,構(gòu)成存放最新短評(píng)的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']