python實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁(yè)信息抓取

這次以騰訊視頻的《青云志》的最新短評(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ù)。

  1. 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)論了~~

Paste_Image.png

因此,編寫(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é)果如下圖:

Paste_Image.png

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

Paste_Image.png

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

Paste_Image.png

就是這個(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

Paste_Image.png

還是對(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']

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容