[Python爬蟲]requests模組使用post方法提交表單
使用
requests
庫中的post(url,params)
方法,先通過觀察表單的網頁原始碼,或者是通過逆向工程的方法獲取表單提交的欄位,構造引數params
,就能實現模擬登入操作.
例如:url = 'http://xxx.com/login' captcha = input() params = { 'email': '[email protected]', 'password': '********', } html = requests.post(url, params)
就是一個典型的利用Post登入網站的方法.
不過想要獲取表單進行提交還需要一些技巧,下面將描述兩個獲取的方法.
檢視網頁原始碼提交表單
以 https://www.douban.com/豆瓣網為例,豆瓣網的登入只需要填寫賬號和密碼就能登入.
我們根據表單找到相應的原始碼資訊:
其中,<form>
標籤是表單,<form>
中的action=
為表單提交的URL,下面<fieldset>
中<input>
為表單提交的欄位,name=
就是欄位的名稱,由此可以構造表單進行登入.(因為沒有驗證碼,所以只需要構造來源,郵箱,密碼即可登入)
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/67.0.3396.79 Safari/537.36'
}
url = 'https://www.douban.com/accounts/login'
# html=requests.get(url,headers)
params = {
'source': 'index_nav', # 在首頁進行登入
'form_email': '[email protected]', # 郵箱/手機號
'form_password' : '********' # 密碼
}
html = requests.post(url, params)
html.encoding = html.apparent_encoding
print(html.text)
檢視html,可以發現登陸已經成功
逆向工程提交表單
在瀏覽器中開啟開發者工具,選擇Network,然後輸入郵箱和密碼,點選登入.
發現在All中第一個檔案是login
,通過檢視Headers獲取到方法是Post,請求的URL
在最下方的Form Data得到提交的表單資訊
這樣就可以不用觀察原始碼得到了表單的資訊.之後就可以編寫程式碼使用Post進行登入.
針對驗證碼的表單提交
現在像豆瓣網這種登入只需要賬號密碼,不用驗證碼的太少了,這裡以 http://bangumi.tv/Bangumi 番組計劃為例,說明一下.
用逆向工程的方法登入後,可以看到POST和URL
在Form data中得到表單的資訊
不過提交的表單中不僅包括了表單的雜湊值,登入的來源,郵箱,密碼,還有驗證碼和點選的按鈕.
通過驗證原始碼,確定只會改變的是驗證碼
前三個值
賬號和密碼
驗證碼
登入框(不是很懂為什麼這個要提交)
所以在構建params
時,需要先將網頁中的驗證碼圖片下載下來,通過人工觀察,或者驗證碼識別工具或者深度學習的方法等獲取驗證碼的資訊,填寫到params
中才能實現登入.
因為還沒學得這麼深,所以這裡只用人工觀察的方法獲取驗證碼資訊
獲取驗證碼
url='http://bangumi.tv/login'
res=requests.get(url,headers)
res.encoding=res.apparent_encoding
selector=etree.HTML(res.text)
selector.xpath('//p[@class="captcha_img"]/img/@src')
但是遺憾的是,selector
並沒有返回任何的內容
也就是雖然標籤存在,但是驗證碼圖片並不是立刻出現在response
中,而是隻用了非同步載入的技術載入,檢視network
選項卡進行抓包,
果不其然,得到了驗證碼URL,將驗證碼儲存到本地
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/67.0.3396.79 Safari/537.36'
}
captcha_url = 'http://bangumi.tv/signup/captcha?15424188795671'
res = requests.get(captcha_url, headers)
with open('d:/captcha.jpg', 'wb') as pf:
pf.write(res.content)
在d:/
根目錄下就能找到驗證碼,
根據驗證碼構造params
url = 'http://bangumi.tv/FollowTheRabbit'
captcha = input() #輸入本地路徑的驗證碼資訊,例如上圖中的2qe3s
params = {
'form_hash': '95b4e189',
'referer': 'http://bangumi.tv/',
'dreferer': 'http://bangumi.tv/',
'email': '[email protected]',
'password': '********',
'captcha_challenge_field': captcha,
'loginsubmit': '登入'
}
html = requests.post(url, params)
html.encoding = html.apparent_encoding
print(html.text)
然而很遺憾還是不行…
這是因為,驗證碼存在自身擁有hash校驗值和時間值所以它的URL也是會變化的,不能用於相同的登入頁面.
不過不用擔心,我們還有最終的解決方法—Selenium模擬瀏覽器,不過這裡篇幅太小,寫不下.
解決方法可以繼續參考我的這篇文章還沒寫完