天天看點

form送出後重新整理網頁_【VSRC唯科普】穿越網頁表單與登入視窗的采集(第9/14篇)...

鳴 謝

form送出後重新整理網頁_【VSRC唯科普】穿越網頁表單與登入視窗的采集(第9/14篇)...

VSRC感謝業界小夥伴——Mils 投稿精品科普類文章。VSRC歡迎精品原創類文章投稿,優秀文章一旦采納釋出,将有好禮相送,我們已為您準備好了豐富的獎品!

(活動最終解釋權歸VSRC所有)

到目前為止,唯科普所有示例中的代碼,在和大多數網站伺服器進行資料互動時,都是采用了HTTP協定的GET方式去請求資訊。今天的唯科普,将重點介紹POST方法,即把資訊推送到伺服器進行存儲和分析。在頁面進行表單送出的方式可以被認為是一種使用者送出POST請求的方式,且這種請求方式是伺服器能夠了解和使用的,就像點選網站的URL連結後可以發送一條GET請求一樣,HTML表單則可觸發POST請求,這些都可以通過Python代碼來模拟實作。希望本文能對你的python學習有用。

1.讓HTTP服務人類的Requests庫

Python有很多标準庫可以控制網頁表單,其中的Request庫則較為擅長處理複雜的HTTP請求、cookie、header(響應和請求頭)等内容,Requests是用Python語言編寫,基于 urllib,采用 Apache2 Licensed 開源協定的 HTTP 庫。它比 urllib 更加友善,可以節約我們大量的工作,完全滿足 HTTP 測試需求。Requests 的設計是以 PEP 20 為原則,這使得其似乎顯得更加 Pythoner。

Python之禅:PEP20--The Zen of Python

Beautiful is better than ugly.

Explicit is better than implicit.

Simple is better than complex.

Complex is better than complicated.

Flat is better than nested.

Sparse is better than dense.

Readability counts.

Special cases aren't special enough to break the rules.

Although practicality beats purity.

Errors should never pass silently.

Unless explicitly silenced.

In the face of ambiguity, refuse the temptation to guess.

There should be one-- and preferably only one --obvious way to do it.

Although that way may not be obvious at first unless you're Dutch.

Now is better than never.

Although never is often better than *right* now.

If the implementation is hard to explain, it's a bad idea.

If the implementation is easy to explain, it may be a good idea.

Namespaces are one honking great idea -- let's do more of those!

在Windows裡面通過指令行pip install requests便可完成安裝,并且在Python裡面直接通過import requests直接導入該子產品便可使用,我們可以通過requests模拟發送一條使用GET方式通路VSRC主站:https://sec.vip.com的請求并獲得傳回值:200。

import requests
r = requests.get("https://sec.vip.com")
print r.status_code
           

2.送出一個基本表單

下面我們來看如何使用Requests庫送出一個基本的表單,通常最基本的網頁表單通常由一些HTML字段、送出按鈕、在表單處理完成之後的action值即“執行結果”頁面構成。表單源碼如下:

html>
<html >
<head>
    <meta charset="UTF-8">
    <title>form1title>
head>
<form method="post" action="processing.php">
<br> First Name: <input type="text" name="firstname"> br>
<br> Last Name:  <input type="text" name="lastname"> br>
<br> <input type="submit" value="submit">
form>
body>
html>
           

注意這裡的輸入字段名稱是First Name和Last Name,字段的名稱決定了表單被确認後要傳送到伺服器上的變量名稱,在模拟資料傳遞的過程中,我們需要確定變量名稱與字段名稱相一緻。該表單的真實行為實際發生的頁面為processing.php,我們送出的POST請求其實都發生在這個頁面上,并非表單本身。這裡值得注意的是HTML表單的目的,隻是幫助網站的通路者發送格式合理的請求。使用Requests庫送出表單隻需要四行代碼即可,包括導入庫檔案和列印内容的語句:

import requests
params = {'firstname':'Mils','lastname':'Huang'}
r = requests.post ('http://pythonscraping.com/pages/files/processing.php', data=params)
print (r.text)
           

表單被送出之後,程式會傳回以下内容:

Hello there, Mils Huang!
           

3.單選按鈕、複選框和其他輸入

除了文字字段和送出按鈕,HTML标準裡提供了大量可用的表單字段:單選按鈕、複選框和下拉選框等。無論表單的字段多麼複雜,仍然需要着重關注兩件事情:字段名稱和值。如果不确定一個輸入的字段值的資料格式,有些工具可以跟蹤浏覽器的輸入和輸出,最好也是最直覺的辦法就是檢視GET請求,就像之前提到的檢視網站URL。如果網站的URL格式類似如下所示:

http://testdomain.com?thing1=param1&thing2=param2
           

那麼應該就能知道這個請求對應的表單如下:

html>
<html >
<head>
    <meta charset="UTF-8">
    <title>form2title>
head>
<body>
<form method="GET" action="someProcessor.php">
<input type="input1" name="thing1" value="param1" />
<input type="input2" name="thing2" value="param2" />
<input type="submit" value="Submit" />
form>
body>
html>
           

對應的python參數則為:

{'thing1':'param1','thing2':'param2'}
           

小貼士:可以使用Chrome浏覽器的審查元素(inspector)或開發者工具都能幫助我們檢視浏覽器向伺服器所傳遞的資料内容。

以VSRC的注冊頁面為例,我們在注冊的時候通過inspector檢視便能發現其注冊位址為:

Request URL:https://sec.vip.com/doregister
           

