python使用spynner抓取動態頁面資料

2021-06-28 05:46:33 字數 2921 閱讀 1057

這篇文章是我最近一直想完成的一篇文章,因為之前做的爬蟲只能爬取靜態頁面的資料,但是現在這個時代,大部分的web頁面都是動態的,經常逛的**例如京東、**等,商品列表都是js獲取到後台資料後再組合成html展示出來的,單純獲取頁面資料回來,而沒有執行到js的話是無法看到商品資料列表資訊的,這個可以通過兩步來驗證:在頁面上右鍵檢視源**,和右鍵審查元素所看到的html**是不一樣的,如果後者中能看到商品資料資訊,而前者沒有的話,就說明這個頁面是動態生成的。

以前在做爬蟲的時候也找到了其他的方案,例如網上說到的使用selenium來完成js的解析,簡單來說,selenium其實就是通過呼叫本地的瀏覽器來完成js的解析,然後通過selenium服務問瀏覽器拿解析完成後的html**。這個方案的效率比較低,並且依賴於本地的瀏覽器。

昨天上網找的時候,網路上的乙個說法是使用spynner來實現,並且看起來還是挺穩定的樣子。spynner主要是對pyqt的webkit封裝,能夠完成頁面的js解析,並獲取到解析完成後的html**。

而對於html的解析就使用到了beautifulsoup這個庫,這是乙個專門解析html的庫,使用起來也是挺方便的。

下面開始說一下本文抓取動態頁面資料的相關工具和庫:

1. python 2.7

2. pyqt

4. beautifulsoup

5. ide工具是pycharm(當然這個只是個人喜好,也可以使用其他的ide工具)

下面使用乙個具體是例子來說明一下spynner和beautifulsoup的使用,我們就以爬取京東頁面上的一些產品資料來說明如何爬取動態頁面資料(當然,如果我們過於頻繁的爬京東,估計還是有可能被京東將我們ip拉黑的)。

我們爬取京東中「筆記本」頁面的資訊,url位址為

下面是具體**

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

#ecoding: utf-8

importspynner

importpyquery

importtime

importbeautifulsoup

browser=spynner.browser()

browser.create_webview()

browser.set_html_parser(pyquery.pyquery)

browser.load("",20)

try:

browser.wait_load(10)

except:

pass

string=browser.html

browser.close()

soup=beautifulsoup.beautifulsoup(string)

time.sleep(2)

tags1=soup.findall('div', )

fortagintags1:

printtag.contents[2].contents[1]['id'], tag.contents[2].contents[0].text,"  ", tag.contents[1].contents[0].contents[0]

上面的**都不負責,基本的流程是建立乙個browser,開啟指定url,等待載入完成後,讀取browser中的html進行解析,然後獲取指定div節點列表,再通過乙個for迴圈來遍歷所有筆記本的資訊並列印出來,下面再貼上一幅圖:

安裝Spynner依賴庫記錄

重灌系統總是煩 python可用 spynner庫 作為模擬瀏覽器,但是安裝起來相當煩,在此記錄下需要安裝的庫 sudo easy install spynner 在安裝autopy時出問題了 autopy需要了很x11的檔案 sudo apt get install libx11 dev mesa...

64位win10下spynner安裝小結

看了很多網上安裝介紹,結果反而因為各種原因多走了不少彎路。血的教訓,長點心眼,以後找安裝攻略一定要記得看看發帖時間 安裝spynner之前首先需要安裝pyqt4,windows下可以在官網直接下最新gpl協議的pyqt4 4.11.4 gpl py2.7 qt4.8.7 x64.exe,裡面包含了所...

python元類的使用 python使用元類

原文 type 動態語言和靜態語言最大的不同,就是函式和類的定義,不是編譯時定義的,而是執行時動態建立的。比方說我們要定義乙個hello的class,就寫乙個hello.py模組 當python直譯器載入hello模組時,就會依次執行該模組的所有語句,執行結果就是動態建立出乙個hello的class...