1

我正在使用 python 的请求模块在网页上填写表格。我将表单作为 POST 请求提交,效果很好。我从 POST 中得到了预期的响应。然而,它是一个多步骤的形式;在第一次“提交”之后,站点在同一页面上加载另一个表单(使用 AJAX)。发布响应有这个 HTML 页面。现在,我如何使用此响应来填写新页面上的表单?我可以以某种方式将 Requests 模块与 Twill 或 Mechanize 交织在一起吗?

这是 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以某种方式将其发送到斜纹或机械化,并使用机械化的表单填写 API 吗?任何想法都会有所帮助。

4

2 回答 2

3

这里的问题是您需要与页面上的 javascript 进行实际交互。requests,虽然是一个优秀的库,但不支持javascript交互,它只是一个http库。

如果您想以有意义的方式与富含 javascript 的网页进行交互,我建议您使用selenium。Selenium 实际上是一个完整的网络浏览器,可以像人一样导航。

主要问题是你会看到你的速度急剧下降。呈现网页比原始 html 请求花费的时间要长得多。如果这对你来说是一个真正的交易破坏者,你有两个选择:

  • Go headless:这里有很多选择,但我个人更喜欢casper。通过无头模式,您应该会看到浏览时间加快了约 3 倍,但每个站点都是不同的。
  • 找到一种通过 http 完成所有事情的方法:大多数非可视站点功能都具有等效的 http 功能。使用 google developer tools 网络选项卡,您可以深入了解实际正在启动的请求,然后在 python 中复制这些请求。

就您提到的工具而言,既无mechanizetwill无济于事。由于您在这里的主要问题是 javascript 交互而不是 cookie 管理,并且这些框架都不支持 javascript 交互,您会遇到同样的问题。

更新:如果发布响应实际上是新页面,那么您实际上根本没有与 AJAX 交互。如果是这种情况并且您实际上拥有原始 html,您应该简单地模仿表单将发送的典型 http 请求。您在第一个表单上使用的相同方法将适用于第二个表单。您可以从 HTML 响应中获取信息,也可以简单地对连续的请求进行硬编码。

于 2015-06-30T20:43:52.193 回答
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
于 2015-06-30T20:37:21.067 回答