我們日常生活中經常使用的搜索引擎就是一種網絡爬蟲。它們利用比較先進的算法和程序從服務器中爬取到用戶所需要查找的信息。
筆者也研究過一段時間的網絡爬蟲,不過能力還不夠。而且是剛開始用python寫網絡爬蟲的旅程。瞭解過之後,發現用python寫網
絡爬蟲要比java寫網絡爬蟲更加簡潔與方便。下面是我寫的第一個python網絡爬蟲實例:
#coding=utf-8
import urllib2
import urllib
def download(url):
'''@url:需要爬取的網頁地址'''
print 'Downloading:',url
html = urllib2.urlopen(url).read() '''此語句用於獲得網頁的html代碼'''
urllib.urlretrieve(url,'f://download.html') '''此語句用於下載網頁的html代碼'''
'''調用download函數'''
download('http://www.taobao.com/')
由於用戶在訪問網頁時,可能會出現一些錯誤代碼。常見的有:
200:成功(以2開頭的代碼均成功)
302:重定向(目標暫時轉移)
404:客戶端錯誤,在服務器中找不到查找的資源或信息。(以4開頭的均爲客戶端錯誤)
500:服務器內部錯誤。(以5開頭的代碼均爲服務器端錯誤)
因此如果服務器內部出現了問題,那麼我們可以再次訪問,也許會訪問到該網站。由於訪問可能會出現錯誤,所以也需要進行異常處理。
代碼實現如下:
#coding=utf-8
import urllib2
import urllib
def download(url,num_retries = 2):
''' 定義download函數
@url:爲需要訪問的網址
@num_retries:重新下載的次數
'''
print 'Download:',url
try: #處理異常
html = urllib2.urlopen(url).read() #可能發生異常的代碼
except urllib2.URLError as e:
print 'Download error:',e.reason #輸出錯誤信息
html = None #將html置空
if num_retries > 0:
'''hasattr用於判斷錯誤信息e中是否有code字段'''
if hasattr(e,'code') and 500 <= e.code < 600:
return download(url,num_retries - 1)
urllib.urlretrieve(url,'f://download.html') #下載網頁html代碼
download('http://www.sina.com/') #調用函數