淺談如何使用python抓取網(wǎng)頁中的動(dòng)態(tài)數(shù)據(jù)實(shí)現(xiàn)
我們經(jīng)常會(huì)發(fā)現(xiàn)網(wǎng)頁中的許多數(shù)據(jù)并不是寫死在HTML中的,而是通過js動(dòng)態(tài)載入的。所以也就引出了什么是動(dòng)態(tài)數(shù)據(jù)的概念,動(dòng)態(tài)數(shù)據(jù)在這里指的是網(wǎng)頁中由Javascript動(dòng)態(tài)生成的頁面內(nèi)容,是在頁面加載到瀏覽器后動(dòng)態(tài)生成的,而之前并沒有的。
在編寫爬蟲進(jìn)行網(wǎng)頁數(shù)據(jù)抓取的時(shí)候,經(jīng)常會(huì)遇到這種需要?jiǎng)討B(tài)加載數(shù)據(jù)的HTML網(wǎng)頁,如果還是直接從網(wǎng)頁上抓取那么將無法獲得任何數(shù)據(jù)。
今天,我們就在這里簡單聊一聊如何用python來抓取頁面中的JS動(dòng)態(tài)加載的數(shù)據(jù)。
給出一個(gè)網(wǎng)頁:豆瓣電影排行榜,其中的所有電影信息都是動(dòng)態(tài)加載的。我們無法直接從頁面中獲得每個(gè)電影的信息。
如下圖所示,我們無法在HTML中找到對(duì)應(yīng)的電影信息。
在Chrome瀏覽器中,點(diǎn)擊F12,打開Network中的XHR,我們來抓取對(duì)應(yīng)的js文件來進(jìn)行解析。如下圖:
在豆瓣頁面向下拖拽,使得頁面加載入更多的電影信息,從而我們可以抓取對(duì)應(yīng)的報(bào)文。
我們可以看到它采用的是AJAX異步請(qǐng)求。通過在后臺(tái)與服務(wù)器進(jìn)行少量數(shù)據(jù)交換,AJAX 可以使網(wǎng)頁實(shí)現(xiàn)異步更新。因此就可以在不重新加載整個(gè)網(wǎng)頁的情況下,對(duì)網(wǎng)頁的某部分進(jìn)行更新,從而實(shí)現(xiàn)數(shù)據(jù)的動(dòng)態(tài)載入。
我們可以看到,通過GET,我們得到的response之中包含了所對(duì)應(yīng)的電影相關(guān)信息,它們以JSON的格式保存在一起。
查看一下RequestURL信息,我們可以發(fā)現(xiàn)在action參數(shù)之后又跟了兩個(gè)參數(shù)"start"和"limit",很顯然它們的意思是:"從某個(gè)位置開始返回的電影的個(gè)數(shù)"。
如果想快速獲取相關(guān)的電影信息,就可以直接把這個(gè)URL復(fù)制進(jìn)地址欄,修改你所需要的start和limit參數(shù)值,將得到對(duì)應(yīng)的結(jié)果進(jìn)行抓取即可。
但是這樣顯得很不自動(dòng)化,而且很多其他網(wǎng)站的RequestURL并不給的這么直接,所以我們接下來用python進(jìn)行進(jìn)一步的操作來獲取這個(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è)诖颂幮枰晕⒆⒁庖幌?,將verify置為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":["美國"],"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)頁中的動(dòng)態(tài)數(shù)據(jù)實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)python抓取網(wǎng)頁動(dòng)態(tài)數(shù)據(jù) 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 一文教你Python如何快速精準(zhǔn)抓取網(wǎng)頁數(shù)據(jù)
- 利用Python抓取網(wǎng)頁數(shù)據(jù)的多種方式與示例詳解
- Python使用BeautifulSoup和Scrapy抓取網(wǎng)頁數(shù)據(jù)的具體教程
- Python使用BeautifulSoup抓取和解析網(wǎng)頁數(shù)據(jù)的操作方法
- Python爬蟲之使用BeautifulSoup和Requests抓取網(wǎng)頁數(shù)據(jù)
- Python獲取網(wǎng)頁數(shù)據(jù)的五種方法
- Python實(shí)現(xiàn)快速抓取網(wǎng)頁數(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-02Django ManyToManyField 跨越中間表查詢的方法
今天小編就為大家分享一篇Django ManyToManyField 跨越中間表查詢的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12詳解python之多進(jìn)程和進(jìn)程池(Processing庫)
本篇文章主要介紹了詳解python之多進(jìn)程和進(jìn)程池(Processing庫),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-06-06pygame實(shí)現(xiàn)井字棋之第一步繪制九宮格
這篇文章主要介紹了pygame實(shí)現(xiàn)井字棋之第一步繪制九宮格,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-05-05python celery beat實(shí)現(xiàn)定時(shí)任務(wù)的示例代碼
在日常工作中,我們常常會(huì)用到需要周期性執(zhí)行的任務(wù),本文主要介紹了python celery beat實(shí)現(xiàn)定時(shí)任務(wù)的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03