Python 3.3.3 使用requests模擬登陸網站

在模擬登陸上,requests確實比python標準庫中的相關模塊更加簡潔.html

假設你須要去爬一組頁面(targetUrls),而這些頁面要登陸才能進行訪問.那麼requests可以提供一種至關簡單的語法來實現.python

 

不過在此以前,你得先經過瀏覽器的開發人員工具肯定:json

1.遞交用戶名和密碼的頁面(loginUrl)瀏覽器

2.鍵值對(遞交數據是以字典的形式)服務器

 

模擬舉例:cookie

#肯定登陸頁面地址和鍵值對
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系.即:session

for x in targetUrls:
    r=s.get(x)
r.encoding='gb18030'

不然,你的正則可能沒法匹配到本應匹配到的中文字符.目前還不太瞭解爲什麼requests頑固的認爲頁面編碼都是ISO-8859-1(西歐編碼),即便它已經知道apparent_encoding的值爲'GB2312'.app

.工具

requests把服務器返回的數據包裝成一個對象,這個對象有不少有用的屬性,咱們能夠直接訪問,很是方便.post

可算是沒有浪費那麼多時間去安裝.來看看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

相關文章
相關標籤/搜索