這篇文章主要介紹了Python網路爬蟲功能的基本寫法,網路爬蟲,即Web Spider,是一個很形象的名字。把互連網比喻成一個蜘蛛網,那麼Spider就是在網上爬來爬去的蜘蛛,對網路爬蟲感興趣的朋友可以參考本文
網路爬蟲,即Web Spider,是一個很形象的名字。把互連網比喻成一個蜘蛛網,那麼Spider就是在網上爬來爬去的蜘蛛。
1. 網路爬蟲的定義
網路蜘蛛是通過網頁的連結地址來尋找網頁的。從網站某一個頁面(通常是首頁)開始,讀取網頁的內容,找到在網頁中的其它連結地址,然後通過這些連結地址尋找下一個網頁,這樣一直迴圈下去,直到把這個網站所有的網頁都抓取完為止。如果把整個互連網當成一個網站,那麼網路蜘蛛就可以用這個原理把互連網上所有的網頁都抓取下來。這樣看來,網路爬蟲就是一個爬行程式,一個抓取網頁的程式。網路爬蟲的基本操作是抓取網頁。
2. 瀏覽網頁的過程
抓取網頁的過程其實和讀者平時使用IE瀏覽器瀏覽網頁的道理是一樣的。比如說你在瀏覽器的地址欄中輸入 www.baidu.com 這個地址。
開啟網頁的過程其實就是瀏覽器作為一個瀏覽的“用戶端”,向伺服器端發送了 一次請求,把伺服器端的檔案“抓”到本地,再進行解釋、展現。
HTML是一種標記語言,用標籤標記內容並加以解析和區分。瀏覽器的功能是將擷取到的HTML代碼進行解析,然後將原始的代碼轉變成我們直接看到的網站頁面。
3. 基於python實現的網路爬蟲功能
1). python擷取html頁面
其實,最基本的抓站,兩句話就可以了:
import urllib2content = urllib2.urlopen('http://XXXX').read()
這樣可以得到整個 html 文檔,關鍵的問題是我們可能需要從這個文檔中擷取我們需要的有用資訊,而不是整個文檔。這就需要解析充滿了各種標籤的 html。
2). python爬蟲抓取頁面後解析html方法
python爬蟲html解析庫SGMLParser
Python 預設內建 HTMLParser 以及 SGMLParser 等等解析器,前者實在是太難用了,我就用 SGMLParser 寫了一個樣本程式:
import urllib2from sgmllib import SGMLParser class ListName(SGMLParser):def init(self):SGMLParser.init(self)self.is_h4 = ""self.name = []def start_h4(self, attrs):self.is_h4 = 1def end_h4(self):self.is_h4 = ""def handle_data(self, text):if self.is_h4 == 1:self.name.append(text) content = urllib2.urlopen('http://169it.com/xxx.htm').read()listname = ListName()listname.feed(content)for item in listname.name:print item.decode('gbk').encode('utf8')
很簡單,這裡定義了一個叫做 ListName 的類,繼承 SGMLParser 裡面的方法。使用一個變數 is_h4 做標記判定 html 檔案中的 h4 標籤,如果遇到 h4 標籤,則將標籤內的內容加入到 List 變數 name 中。解釋一下 start_h4() 和 end_h4() 函數,他們原型是 SGMLParser 中的
start_tagname(self, attrs)end_tagname(self)
tagname 就是標籤名稱,比如當遇到 <pre>,就會調用 start_pre,遇到 </pre>,就會調用 end_pre。attrs 為標籤的參數,以 [(attribute, value), (attribute, value), ...] 的形式傳回。
python爬蟲html解析庫pyQuery
pyQuery 是 jQuery 在 python 中的實現,能夠以 jQuery 的文法來操作解析 HTML 文檔,十分方便。使用前需要安裝,easy_install pyquery 即可,或者 Ubuntu 下
sudo apt-get install python-pyquery
以下例子:
from pyquery import PyQuery as pyqdoc=pyq(url=r'http://169it.com/xxx.html')cts=doc('.market-cat') for i in cts:print '====',pyq(i).find('h4').text() ,'===='for j in pyq(i).find('.sub'):print pyq(j).text() ,print '\n'
python爬蟲html解析庫BeautifulSoup
有個頭痛的問題是,大部分的網頁都沒有完全遵照標準來寫,各種莫名其妙的錯誤令人想要找出那個寫網頁的人痛打一頓。為瞭解決這個問題,我們可以選擇著名的 BeautifulSoup 來解析html 文檔,它具有很好的容錯能力。