淺談如何使用python抓取網(wǎng)頁中的動態(tài)數(shù)據(jù)實現(xiàn)
我們經(jīng)常會發(fā)現(xiàn)網(wǎng)頁中的許多數(shù)據(jù)并不是寫死在HTML中的,而是通過js動態(tài)載入的。所以也就引出了什么是動態(tài)數(shù)據(jù)的概念,動態(tài)數(shù)據(jù)在這里指的是網(wǎng)頁中由Javascript動態(tài)生成的頁面內(nèi)容,是在頁面加載到瀏覽器后動態(tài)生成的,而之前并沒有的。
在編寫爬蟲進行網(wǎng)頁數(shù)據(jù)抓取的時候,經(jīng)常會遇到這種需要動態(tài)加載數(shù)據(jù)的HTML網(wǎng)頁,如果還是直接從網(wǎng)頁上抓取那么將無法獲得任何數(shù)據(jù)。
今天,我們就在這里簡單聊一聊如何用python來抓取頁面中的JS動態(tài)加載的數(shù)據(jù)。
給出一個網(wǎng)頁:豆瓣電影排行榜,其中的所有電影信息都是動態(tài)加載的。我們無法直接從頁面中獲得每個電影的信息。
如下圖所示,我們無法在HTML中找到對應的電影信息。
在Chrome瀏覽器中,點擊F12,打開Network中的XHR,我們來抓取對應的js文件來進行解析。如下圖:
在豆瓣頁面向下拖拽,使得頁面加載入更多的電影信息,從而我們可以抓取對應的報文。
我們可以看到它采用的是AJAX異步請求。通過在后臺與服務器進行少量數(shù)據(jù)交換,AJAX 可以使網(wǎng)頁實現(xiàn)異步更新。因此就可以在不重新加載整個網(wǎng)頁的情況下,對網(wǎng)頁的某部分進行更新,從而實現(xiàn)數(shù)據(jù)的動態(tài)載入。
我們可以看到,通過GET,我們得到的response之中包含了所對應的電影相關(guān)信息,它們以JSON的格式保存在一起。
查看一下RequestURL信息,我們可以發(fā)現(xiàn)在action參數(shù)之后又跟了兩個參數(shù)"start"和"limit",很顯然它們的意思是:"從某個位置開始返回的電影的個數(shù)"。
如果想快速獲取相關(guān)的電影信息,就可以直接把這個URL復制進地址欄,修改你所需要的start和limit參數(shù)值,將得到對應的結(jié)果進行抓取即可。
但是這樣顯得很不自動化,而且很多其他網(wǎng)站的RequestURL并不給的這么直接,所以我們接下來用python進行進一步的操作來獲取這個返回的報文信息。
#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
因為豆瓣是https的,所以我們在此處需要稍微注意一下,將verify置為False表示不需要驗證SSL證書。
我們可以發(fā)現(xiàn)打印出的結(jié)果中就是對應的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)頁中的動態(tài)數(shù)據(jù)實現(xiàn)的文章就介紹到這了,更多相關(guān)python抓取網(wǎng)頁動態(tài)數(shù)據(jù) 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 一文教你Python如何快速精準抓取網(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實現(xiàn)快速抓取網(wǎng)頁數(shù)據(jù)的5種高效方法
相關(guān)文章
MacOS安裝python報錯"zsh:?command?not?found:python"的
這篇文章主要給大家介紹了關(guān)于MacOS安裝python報錯"zsh:?command?not?found:python"的解決方法,文中將解決的辦法介紹的非常詳細,需要的朋友可以參考下2023-02-02Django ManyToManyField 跨越中間表查詢的方法
今天小編就為大家分享一篇Django ManyToManyField 跨越中間表查詢的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12python celery beat實現(xiàn)定時任務的示例代碼
在日常工作中,我們常常會用到需要周期性執(zhí)行的任務,本文主要介紹了python celery beat實現(xiàn)定時任務的示例代碼,具有一定的參考價值,感興趣的可以了解一下2024-03-03