Python 爬蟲如何擷取 JS 產生的 URL 和網頁內容?

來源:互聯網
上載者:User
想嘗試爬下北郵人的論壇,但是看到頁面的原始碼都是js,幾乎沒有我想要的資訊。

回複內容:

今天偶然發現了PyV8這個東西,感覺就是你想要的。
它直接搭建了一個js運行環境,這意味著你可以直接在python裡面執行頁面上的js代碼來擷取你需要的內容。
參考:
http://www.silverna.org/blog/?p=252
https://code.google.com/p/pyv8/ 我是直接看js源碼,分析完,然後爬的。
例如看頁面是用Ajax請求一個JSON檔案,我就先爬那個頁面,擷取Ajax所需的參數,然後直接請求JSON頁,然後解碼,再處理資料併入庫。
如果你直接運行頁面上所有js(就像瀏覽器做的那樣),然後擷取最終的HTML DOM樹,這樣的效能非常地糟糕,不建議使用這樣的方法。因為Python和js效能本身都很差,如果這樣做,會消耗大量CPU資源並且最終只能獲得極低的抓取效率。 js代碼是需要js引擎啟動並執行,Python只能通過HTTP請求擷取到HTML、CSS、JS原始代碼而已。
不知道有沒有用Python編寫的JS引擎,估計需求不大。
我一般用PhantomJS 、CasperJS 這些引擎來做瀏覽器抓取。
直接在其中寫JS代碼來做DOM操控、分析,以檔案方式輸出結果。
讓Python去調用該程式,通過讀檔案方式獲得內容。去年還真爬過這樣的資料,因為趕時間,我的方法就比較醜陋了。

PyQt有一個具體的庫來類比瀏覽器請求和行為(好像是webkit,忘記了,查一下就好。使用時就幾行代碼就夠了),在一次運行程式中,第一次(只有第一次)的返回結果是js運行之後的代碼。於是寫了一個py指令碼做一次訪問解析,然後再寫了windows指令碼通過傳遞命令列參數迴圈這個py指令碼,最後搞到資料。

方法dirty了些,不過資料拿到了就好~針對某網站的,可以自己看網路請求找到返回實際內容的那些有針對性地發。如果是通用的,得用 headless browser 了,比如 PhantomJS。又一個爬北郵人論壇的。。

文藝的方法,上瀏覽器引擎,比如 PhantomJS ,用它匯出 html,再對html用 python 解析。千萬別直接 PhantomJS 解析,雖然我知道這很容易,為什嗎?那就不叫 python 爬蟲了啊 因為統一使用 python 做解析更統一,這裡假設你還在爬取非 JS 頁面。

普通的方法,分析 AJAX 請求。即使它是 JS 渲染的,資料還是通過 HTTP 協議傳輸的。什嗎?你類比不出來?去讀一遍HTTP協議,其實還是經驗,比如北郵人論壇請求本文時需要
X-Requested-With:XMLHttpRequest
這裡舉個栗子:
拉勾網的職位列表





點擊了Android之後 我們從瀏覽器上傳了幾個參數到拉勾的伺服器
一個是 first =true, 一個是kd = android, (關鍵字) 一個是pn =1 (page number 頁碼)

所以我們就可以模仿這一個步驟來構造一個資料包來類比使用者的點擊動作。

post_data = {'first':'true','kd':'Android','pn':'1'}
雖然這是一個很久以前的問題,題主似乎也已經解決的這個問題。但是看到好多答案的辦法有點太重了,這裡分享一個效率更優、資源佔用更低的方法。由於題主並沒有指明需要什麼,這裡的樣本取首頁所有文章的連結和標題。

首先請一定記住,瀏覽器環境對記憶體和CPU的消耗都非常嚴重, 類比瀏覽器環境的 爬蟲代碼要儘可能避免。請記住,對於一些前端渲染的網頁,雖然在HTML源碼中看不到我們需要的資料,但是更大的可能是它會通過另一個請求拿到純資料(很大可能以JSON格式存在),我們不但不需要類比瀏覽器,反而可以省去解析HTML的消耗。

然後,開啟北郵人論壇的首頁,發現它的首頁HTML源碼中確實沒有頁面所顯示文章的內容,那麼,很可能這是通過JS非同步載入到頁面的。通過瀏覽器開發工具(Chrome瀏覽器在OS X下通過command+option+i或Win/Linux下通過F12)分析在載入首頁的時候請求,容易發現,如下中的請求:
中選中的請求得到的response即是首頁的文章連結,在preview選項中可以看到渲染後的預覽圖:中選中的請求得到的response即是首頁的文章連結,在preview選項中可以看到渲染後的預覽圖:
至此,我們確定這個連結可以拿到首頁的文章及連結。至此,我們確定這個連結可以拿到首頁的文章及連結。

在headers選項中,有這次請求的要求標頭及請求參數,我們通過Python類比這次請求,即可拿到相同的響應。再配合BeautifulSoup等庫解析HTML,即可得到相應的內容了。

對於如何類比請求和如何解析HTML,請移步我的專欄,有詳細的介紹,這裡便不再贅述。

通過這樣的方式可以不用類比瀏覽器環境來抓取資料,對記憶體和CPU消耗、抓取速度都有很大的提升。在編寫爬蟲的時候,請務必記得,如非必要,不要類比瀏覽器環境。如果是在windows下,可以嘗試調用windows系統中的webbrowser控制項。另外ie本身也提供了介面。不過這兩種方式都要渲染頁面,效能上多少有點浪費,為了加快速度可以把ie的圖片下載顯示關閉掉,然後通過click等方法來類比真實行為。Google Phantom JS
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.