網絡爬蟲,即Web Spider,是一個很形象的名字。把互聯網比喻成一個蜘蛛網,那么Spider就是在網上爬來爬去的蜘蛛。
1. 網絡爬蟲的定義
網絡蜘蛛是通過網頁的鏈接地址來尋找網頁的。從網站某一個頁面(通常是首頁)開始,讀取網頁的內容,找到在網頁中的其它鏈接地址,然后通過這些鏈接地址尋找下一個網頁,這樣一直循環下去,直到把這個網站所有的網頁都抓取完為止。如果把整個互聯網當成一個網站,那么網絡蜘蛛就可以用這個原理把互聯網上所有的網頁都抓取下來。這樣看來,網絡爬蟲就是一個爬行程序,一個抓取網頁的程序。網絡爬蟲的基本操作是抓取網頁。
2. 瀏覽網頁的過程
抓取網頁的過程其實和讀者平時使用IE瀏覽器瀏覽網頁的道理是一樣的。比如說你在瀏覽器的地址欄中輸入 www.baidu.com 這個地址。
打開網頁的過程其實就是瀏覽器作為一個瀏覽的“客戶端”,向服務器端發送了 一次請求,把服務器端的文件“抓”到本地,再進行解釋、展現。
HTML是一種標記語言,用標簽標記內容并加以解析和區分。瀏覽器的功能是將獲取到的HTML代碼進行解析,然后將原始的代碼轉變成我們直接看到的網站頁面。
3. 基于python實現的網絡爬蟲功能
1). python獲取html頁面
其實,最基本的抓站,兩句話就可以了:
1
2
|
import urllib2 content = urllib2.urlopen( 'http://XXXX' ).read() |
這樣可以得到整個 html 文檔,關鍵的問題是我們可能需要從這個文檔中獲取我們需要的有用信息,而不是整個文檔。這就需要解析充滿了各種標簽的 html。
2). python爬蟲抓取頁面后解析html方法
python爬蟲html解析庫SGMLParser
Python 默認自帶 HTMLParser 以及 SGMLParser 等等解析器,前者實在是太難用了,我就用 SGMLParser 寫了一個示例程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import urllib2 from 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 = 1 def end_h4( self ): self .is_h4 = "" def handle_data( self , text): if self .is_h4 = = 1 : self .name.append(text) 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 中的
1
2
|
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 下
1
|
sudo apt - get install python - pyquery |
以下例子:
1
2
3
4
5
6
7
8
9
|
from pyquery import PyQuery as pyq 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 文檔,它具有很好的容錯能力。
以上就是本文的全部內容,對Python網絡爬蟲功能的實現進行了詳細的分析介紹,希望對大家的學習有所幫助。