2015-06-29 39 views
0

我使用python的請求模塊在網頁上填寫表單。我將該表單作爲POST請求提交,工作正常。我得到POST的預期迴應。不過,這是一個多步驟的形式;在第一次「提交」之後,該網站會在同一頁面上加載另一個表單(使用AJAX)。帖子回覆有這個HTML頁面。現在,我該如何使用此響應來填寫新頁面上的表單?我能以某種方式交織使用斜紋或機械化的請求模塊嗎?Python請求模塊:發佈並轉到下一頁

這裏的POST代碼:

import requests 
from requests.auth import HTTPProxyAuth 
import formfill 
from twill import get_browser 
from twill.commands import * 
import mechanize 
from mechanize import ParseResponse, urlopen, urljoin 

http_proxy = "some_Proxy" 
https_proxy = "some_Proxy" 

proxyDict = { 
       "http" : http_proxy, 
       "https" : https_proxy 
      } 

auth = HTTPProxyAuth("user","pass") 
r = requests.post("site_url",data={'key':'value'},proxies=proxyDict,auth=auth) 

上面的響應r,包含源於提交表單中的新的HTML頁面。這個HTML頁面也有一個我必須填寫的表格。我可以發送這個r以某種方式進行斜紋或機械化,並使用Mechanize的表格填充API?任何想法都會有所幫助。

回答

2

這裏的問題是,你需要真正與頁面上的JavaScript交互。 requests,雖然是一個優秀的庫不支持JavaScript交互,但它只是一個http庫。

如果你想以一種有意義的方式與富含JavaScript的網頁交互,我會建議selenium。 Selenium實際上是一個完全可以像人一樣導航的完整的Web瀏覽器。

主要問題是你會看到你的速度急劇下降。渲染一個網頁需要比原始的html請求長得多的時間。如果這對你來說是一個真正的交易斷路器,你有兩種選擇:

  • 去無頭:這裏有很多選擇,但我個人更喜歡casper。你應該看到瀏覽時間快3倍,但每個網站都不一樣。
  • 找到一種方法來通過http做所有事情:大多數非可視網站功能都具有相同的http功能。使用谷歌開發者工具網絡標籤,你可以挖掘出實際啓動的請求,然後在Python中複製這些請求。

至於你提到的工具,mechanizetwill都不會幫助。由於您的主要問題是JavaScript交互而不是Cookie管理,並且這兩種框架都不支持JavaScript交互,所以您會遇到同樣的問題。

更新:如果帖子迴應實際上是新的頁面,那麼你實際上並沒有真正與AJAX進行交互。如果是這種情況,並且您實際上擁有原始html,那麼您應該簡單地模仿表單將發送的典型http請求。第一種形式使用的方法將適用於第二種形式。您可以從HTML響應中獲取信息,或者簡單地對接連的請求進行硬編碼。

0

使用機械化:

#get the name of the form 
for form in br.forms(): 
print "Form name:", form.name 
print form 
#select 1st form on the page - nr=1 for next etc etc 
#OR just select the form with the name br.select_form(form.name) 
br.select_form(nr=0) 
br.form['form#'] = 'Test Name' 
#fill in the fields 
r = br.submit() #can always pass in additional params 
+0

機械化:它不會解決這些問題 –

+0

可能,我寧願使用Selenium,但自從他特意提出這個問題之後,我想這可能會有所幫助,但是是的 - 沒有支持javascripty的東西:\ –

+1

心是在正確的地方,但硒在這裏是有幫助的,機械化不是。 –