1. 程式人生 > >[Python爬蟲]requests模組使用post方法提交表單

[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模擬瀏覽器,不過這裡篇幅太小,寫不下.
解決方法可以繼續參考我的這篇文章還沒寫完