爬蟲 處理登錄表單

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

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

參考書籍:Python網絡爬蟲從入門到實踐中http://www.santostang.com./wp-login.php;
用戶名:test;密碼:a12345;
參考網頁:http://www.javashuo.com/article/p-kqmizeim-bz.htmlhtml

登錄表單分爲兩步:python

  • 研究網站登錄表單,構建POST請求的參數字典瀏覽器

  • 提交POST請求;服務器

(1)參數字典

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

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

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

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

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

  • 記住登錄密碼 name的屬性值 做爲鍵值對中的key,value的屬性值做爲 鍵值對中的value

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

  • 在登錄表單中,有些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

綜上所述:創建參數字典,以下:

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

二、處理cookies(記住cookies,登錄)

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

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

三、疑難雜症

(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)其實仍是不是很懂這種網頁的東西,記得很繞,不是理論,就是本身的催眠本身的理解。但願不要誤導到人。慎入,哈哈。

相關文章
相關標籤/搜索