通過inspector檢視其實際需要送出的表單元素如圖所示:

form送出後重新整理網頁_【VSRC唯科普】穿越網頁表單與登入視窗的采集(第9/14篇)...

注冊成功則會傳回以下提示:

form送出後重新整理網頁_【VSRC唯科普】穿越網頁表單與登入視窗的采集(第9/14篇)...

4.送出檔案和圖像

接下來我們來看上傳檔案及圖像的功能,以下示例用于檔案上傳,源碼如下:

html>
<html >
<head>
    <meta charset="UTF-8">
    <title>form3fileuploadtitle>
head>
<body>
<form action="processing2.php" method="post" enctype="multipart/form-data">
    Pls submit a jpg, png, or gif:
    <input type="file" name="image">
    <input type="submit" value="Upload File">
form>
body>
html>
           

可以看到在标簽内有一個type屬性,使用Python處理方式如下:

import requests
files = {'uploadFile':open('anonymous.png','rb')}
r=requests.post("http://pythonscraping.com/pages/processing2.php",files=files)
print (r.text)
           

這裡送出給表單字段fileupload的值是一個用open函數打開的python檔案對象,在這個例子中我送出了一個儲存在與該腳本處于相同路徑下的anonymous.png圖檔檔案。

5.處理登陸和Cookie

大多數網站都會使用cookie來記錄使用者是否已登入的狀态,一旦網站驗證了你的登入,網站就會将他們儲存在你的浏覽器的cookie中,裡面通常包含一個網站生成的令牌、登入有效時限和狀态跟蹤資訊。網站會把這個cookie當作資訊驗證的證據,在浏覽每個頁面時出示給到伺服器。

#登陸界面:我們以一個簡單的登陸表單為例:使用者名可以是任意值,但是密碼必須是"password"
http://pythonscraping.com/pages/cookies/login.html
#歡迎界面:這個表單在歡迎頁面進行登陸資料的處理:
http://pythonscraping.com/pages/cookies/welcome.php
#簡介界面:并且内部包含一個簡介頁面:
http://pythonscraping.com/pages/cookies/profile.php
           

如果在登入網站之前你想先進入“歡迎頁面”或“簡介界面”,會看到一個錯誤資訊和通路前請先登入的指令,在簡介頁面中,網站會檢測浏覽器的cookie,檢查他是否存在頁面已登入的設定資訊。

下面我們來使用Request庫跟蹤cookie資訊:

import requests
params = {'username':'Mils','password':'password'}
r = requests.post("http://pythonscraping.com/pages/cookies/welcome.php",params)
print ("Cookie is set to:",r.cookies.get_dict())
r = requests.get("http://pythonscraping.com/pages/cookies/profile.php",cookies=r.cookies)
print (r.text)
           

這段代碼示範的是一個較為簡單的登入頁面,我們能看到它首先向歡迎頁面發送了一個登入參數,然後從請求結果中擷取cookie并列印登入狀态的驗證結果,再通過cookies參數把cookie發送到簡介頁面。

對于較為複雜的網站及并不想使用cookie的頁面該如何處理?這裡我們可以使用Requests庫的session函數來解決這個問題:

import requests
session = requests.Session()
params = {'username':'username','password':'password'}
s = session.post('http://pythonscraping.com/pages/cookies/welcome.php',params)
print ("Cookie is set to:", s.cookies.get_dict())
s = session.get('http://pythonscraping.com/pages/cookies/profile.php')
print (s.text)
           

在這個例子中,會話(session)對象調用requests.Session() 擷取會持續跟蹤會話的資訊,像cookie、header,甚至包括運作HTTP協定的資訊,比如HTTPAdapter為HTTP和HTTPS的連結會話提供統一接口。 

6.參考資料

1、http://cn.python-requests.org/zh_CN/latest/

2、https://www.python.org/dev/peps/

3、《Web Scraping with Python》

唯科普 | 《資料采集》目錄

A.K.A "小白終結者"系列

第1篇、初識網絡通信

第2篇、來點更精彩的正規表達式吧

第3篇、多種資料采集方式

第4篇、讓我們加入點API

第5篇、資料的存儲

第6篇、文檔讀取

第7篇、資料清洗

第8篇、自然語言處理之概括資料(上篇)

第8篇、自然語言處理之馬爾可夫模型(中篇)

第8篇、自然語言處理之六度分割終極篇(下篇)

第9篇、穿越網頁表單與登入視窗的采集

第10篇、關于資料的采集姿勢

第11篇、圖像識别與文字處理

第12篇、避開采集的陷阱

第13篇、開始來點正經的吧

第14篇、一點總結與心得

精彩原創文章投稿有驚喜!

form送出後重新整理網頁_【VSRC唯科普】穿越網頁表單與登入視窗的采集(第9/14篇)...

歡迎投稿!

VSRC歡迎精品原創類文章投稿,優秀文章一旦采納釋出,将為您準備的豐富獎金稅後1000元現金或等值禮品,上不封頂!如若是安全文章連載,獎金更加豐厚,稅後10000元或等值禮品,上不封頂!還可領取精美禮品!

我們聆聽您寶貴建議

不知道,大家都喜歡閱讀哪些類型的資訊安全文章?

不知道,大家都希望我們更新關于哪些主題的幹貨?

現在起,隻要您有任何想法或建議,歡迎直接回複本公衆号留言!

精彩留言互動的熱心使用者,将有機會獲得VSRC贈送的精美獎品一份!

同時,我們也會根據大家回報的建議,選取熱門話題,進行原創釋出!

繼續閱讀