爬蟲 處理登陸表單


在客戶端向服務器提交http請求的時候,兩種最常用的方法是GET和POST。按照規定,get請求只應用於獲取數據,因此一般都是用requests.get()。相對於GET請求,POST請求則用於提交數據。對登陸表單的處理,每次登陸可以直接處理登陸表單或者選擇在第一次登陸后,保存cookies等信息,下次可直接登陸。以下內容主要介紹直接處理表單的,獲取目標頁面的url的方法。

1、直接處理登陸表單(即處理需要登錄名、登陸密碼的網頁)

參考書籍:Python網絡爬蟲從入門到實踐中http://www.santostang.com./wp-login.php;
用戶名:test;密碼:a12345;
參考網頁:https://www.cnblogs.com/ddddfpxx/p/8624715.html

登陸表單分為兩步:

  • 研究網站登陸表單,構建POST請求的參數字典

  • 提交POST請求;

(1)參數字典

構建參數字典主要是4個部分,都是 鍵值對的形式,通過查詢網頁,揀選對應的鍵和值;

  • 用戶名 name 的屬性值 作為鍵值對中的key(用戶需輸入的用戶名則為value)

如上圖,F12 點選用戶名框,name的屬性值為"log",以此作為key;value 為用戶實際名。so 'log'='a12345'

  • 用戶密碼 name的屬性值 作為鍵值對中的key(用戶需輸入的用戶名則為value)

如上圖,F12 點選密碼框,name的屬性值為"pwd",以此作為key;value 為用戶實際名。so 'pwd'='test'

  • 記住登陸密碼 name的屬性值 作為鍵值對中的key,value的屬性值作為 鍵值對中的value

如上圖,F12 點選 記住密碼框,name的屬性值為"rememberme",value的屬性值為"forever"。so 'rememberme'='forever'

  • 在登陸表單中,有些key值在瀏覽器中設置了hidden值,所以只提交用戶名、密碼和記住密碼不能直接登陸,還需要審查出來。

如上圖,F12 點選 記住登陸框,input type的屬性值為"hidden"的有兩條。第一條,name屬性值為"redirect_to",value的屬性值為"http://www.santostang.com/wp-admin/",so 'redirect_to'='http://www.santostang.com/wp-admin/';第二條,name屬性值為"testcookie",value的屬性值為"1" so 'testcookie'='1'

綜上所述:建立參數字典,如下:

post_data={
    'log':'a12345',
    'pwd':'test',
    'rememberme':'forever',
    'redirect_to':'http://www.santostang.com/wp-admin/',
    'testcookie':'1'
};

(2)提交參數字典

提交POST請求,就可以登陸網站了。首先需要導入requests庫,並創建一個session對象。用戶瀏覽某個網站時,從進入網站到關閉瀏覽器所經過的這個過程,session對象會存儲特定用戶會話所需要的屬性和配置信息。 session 對保存和操作cookies非常重要。

#encoding:utf-8;
import requests;

post_link='http://www.santostang.com./wp-login.php';#登陸頁面 url
agent='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36';
host='www.santostang.com';
oringin='http://www.santostang.com';
cookied='wordpress_test_cookie=WP+Cookie+check';
headers={'User-Agent':agent,'Host':host,'Origin':oringin,'Referer':post_link,'Cookie':cookied};#提交者
post_data={
    'log':'test',
    'pwd':'a12345',
    'wp-submit':'登錄',
    'redirect_to':'http://www.santostang.com/wp-admin/',
    'testcookie':'1'
};

login_page=requests.post(post_link,data=post_data,headers=headers,allow_redirects=False);
profile_page=login_page.headers['location'];
print (login_page.status_code);## 回復302
print (login_page.headers['location']);## 回復http://www.santostang.com/wp-admin/profile.php

提交post的過程很簡單,即先建立各個參數,然后使用post方法,參數是post_url,data是postdata,headers是headers,allow_redirects。headers中,User-AgentHostOrigin(比host多了個http?)、Referer(就是登陸頁面的url)、cookies

  • 查看登陸表單是否請求成功,可查看響應狀態login_page.status_code。返回值200,表請求成功;303,表重定向;400,表請求錯誤;401,表未授權;403,表禁止訪問;404,表文件未找到,500,表服務器錯誤。

表單登陸頁面:http://www.santostang.com/wp-login.php

表單中的重定向網址:http://www.santostang.com/wp-admin/

登陸成功目標網址:http://www.santostang.com/wp-admin/profile.php

NOTE1

  • 獲得Headers的參數的捷徑, 在登錄頁,不輸入用戶及用戶名,點擊登錄框,查看F12 中 request headers,post_data的參數,如上,headers中的cookied也必須有login_page=requests.post(post_link,data=post_data,headers=headers,allow_redirects=False)中的allow_redirects=False必須有,不然
    login_page.status_code 的返回值為200,其實去了post_data中的redirect_to 重定向網頁中,而不是跳轉到目標網頁;添加該屬性,返回的是302,完成了post的第一次請求,其respons header中location屬性值即為profile的url,可以此url向服務器發送第二次請求。即可以此url采集數據。

  • 但是我不懂,資料中對headers的參數及post參數的設定不明確,漏掉了cookie及allow_redirects 導致剛開始一直進入重定向網址,而獲取不到目標網頁的網址。還是官方文檔比較靠譜。http://www.python-requests.org/en/master/user/quickstart/#redirection-and-history

2、處理cookies(記住cookies,登陸)

參考網址:https://blog.csdn.net/zhu_free/article/details/50563756

通過session,可記錄網頁cookies中用戶信息,以避免每次登陸的時候都要輸用戶名及密碼。只要將第一次接觸的網頁cookies 用session 存儲,或者將多次網頁的cookies從session中提取,即可。

3、疑難雜症

(1)一直搞不懂,網頁network headers中response headers和requests headers 是干蛤的。

http://www.santostang.com/wp-login.php

post第一次請求 http://www.santostang.com/wp-admin/profile.php

登陸后http://www.santostang.com/wp-admin/profile.php

  • 每個url,都會有requests和respons,其實每次請求都會用到這兩個。requests 可以理解是向服務器發送請求需要的,而respon是服務器接收到請求后,反饋回來的。

  • 在表單登陸的過程中,由login網頁到進入profile的過程。由圖二可知,所以我們第一次從login進入到profile的request method 是post,status code 是302 Found;所以我們在login到profile需要用post,而不是get。

  • post請求進入profile的過程我們可以用兩次請求理解。第一次以login 這個url想服務器發送請求返回login 的response有一個狀態碼 302 foubd、location和cookies(其實就是圖二的respons 內容);第二次用login response headers 的這個location url再向服務器發送請求,返回的就是想進入的location url界面。

  • 由上可知,進入到profile url 前,想象增加一個中間頁面,如圖三,雖然瀏覽器中已經是pofile的地址,但其general 的request url 還是login ,其respons可以理解為post login url第一次請求后服務器返回的內容(location、cookies 已找到),request可以理解以location、cookies第二次向服務器發送請求的要求(所以Referer是login,並且在我們post請求的headers 參數值中),且增加一塊From data,就是post的參數字典。但是進入location url ,如圖四,其general url 變成 profile 、request method 為get、status code 為200 。

  • 一個重定向網址,就是為了記住登錄前的網頁,這樣,不會每次登陸后都回到 首頁。

(2)cookies

其實cookies就是每個登陸的鑰匙。

(3)其實還是不是很懂這種網頁的東西,記得很繞,不是理論,就是自己的催眠自己的理解。希望不要誤導到人。慎入,哈哈。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM