系統學習下python網絡爬蟲的知識python
一、爬蟲的定義瀏覽器
Web Spider,把互聯網定義爲一個蜘蛛網,網絡蜘蛛經過網頁的連接地址來尋找網頁。服務器
具體過程:從網站的某一個網頁(一般是首頁)開始,讀取網頁的內容,找到在網頁中的其餘連接地址,而後經過這些連接地址尋找下一個頁面,這樣一直循環下去,直到全部的網頁都抓取完成爲止。網絡
其實,網絡爬蟲就是一個爬行程序,一個抓取網頁的程序。咱們如何才能找到本身想要的網頁和去掉網頁中其餘不相關的部分?咱們首先得找到本身想要的網頁的URL.ide
二、瀏覽網頁的過程wordpress
抓取網頁的過程其實就是瀏覽器做爲一個瀏覽的客戶端,向服務器端發送了一次請求,把服務器端的文件抓到本地,再進行解釋、展示。函數
HTML語言是一種標記語言,用標籤標記內容並加以解析和區分。瀏覽器的功能是將獲取到的HTML代碼進行解析,而後將原始的代碼轉變成咱們直接看到的網站頁面。學習
三、URL網站
uniform resource locator的縮寫,統一資源定位符。編碼
URL的格式由三部分組成:
a、第一部分是協議(或稱爲服務方式)。
b、第二部分是存有該資源的主機IP地址(有時也包括端口號)。
c、第三部分是主機資源的具體地址,如目錄和文件名等。
第一部分和第二部分用「://」符號隔開,
第二部分和第三部分用「/」符號隔開。
第一部分和第二部分是不可缺乏的,第三部分有時能夠省略。
四、python中的urllib2模塊抓取制定URL網頁內容
咱們所說的網頁抓取工做,就是把URL地址中指定的網絡資源從網絡流中讀取出來,保存到本地。
urllib2是python的一個模塊,使用函數urlopen獲取網頁源代碼。
eg,最簡單的應用代碼:
import urllib2 response = urllib2.urlopen('https://gendertrender.wordpress.com/') content = response.read() print(content)
urllib2用一個Request對象來映射設置好的HTTP請求,而且用這個地址建立一個Request對象,經過調用urlopen並傳入Request對象,將返回一個相關請求request對象,而後能夠在Request中調用read()。
import urllib2 res = urllib2.Reaquest('https://gendertrender.wordpress.com/') response = urllib2.urlopen(req) content = response.read() print(content)
五、HTTP請求的操做
在HTTP請求時,能夠額外作的兩件事情。
a、發送data表單數據
發送一些數據到URL,好比用戶登陸信息,咱們在抓取網頁的過程當中,有時候會涉及到登錄之後顯示內容的網站,這個時候就會用到發送帳號數據到URL。通常的HTML表單,data須要編碼成標準形式。而後作爲data參數傳到Request對象。編碼工做使用urllib的函數而非urllib2。
import urllib import urllib2 url = 'http://www.baidu.com/register.cgi' values = {'user':'qester' 'pwd':'******'} data = urllib.urlencode(values)#對values進行編碼encode req = urllib2.Request(url,data) response = urllib2.urlopen(req) content = response.read() print content
若是沒有傳送data參數,urllib2使用GET方式的請求。
b、設置Headers和http請求
有一些站點不喜歡被程序訪問,或者發送不一樣的版本到不一樣的瀏覽器。默認的urllib2是以"python-urllib/x.y"的身份進行訪問的。對於這個身份站點會有不一樣的操做。對於這個狀況,咱們能夠請求對象一個包含頭數據的字典。把本身假裝起來。
import urllib import urllib2 url = 'http://www.baidu.com/register.cgi' user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' values = {'name' : 'qester', 'location' : 'SDU', 'language' : 'Python' } headers = { 'User-Agent' : user_agent } #把自身假裝成一個IE瀏覽器 data = urllib.urlencode(values) req = urllib2.Request(url, data, headers) response = urllib2.urlopen(req) the_page = response.read()
六、異常的處理和HTTP狀態碼的分類
當urlopen不可以處理一個response時,產生urlError。HTTPError是urlError的子類,一般在特定的HTTP URLs中產生。
a、URLError
URLError在沒有網絡鏈接或者服務器不存在的狀況下產生。異常會帶有"reason"屬性,它是一個tuple,包含了一個錯誤號和一個錯誤信息。
b、HTTPError
假如response是一個"重定向",須要客戶端從別的地址獲取文檔,urllib2將爲你處理。其餘不能處理的,urlopen會產生一個HTTPError。典型的錯誤包含"404"(頁面沒法找到),"403"(請求禁止),和"401"(帶驗證請求)。HTTP狀態碼錶示HTTP協議所返回的響應的狀態。好比客戶端向服務器發送請求,若是成功地得到請求的資源,則返回的狀態碼爲200,表示響應成功。若是請求的資源不存在, 則一般返回404錯誤。
通常處理這兩個異常最經常使用的方法以下:
from urllib2 import Request, urlopen, URLError, HTTPError req = Request('http://bbs.csdn.net/callmewhy') try: response = urlopen(req) except URLError, e: if hasattr(e, 'code'): print 'The server couldn\'t fulfill the request.' print 'Error code: ', e.code elif hasattr(e, 'reason'): print 'We failed to reach a server.' print 'Reason: ', e.reason else: print 'No exception was raised.'