在模擬登錄上,requests確實比python標准庫中的相關模塊更加簡潔.
假設你需要去爬一組頁面(targetUrls),而這些頁面要登錄才能進行訪問.那么requests能夠提供一種相當簡單的語法來實現.
不過在此之前,你得先通過瀏覽器的開發人員工具確定:
1.遞交用戶名和密碼的頁面(loginUrl)
2.鍵值對(遞交數據是以字典的形式)
模擬舉例:
#確定登錄頁面地址和鍵值對 loginUrl = "http://..." loginData={ 'formhash' : "f474a8c6", 'cookietime' : 2592000, 'loginfield' : "username", 'username' : "...", 'password' : "...", 'userlogin' : "true",} s = requests.session() s.post(url=loginUrl,data=loginData) #定義目標頁面的集合 targetUrls=["http://...","http://...",...] #依次處理這些目標頁面 for x in targetUrls: r=s.get(x) #對r進行各種讀取操作,例如r.content返回網站bytes數據,r.text返回網站Unicode數據.
注意,如果你要用中文正則匹配一個gb編碼系的頁面文本(r.text),那么你可能需要在匹配之前告訴requests,編碼是gb系.即:
for x in targetUrls: r=s.get(x)
r.encoding='gb18030'
否則,你的正則可能無法匹配到本應匹配到的中文字符.目前還不太了解為何requests頑固的認為頁面編碼都是ISO-8859-1(西歐編碼),即使它已經知道apparent_encoding的值為'GB2312'.
.
requests把服務器返回的數據包裝成一個對象,這個對象有很多有用的屬性,我們可以直接訪問,非常方便.
可算是沒有浪費那么多時間去安裝.來看看r都有些什么屬性:
attrs=['apparent_encoding', 'close', 'connection', 'cookies', 'elapsed', 'encoding','headers', 'history', 'iter_content', 'iter_lines', 'json', 'links', 'ok', 'raise_for_status', 'raw', 'reason', 'request', 'status_code', 'url'] for att in attrs: print (att,'->',getattr(r,att)) #text和content其實就是網站文本,太大了,單獨列出來,只顯示類型. print('type(r.text)','->',type(r.text)) print('type(r.content)','->',type(r.content))
結果:
>>> apparent_encoding -> GB2312 close -> <bound method Response.close of <Response [200]>> connection -> <requests.adapters.HTTPAdapter object at 0x01D5F4F0> cookies -> <<class 'requests.cookies.RequestsCookieJar'>[]> elapsed -> 0:00:00.758043 encoding -> ISO-8859-1 headers -> CaseInsensitiveDict({'x-powered-by': 'PHP/5.2.17', 'date': 'Sun, 24 Nov 2013 16:31:04 GMT', 'keep-alive': 'timeout=5, max=100', 'content-encoding': 'gzip', 'content-type': 'text/html', 'connection': 'Keep-Alive', 'server': 'LiteSpeed', 'vary': 'Accept-Encoding, Accept-Encoding', 'transfer-encoding': 'chunked'}) history -> [] iter_content -> <bound method Response.iter_content of <Response [200]>> iter_lines -> <bound method Response.iter_lines of <Response [200]>> json -> <bound method Response.json of <Response [200]>> links -> {} ok -> True raise_for_status -> <bound method Response.raise_for_status of <Response [200]>> raw -> <requests.packages.urllib3.response.HTTPResponse object at 0x02622750> reason -> OK request -> <PreparedRequest [GET]> status_code -> 200 url -> http://... type(r.text) -> <class 'str'> type(r.content) -> <class 'bytes'>
requests官方中文教程:
http://cn.python-requests.org/en/latest/user/quickstart.html
