淺談如何使用python抓取網頁中的動態數據


https://www.cnblogs.com/saintlas/p/5740241.html

 

"

瀏覽器中顯示的內容,和通過右鍵看到的網頁源碼不一樣?

右鍵—— 查看源碼
得到的HTML並不包含ajax異步加載的內容

查看原文件只是看到的網頁初始狀態,但實際上網頁在加載完成后可能立即就會執行 js 改變了初始狀態。現在的網頁不同於傳統的動態網頁,能在不刷新網頁的前提下改變網頁局部的數據,這一切都是通過 js 和服務器交互進行的。這就好比你一個程序,用對話框編輯器設計了一個界面,但是在實際運行中,你要在其中加載數據,改變控件狀態,甚至新建控件、銷毀控件、或者隱藏現有控件,對話框的外觀自然會有所變化。

 "

 

 

我們經常會發現網頁中的許多數據並不是寫死在HTML中的,而是通過js動態載入的。所以也就引出了什么是動態數據的概念, 動態數據在這里指的是網頁中由Javascript動態生成的頁面內容,是在頁面加載到瀏覽器后動態生成的,而之前並沒有的。

在編寫爬蟲進行網頁數據抓取的時候,經常會遇到這種需要動態加載數據的HTML網頁,如果還是直接從網頁上抓取那么將無法獲得任何數據。

今天,我們就在這里簡單聊一聊如何用python來抓取頁面中的JS動態加載的數據。

給出一個網頁:豆瓣電影排行榜,其中的所有電影信息都是動態加載的。我們無法直接從頁面中獲得每個電影的信息。

如下圖所示,我們無法在HTML中找到對應的電影信息。

在Chrome瀏覽器中,點擊F12,打開Network中的XHR,我們來抓取對應的js文件來進行解析。如下圖:

在豆瓣頁面向下拖拽,使得頁面加載入更多的電影信息,從而我們可以抓取對應的報文。

我們可以看到它采用的是AJAX異步請求。通過在后台與服務器進行少量數據交換,AJAX 可以使網頁實現異步更新。因此就可以在不重新加載整個網頁的情況下,對網頁的某部分進行更新,從而實現數據的動態載入。

我們可以看到,通過GET,我們得到的response之中包含了所對應的電影相關信息,它們以JSON的格式保存在一起。

查看一下RequestURL信息,我們可以發現在action參數之后又跟了兩個參數"start"和"limit",很顯然它們的意思是:"從某個位置開始返回的電影的個數"。

如果想快速獲取相關的電影信息,就可以直接把這個URL復制進地址欄,修改你所需要的start和limit參數值,將得到對應的結果進行抓取即可。

但是這樣顯得很不自動化,而且很多其他網站的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證書。

我們可以發現打印出的結果中就是對應的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":["蒂姆·羅賓斯","摩根·弗里曼","鮑勃·岡頓","威廉姆·賽德勒","克蘭西·布朗","吉爾·貝羅斯","馬克·羅斯頓","詹姆斯·惠特摩","傑弗里·德曼","拉里·布蘭登伯格","尼爾·吉恩托利","布賴恩·利比","大衛·普羅瓦爾","約瑟夫·勞格諾","祖德·塞克利拉"],"is_watched":false}]
復制代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM