系統學習下python網絡爬蟲 筆記一

系統學習下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.'
相關文章
相關標籤/搜索