【问题标题】:Python requests module : Post and go to next pagePython请求模块:发布并转到下一页
【发布时间】:2015-09-15 09:23:06
【问题描述】:

我正在使用 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 吗?任何想法都会有所帮助。

【问题讨论】:

    标签: python post mechanize twill


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      使用机械化:

      #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
      

      【讨论】:

      • 可能,我宁愿使用 Selenium,但由于他特别要求,我认为这可能会有所帮助,但是是的 - 不支持 javascripty 的东西:\
      • 心在正确的位置,但硒在这里很有帮助,而机械化则没有。
      猜你喜欢
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 2013-01-22
      相关资源
      最近更新 更多