Infi-chu:
http://www.cnblogs.com/Infi-chu/
一、urllib庫:
1. 是Python內置的HTTP請求庫
2. 在Python2中,由urllib和urllib2之分,而在Python3中,統一為urllib
3. 主要包含模塊:
request:最基本的發送模塊,用來模擬發送請求
error:異常處理模塊
parse:一個工具模塊
robotparser:主要用來識別robots.txt文件
二、發送請求:
1. urlopen()
urllib.request:模塊提供了最基本的構造HTTP請求的方法,同時還帶有處理驗證(authentication)、重定向(redirection)、瀏覽器Cookies等
import urllib.request
r = urllib.request.openurl('http://www.baidu.com')
print(r.read().decode('utf-8'))
print(type(r)) # <class 'http.client.HTTPResponse'>
HTTPResponse類型的對象包括的方法:read()、readinto()、getheader(name)、getheaders()、fileno()等
HTTPResponse類型的對象包括的屬性:msg、version、status、reason、debuglevel、closed等
urlopen()函數的API:
urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)
data參數:
1. 可選
2. 若是字節流編碼格式的內容,即bytes類型,則需要通過bytes()方法轉化。若傳遞該參數,則請求方式會有GET變為POST
3. bytes()第一個參數需為str類型,可用urllib.parse.urlencode()方法是字典變為字符串
timeout參數:
1. 可選
2. 用於設置超時時間,單位是秒,默認使用全局默認時間
3. 支持HTTP、HTTPS、FTP請求
4. 例:
import urllib
try:
r = urllib.request.urlopen('http://www.baidu.com',timeout=0.1)
except urllib.error.URLError as e:
if isinstance(e.reason,socket.timeout):
print('Time Out!')
context參數:必須是ssl.SSLContext類型,用來指定SSL設置
cafile參數:指定CA證書
capath參數:指定CA證書的路徑
【注】cafile和capath一起在請求HTTPS時使用
cadefault參數:已被廢棄,默認是False
2. Request
urlopen()不足以構建一個完整的請求,若要加入Headers等信息,就可以用Request類
Request類的構造:
class urllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)
url參數:同urlopen()
data參數:同urlopen()
headers參數:
1. 請求頭
2. 可以直接在字典中構造,也可以用add_header()方法添加
3. 可將User-Agent改為Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) 【注】偽造成瀏覽器訪問
origin_req_host參數:指的是請求方的host名稱或IP地址
unverifiable參數:請求是否是無法驗證的,默認是False
method參數:是一個字符串,用來指示請求的方法
3. Handler(請求的高級用法):
Handler是各種處理器,可以處理登錄驗證,可以處理Cookies,可以處理代理。
urllib.request模塊里面的BaseHandler類,是所有其他Handler的父類。
各種Handler子類繼承這個BaseHandler類:
HTTPDefaultErrorHandler:用於處理HTTP響應錯誤,會拋出異常
HTTPRedirectHandler:用於處理重定向
HTTPCookieProcessor:用於處理Cookies
ProxyHandler:用於設置代理,默認為空
HTTPPasswordMgr:用於管理密碼
HTTPBasicAuthHandler:用於管理認證
4. OpenDirector:
應用:驗證、代理、Cookies
三、異常處理:
1. URLError:
a. 來自urllib庫的error模塊,他繼承自OSError類,是error異常模塊的基類,由request模塊產生的異常都可以通過它處理
b. reason屬性,返回原因
2. HTTPError:
a. 是URLError的子類,專門用來處理HTTP請求錯誤
b. 三個屬性:
code:返回狀態碼
reason:返回原因
headers:返回請求頭
四、解析鏈接:
介紹parse模塊中的方法,parse定義了處理URL的標准接口
1. urlparse()
實現URL的識別分段。
API用法:
urllib.parse.urlparse(urlstring,scheme='',allow_fragments=True)
urlstring參數:必選,待解析的URL
scheme參數:它是默認的協議(HTTP、HTTPS),urlstring沒有時生效
allow_fragments參數:是否忽略fragment,False為忽略,當URL中不包含params和query時,fragment會被解析為path的一部分
2. urlunparse()
與urlparse對立,接受的參數是一個可迭代對象,長度必須為6(scheme,netloc,path,params,query,fragment),可以是元組、字典等特定的數據結構,這樣就可以實現URL的構造
3. urlsplit()
與urlparse相似,不單獨解析parse,返回5各部分,元組類型
4. urlunsplit()
與urlunparse()類似,將各個部分拼接,長度必須是5
5. urljoin()
生成鏈接,提供一個base-url的scheme,netloc,和path 3個內容並對新鏈接缺失的部分進行補充。
【注】兩個都有取最新的,不全的話互補
6. urlencode()
在構造GET請求參數的時候很有用,將字典序列化為GET請求參數
7. parse_qs()
反序列化,將一串GET請求參數,轉化為字典
8. parse_qsl()
同parse_qs(),將GET轉化為元組組成的列表
9. quote()
將內容轉化為URL編碼的格式,因為URL有中文編碼格式時,可能會出現亂碼,用它可以轉化
10. unquote()
進行URL解碼
五、分析robots協議:
robotparser模塊,該模塊提供了一個RobotFileParser類
urllib.robotparser.RobotFileParser(url='')
此類的常用方法:
set_url() 設置robots.txt文件的鏈接
read() 讀取文件並分析
parse() 解析文件
can_fetch() 傳入兩個參數,第一個是User-Agent,第二個是抓取的URL,返回是否可抓取
mtime() 返回上回抓取和分析的時間
modified() 將當前時間設置為上次抓取和分析的時間
