㈠ python2 能使用requests嗎
由於公司要用到模擬用戶登錄,於是用學校圖書館讀者登錄來進行練習。
工具是python2 + requests第三方庫+火狐瀏覽器的firebug進行http抓包
目標 用python成功登錄學校圖書館
接下來幾篇會利用urllib和urllib2標准庫進行登錄
以下為具體步驟:
1 打開學校圖書館網址,以下為登錄界面
綜合以上分析,利用requests庫進行模擬用戶登錄。這里的post參數採用了之前圖片的源碼形式,使得參數順序匹配
import requests
url = "http://210.32.205.60/login.aspx"
# 學校圖書館登錄url
header = {"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Encoding":"gzip, deflate",
"Accept-Language":"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
"Connection":"keep-alive",
"Content-Type":"application/x-www-form-urlencoded",
"Host":"210.32.205.60",
"Referer": "http://210.32.205.60/login.aspx",
"Upgrade-Insecure-Requests":"1",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; rv:54.0) Gecko/20100101 Firefox/54.0"
}
body = b'__VIEWSTATE=%uMtIIHXEj%&__VIEWSTATEGENERATOR=C2EE9ABB&__EVENTVALIDATION=%2FwEdAAbAeS%2BByzNg%%2FzVFQdp1z%2BnYWZ%%2BIuKmLNV%%3D%3D&DropDownList1=0&TextBox1=讀者號&TextBox2=密碼&ImageButton1.x=44&ImageButton1.y=12'r = requests.post(url, data=body, headers=header)
print r.text
以上為一次提交,沒有進行重定向截取。
如果想用reque庫截取重定向,在這個圖書館登錄中則需要進行兩次操作,這里相當於只做了post請求,頭部,post參數都不變,只不過在requests.post()內設置了參數
r = requests.post(url, data=body, headers=header, allow_redirects=False)
# 設置 allow_redirects=False 使得禁止重定向
aspid = r.headers["Set-Cookie"] # 返回頁面的頭部的cookie
print r.status_code # 輸出302
如果再想登陸圖書館頁面,那麼需要將cookie重新加入新的url上,進行get請求的提交,此時url為/Default.aspx.
url ="http://210.32.205.60/Default.aspx"
header = {
"Accept": "image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, */*",
"Referer": "http://210.32.205.60/login.aspx",
"Accept-Language": "zh-CN",
"User-Agent": "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)",
"Accept-Encoding": "gzip, deflate",
"Host": "210.32.205.60",
"Connection": "Keep-Alive",
"Pragma": "no-cache",
"Cookie": aspid
}
r = requests.get(url=url,headers=header)
print r.status_code
print r.text
接下來的幾篇是利用python2的urllib2和urllib進行相同的模擬用戶登錄。
ps 由於urllib2處理重定向的時候不會將cookie帶上,會導致頁面不能正確爬取,所以要處理重定向。解決urllib重定向文章在此,分別介紹了urllib2自動處理重定向(帶上cookie),和urllib2阻止重定向,返回cookie。
利用urllib2進行自動處理重定向,模擬瀏覽器提交post一次,就可以登錄圖書館的文章在這。
利用urllib2處理重定向,使得重定向截斷,獲取cookie,根據cookie用代碼實現重定向,登錄圖書館的文章在此。
㈡ Python瞎老弟的爬蟲心得之requests篇②requests基本使用
上一期已經成功安裝了requests模塊,並簡單的使用了requests,本期,我們將詳細介紹requests模塊
直接使用requests.get()方法即可
其中內容將通過requests.text查看
將get()方法,改為post()即可
其中需要提交的內容,通過data參數傳入
url參數,也即跟在地址後的?後的一串內容
我們可以直察埋接通過url地址將其構造出來
也可以通過params參數,傳入一個字典使用
可以看出,地址同樣被自動構造為
這是一種更加容易的傳入參數的方法,可以不需要使用
我們得到了一個對象r,這是一個requests.models.Response對象
使用檔爛r.text可以得到響應內容
其中解碼方式是requests自行猜測的,它會把猜測的結果保存在r.encoding中
使用r.encoding可以得到或者改變編碼方式
如果使用r.text得到的內容不正確,可以手動修改r.encoding,然後再使用r.text輸出內容
如果不知道正確的編碼,可能有人會建議你使用chardet模塊來進行編碼的測試(該模塊需要使用pip安裝,目前版本也會隨安裝requests附帶)
使用方法:
事實上,現在的requests已經使用了chardet模塊,但你仍然可以將行沒漏chardet用於其他時候使用
使用r.content可以得到二進制的響應內容
使用r.json()可以得到json的響應內容
給headers參數傳入一個字典即可
如同之前你預想的那樣,user-agent會被修改為lsp
通過r.status_code可以查看狀態碼
通過r.headers可以查看響應頭
通過r.raise_for_status()可以在狀態碼為不正常的時候拋出異常
在請求中添加timeout參數,即可讓你的程序在指定的時間內沒有得到響應就拋出異常
通過r.url可以查看到請求地址
通過r.history可以查看到重定向
通過修改allow_redirects參數為False可以禁止重定向
例如禁止github進行重定向
㈢ 全方面的掌握Requests庫的使用【python爬蟲入門進階】(02)
上一篇文章簡單的介紹了 爬蟲相關的基礎知識點,介紹了一個標准爬蟲程序的三個步驟 。這篇文章就讓我們接著來學習。
本文重點介紹requests庫的使用以及爬蟲協議。之前也寫了一篇 Requests庫使用的博客 ,有興趣的小夥伴可以去看看。
前面介紹了Requests庫是用來抓取網頁源碼,請求介面的利器,整體上是要比urllib庫的request更加好用的庫。官網上將其稱之為唯一一個非轉基因的Python HTTP庫,人類可以安全享用。
Requests庫有7個主要方法。
不過我們平常最常用的方法還是GET方法和POST方法。
get請求方法是爬蟲中最常用到的方法,因為爬蟲主要就是爬取網頁的信息。最基礎的使用是
這里需要通過 res.encoding='utf-8' 設置響應結果的編碼格式是utf-8。不然可能會出現中文亂碼
如果響應結果是二進制數據的話則需要通過 res.content 方法來提取響應結果。
設置編碼的方式也可以是 res.content.decode('utf-8') 。
即
有時候get請求也需要傳入參數,這里可以直接將參數拼接到URL上或者通過params參數傳入一個字典。
運行結果是:
get請求只能傳入簡單的參數,如果參數比較復雜或者傳入的參數比較多的話則GET請求就不再適用了,這時候就需要適用post請求方法了。
Post請求的請求類型有三種:
以表單的方式提交數據是POST請求的默認的請求格式,只需要將參數放在一個字典中進行傳入即可。
這里將請求頭的數據放在一個名為header的字典中,然後在請求時通過headers參數傳入。在請求中設置了內容類型是 application/json ,編碼格式是 charset=utf-8
傳入的是一個json字元串,通過data參數進行傳入。json字元串可以直接寫也可以通過 json.mps(dict) 方法將一個字典序列化,就像下面這樣。
文件上傳與本節爬蟲的內容無關,在此就不過多介紹了。有興趣的小夥伴可以看看 Python中如何編寫介面,以及如何請求外部介面 這篇文章。
在網路請求中,我們常常會遇到狀態碼是3開頭的重定向問題,在Requests中是默認開啟允許重定向的,即遇到重定向時,會自動繼續訪問。通過將allow_redirects 屬性設置為False不允許重定向。
通過timeout屬性可以設置超時時間,單位是秒。get方法和post方法均可設置。
通過status_code屬性可以獲取介面的響應碼。
有時候我們使用了抓包工具,這時候由於抓包證書提供的證書並不是受信任的數字證書頒發機構頒發的,所以證書的驗證會失敗,所以我們就需要關閉證書驗證。在請求的時候把verify參數設置為False就可以關閉證書驗證了。
爬蟲協議也叫做robots協議,告訴網路蜘蛛哪些頁面可以爬取,哪些頁面不能爬取
爬蟲文件的規范是:
允許所有的機器人
本文詳細介紹了Request庫的使用
㈣ python requests庫如何處理302重定向
你的意思是希望requests報告302?
r = requests.get(url, allow_redirects=False)
r.status_code
r.headers['Location']