python抓取頁面
㈠ 如何用python抓取動態頁面信息
很早之前,學習Python web編程的時候,就涉及一個Python的urllib。可以用urllib.urlopen("url").read()可以輕松讀取頁面上面的靜態信息。但是,隨著時代的發展,也來越多的網頁中更多的使用javascript、jQuery、PHP等語言動態生成頁面信息。因此,用urllib再去抓取頁面HTML就不足以達到我們想要的效果。
解決思路:
有一個思路最為簡單的思路可以動態解析頁面信息。urllib不可以解析動態信息,但是瀏覽器可以。在瀏覽器上展現處理的信息其實是處理好的HTML文檔。這為我們抓取動態頁面信息提供了很好的思路。在Python中有一個很有名的圖形庫——PyQt。PyQt雖然是圖形庫,但是他裡面 QtWebkit。這個很實用。谷歌的Chrome和蘋果的Safari都是基於WebKit內核開發的,所以我們可以通過PyQt中得QtWebKit 把頁面中的信息讀取載入到HTML文檔中,再解析HTML文檔,從HTML文檔中提取我們想用得信息。
作者本人實用Mac OS X。應該在Windows和Linux平台也可以採用相同的辦法。
1、Qt4 library
Library,而不是Creator。Library在Mac的默認安裝路徑下,應該是/home/username/Developor/,不要改變Qt4的默認安裝路徑。否則可能安裝失敗。
官方網址:http://qt-project.org/downloads2、SIP、PyQt4
這兩個軟體可以在在PyQt的官網找到。下載的是它的源碼。Mac和Linux需要自己編譯。
下載地址是:http://www.riverbankcomputing.co.uk/software/pyqt/download
在終端切換到文件解壓後的目錄中。
在終端中輸入
python configure.py
make
sudo make install
進行安裝編譯。
SIP和PyQt4兩個安裝方法相同。但是PyQt4依賴SIP。所以先安裝SIP再安裝PyQt41、2兩步完成之後,Python的PyQt4的模塊就安裝好了。在Python shell中輸入import PyQt4看看能不能找到PyQt4的模塊。3、Spynner
spynner是一個QtWebKit的客戶端,它可以模擬瀏覽器,完成載入頁面、引發事件、填寫表單等操作。
這個模塊可以在Python的官網找到。
下載地址: https://pypi.python.org/pypi/spynner/2.5
解壓後,cd到安裝目錄,然後輸入sudo python configure.py install安裝該模塊。
這樣Spynner模塊就安裝完成了,在python shell中試試import spynner看看該模塊有沒有安裝完成。回到頂部
Spynner的簡單使用
Spynner的功能十分強大,但是由於本人能力有限,就介紹一下如何顯示網頁的源碼吧。
#! /usr/bin/python
#-*-coding: utf-8 -*-
import spynner
browser = spynner.Browser()
#創建一個瀏覽器對象
browser.hide()
#打開瀏覽器,並隱藏。
browser.load("http://www..com")
#browser 類中有一個類方法load,可以用webkit載入你想載入的頁面信息。
#load(是你想要載入的網址的字元串形式)
print browser.html.encode("utf-8")
#browser 類中有一個成員是html,是頁面進過處理後的源碼的字元串.
#將其轉碼為UTF-8編碼
open("Test.html", 'w+').write(browser.html.encode("utf-8"))
#你也可以將它寫到文件中,用瀏覽器打開。
browser.close()
#關閉該瀏覽器
通過這個程序,就可以比較容易的顯示webkit處理的頁面HTML源碼了。
回到頂部
spynner應用
下面介紹一下spynner的簡單應用,通過簡單的程序,可以獲取你在瀏覽器中看到的頁面的全部圖片。用HTMLParser、BeautifulSoup等都可以完成HTMLParser文檔的解析。而我選擇HTMParser。
#!/usr/bin/python
import spynner
import HTMLParser
import os
import urllib
class MyParser(HTMLParser.HTMLParser):
def handle_starttag(self, tag, attrs):
if tag == 'img':
url = dict(attrs)['src']
name = os.path.basename(dict(attrs)['src'])
if name.endswith('.jpg') or name.endswith('.png') or name.endswith('gif'):
print "Download.....", name
urllib.urlretrieve(url, name)
if __name__ == "__main__":
browser = spynner.Browser()
browser.show()
browser.load("http://www.artist.cn/snakewu1994/StyleBasis_Four/en_album_607236.shtml")
Parser = MyParser()
Parser.feed(browser.html)
print "Done"
browser.close()
通過這個程序,可以下載你在頁面上看到的全部圖片。簡單的幾行程序就完成了這個艱巨的任務。實現了圖片的批量處理。這真是Python語言的優勢,再艱巨的任務交給第三方吧。