Python標準庫之urllib,urllib2

urllib模塊提供了一些高級接口,用於編寫須要與HTTP服務器交互的客戶端。典型的應用程序包括從網頁抓取數據、自動化、代理、網頁爬蟲等。html

在Python 2中,urllib功能分散在幾個不一樣的庫模塊中,包括urllib、urllib二、urlparse等。在Python 3中,全部功能都合併在urllib包中。python

1. urlopen(url[, data[, timeout]]) 

要抓取html網頁,很簡單chrome

import urllib2
response=urllib2.urlopen('http://www.google.com')

    urlopen建立一個表示遠程url的類文件對象,而後像本地文件同樣操做這個類文件對象來獲取遠程數據。參數url表示遠程數據的路徑,通常是網址。若是要執行更加複雜的操做,如修改HTTP報頭,可建立Request實例並當爲url參數使用;參數data表示以post方式提交到url的數網頁爬蟲

據,須要通過URL編碼;timeout是可選的超時選項。urlopen返回 一個類文件對象,他提供了以下方法:瀏覽器

  • read() , readline() , readlines() , fileno() , close() :這些方法的使用方式與文件對象徹底同樣
  • info():返回一個mimetools.Message對象,表示遠程服務器返回的頭信息
  • getcode():返回整數形式的HTTP響應碼。例如:成功時返回200,未找到文件時返回404
  • geturl():返回請求的實際url
>>> response.getcode()
200
>>> response.geturl()
'http://www.google.com.hk/'

  info()返回的mimetools.Message映射對象有headers、getheader()、getplist() 、getparam()等方法。服務器

message=response.info()
message.headers  #返回http報頭信息的列表
for header in message:
    print header,message.getheader(header)  #獲取報頭信息
for header in message:
    print header,message[header]     #message可用字典的方法分析
message.getparam('charset')  #獲取url編碼

2. URL編碼 urllib.urlencode()

urllib中還提供了一些方法,用於對url進行編碼、解碼。url中是不能出現一些特殊的符號的,有些符號有特殊的用途。cookie

urllib.quote()post

使用適合URL內容的轉義序列替換string中的特殊字符。字母、數字、下劃線(_)、逗號(,)、句號(.)、連字符(-)都保持不變。其餘字符轉換成%xx形式的轉義序列,默認使用utf-8編碼。網站

urllib.unquote()ui

解碼

urllib.urlencode(query)

將query中的查詢值轉換成一個URL編碼的字符串。query能夠是一個字典,也能夠是一個(key,value)的對序列。獲得的是以'&'字符分割的'key=value'對序列。

import urllib
form_data={'user':'jhon','passwd':'123456'}  #要提交的表單數據
url_data=urllib.urlencode(form_data)    #url_data被編碼爲'passwd=123456&user=jhon'
full_url='http://www.example.com'+'?'+url_data
u=urllib2.urlopen(full_url) 

 3. urllib2.Request(url [, data [, headers ]])

Request實例能夠替代urlopen(url)中的url來實現更加複雜的操做。headers是一個字典,包含了可表示HTTP報頭內容的鍵值映射。

有一些網站不但願被某些程序瀏覽或者針對不一樣的瀏覽器返回不一樣的版本。默認狀況下,urlib2把本身識別爲Python-urllib/x.y(這裏的 xy是python發行版的主要或次要的版本號,如,

Python-urllib/2.7)。瀏覽器區別自身的方式是經過User-Agent頭若是要模擬chrome瀏覽器鏈接:

headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.102 Safari/537.36'}
r=urllib2.Request("http://www.google.com",headers=headers)
u=urllib2.urlopen(r)

 要處理cookie的時候,注意不要在Request裏面設置headers,由於cookie也在headers裏面,設置headers會將cookie覆蓋掉。

 能夠用Request().add_header(key,value)方法。

import urllib2
import cookielib
cookie=cookielib.CookieJar()
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
r=urllib2.Request('http://www.google.com')
r.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.102 Safari/537.36')
u=opener.open(r)
相關文章
相關標籤/搜索