淺談如何使用python抓取網(wǎng)頁(yè)中的動(dòng)態(tài)數(shù)據(jù)實(shí)現(xiàn)
我們經(jīng)常會(huì)發(fā)現(xiàn)網(wǎng)頁(yè)中的許多數(shù)據(jù)并不是寫死在HTML中的,而是通過(guò)js動(dòng)態(tài)載入的。所以也就引出了什么是動(dòng)態(tài)數(shù)據(jù)的概念,動(dòng)態(tài)數(shù)據(jù)在這里指的是網(wǎng)頁(yè)中由Javascript動(dòng)態(tài)生成的頁(yè)面內(nèi)容,是在頁(yè)面加載到瀏覽器后動(dòng)態(tài)生成的,而之前并沒(méi)有的。
在編寫爬蟲進(jìn)行網(wǎng)頁(yè)數(shù)據(jù)抓取的時(shí)候,經(jīng)常會(huì)遇到這種需要?jiǎng)討B(tài)加載數(shù)據(jù)的HTML網(wǎng)頁(yè),如果還是直接從網(wǎng)頁(yè)上抓取那么將無(wú)法獲得任何數(shù)據(jù)。
今天,我們就在這里簡(jiǎn)單聊一聊如何用python來(lái)抓取頁(yè)面中的JS動(dòng)態(tài)加載的數(shù)據(jù)。
給出一個(gè)網(wǎng)頁(yè):豆瓣電影排行榜,其中的所有電影信息都是動(dòng)態(tài)加載的。我們無(wú)法直接從頁(yè)面中獲得每個(gè)電影的信息。
如下圖所示,我們無(wú)法在HTML中找到對(duì)應(yīng)的電影信息。


在Chrome瀏覽器中,點(diǎn)擊F12,打開(kāi)Network中的XHR,我們來(lái)抓取對(duì)應(yīng)的js文件來(lái)進(jìn)行解析。如下圖:

在豆瓣頁(yè)面向下拖拽,使得頁(yè)面加載入更多的電影信息,從而我們可以抓取對(duì)應(yīng)的報(bào)文。
我們可以看到它采用的是AJAX異步請(qǐng)求。通過(guò)在后臺(tái)與服務(wù)器進(jìn)行少量數(shù)據(jù)交換,AJAX 可以使網(wǎng)頁(yè)實(shí)現(xiàn)異步更新。因此就可以在不重新加載整個(gè)網(wǎng)頁(yè)的情況下,對(duì)網(wǎng)頁(yè)的某部分進(jìn)行更新,從而實(shí)現(xiàn)數(shù)據(jù)的動(dòng)態(tài)載入。

我們可以看到,通過(guò)GET,我們得到的response之中包含了所對(duì)應(yīng)的電影相關(guān)信息,它們以JSON的格式保存在一起。

查看一下RequestURL信息,我們可以發(fā)現(xiàn)在action參數(shù)之后又跟了兩個(gè)參數(shù)"start"和"limit",很顯然它們的意思是:"從某個(gè)位置開(kāi)始返回的電影的個(gè)數(shù)"。
如果想快速獲取相關(guān)的電影信息,就可以直接把這個(gè)URL復(fù)制進(jìn)地址欄,修改你所需要的start和limit參數(shù)值,將得到對(duì)應(yīng)的結(jié)果進(jìn)行抓取即可。
但是這樣顯得很不自動(dòng)化,而且很多其他網(wǎng)站的RequestURL并不給的這么直接,所以我們接下來(lái)用python進(jìn)行進(jìn)一步的操作來(lái)獲取這個(gè)返回的報(bào)文信息。
#coding:utf-8
import urllib
import requests
post_param = {'action':'','start':'0','limit':'1'}
return_data = requests.get("https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90",data =post_param, verify = False)
print return_data.text
因?yàn)槎拱晔莌ttps的,所以我們?cè)诖颂幮枰晕⒆⒁庖幌拢瑢erify置為False表示不需要驗(yàn)證SSL證書。
我們可以發(fā)現(xiàn)打印出的結(jié)果中就是對(duì)應(yīng)的JSON文件,下一步的解析和操作在這里就不贅述了。
[{"rating":["9.6","50"],"rank":1,"cover_url":"https://img3.doubanio.com\/view\/movie_poster_cover\/mpst\/public\/p480747492.jpg","is_playable":true,"id":"1292052","types":["犯罪","劇情"],"regions":["美國(guó)"],"title":"肖申克的救贖","url":"https:\/\/movie.douban.com\/subject\/1292052\/","release_date":"1994-09-10","actor_count":15,"vote_count":713205,"score":"9.6","actors":["蒂姆·羅賓斯","摩根·弗里曼","鮑勃·岡頓","威廉姆·賽德勒","克蘭西·布朗","吉爾·貝羅斯","馬克·羅斯頓","詹姆斯·惠特摩","杰弗里·德曼","拉里·布蘭登伯格","尼爾·吉恩托利","布賴恩·利比","大衛(wèi)·普羅瓦爾","約瑟夫·勞格諾","祖德·塞克利拉"],"is_watched":false}]
到此這篇關(guān)于淺談如何使用python抓取網(wǎng)頁(yè)中的動(dòng)態(tài)數(shù)據(jù)實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)python抓取網(wǎng)頁(yè)動(dòng)態(tài)數(shù)據(jù) 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 一文教你Python如何快速精準(zhǔn)抓取網(wǎng)頁(yè)數(shù)據(jù)
- 利用Python抓取網(wǎng)頁(yè)數(shù)據(jù)的多種方式與示例詳解
- Python使用BeautifulSoup和Scrapy抓取網(wǎng)頁(yè)數(shù)據(jù)的具體教程
- Python使用BeautifulSoup抓取和解析網(wǎng)頁(yè)數(shù)據(jù)的操作方法
- Python爬蟲之使用BeautifulSoup和Requests抓取網(wǎng)頁(yè)數(shù)據(jù)
- Python獲取網(wǎng)頁(yè)數(shù)據(jù)的五種方法
- Python實(shí)現(xiàn)快速抓取網(wǎng)頁(yè)數(shù)據(jù)的5種高效方法
相關(guān)文章
MacOS安裝python報(bào)錯(cuò)"zsh:?command?not?found:python"的
這篇文章主要給大家介紹了關(guān)于MacOS安裝python報(bào)錯(cuò)"zsh:?command?not?found:python"的解決方法,文中將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
Django ManyToManyField 跨越中間表查詢的方法
今天小編就為大家分享一篇Django ManyToManyField 跨越中間表查詢的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
詳解python之多進(jìn)程和進(jìn)程池(Processing庫(kù))
本篇文章主要介紹了詳解python之多進(jìn)程和進(jìn)程池(Processing庫(kù)),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-06-06
pygame實(shí)現(xiàn)井字棋之第一步繪制九宮格
這篇文章主要介紹了pygame實(shí)現(xiàn)井字棋之第一步繪制九宮格,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-05-05
通過(guò)Python來(lái)使用七牛云存儲(chǔ)的方法詳解
這篇文章主要介紹了通過(guò)Python來(lái)使用七牛云存儲(chǔ)的方法詳解,七牛云存儲(chǔ)是國(guó)內(nèi)領(lǐng)先的服務(wù)器數(shù)據(jù)備份解決方案商,需要的朋友可以參考下2015-08-08
python celery beat實(shí)現(xiàn)定時(shí)任務(wù)的示例代碼
在日常工作中,我們常常會(huì)用到需要周期性執(zhí)行的任務(wù),本文主要介紹了python celery beat實(shí)現(xiàn)定時(shí)任務(wù)的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03

