Python 请求模块:Post 并转到下一页
Python requests module : Post and go to next page
我正在使用 python 的请求模块在网页上填写表格。我将表单作为 POST 请求提交,效果很好。我从 POST 得到了预期的响应。但是,这是一个多步骤的形式;在第一个 "submit" 之后,站点在同一页面上加载另一个表单(使用 AJAX)。 post 响应有这个 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
以某种方式发送到 twill 或 mechanize,并使用 Mechanize 的表格填写 API 吗?任何想法都会有所帮助。
使用机械化:
#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
这里的问题是您需要实际与页面上的 javascript 进行交互。 requests
,虽然是一个优秀的库,但不支持 javascript 交互,它只是一个 http 库。
如果您想以有意义的方式与 javascript 丰富的网页进行交互,我建议 selenium。 Selenium 实际上是一个完整的 Web 浏览器,可以完全像人一样导航。
主要问题是您会发现速度急剧下降。呈现网页比原始 html 请求花费的时间长得多。如果这对你来说是一个真正的交易破坏者,你有两个选择:
- Go headless:这里有很多选择,但我个人更喜欢casper。通过无头浏览,您应该会看到浏览时间加快了约 3 倍,但每个站点都不同。
- 找到一种通过 http 完成所有操作的方法:大多数非可视化站点功能都具有等效的 http 功能。使用 google 开发人员工具网络选项卡,您可以深入了解实际启动的请求,然后在 python.
中复制这些请求
就您提到的工具而言,mechanize
和 twill
都无济于事。由于您这里的主要问题是 javascript 交互而不是 cookie 管理,并且这些框架都不支持 javascript 交互,因此您会 运行 遇到相同的问题。
更新:如果 post 响应实际上是新页面,那么您实际上根本没有与 AJAX 进行交互。如果是这种情况并且您实际上拥有原始 html,您应该简单地模仿表单将发送的典型 http 请求。您在第一个表单上使用的相同方法将适用于第二个表单。您可以从 HTML 响应中获取信息,或者简单地对连续的请求进行硬编码。
我正在使用 python 的请求模块在网页上填写表格。我将表单作为 POST 请求提交,效果很好。我从 POST 得到了预期的响应。但是,这是一个多步骤的形式;在第一个 "submit" 之后,站点在同一页面上加载另一个表单(使用 AJAX)。 post 响应有这个 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
以某种方式发送到 twill 或 mechanize,并使用 Mechanize 的表格填写 API 吗?任何想法都会有所帮助。
使用机械化:
#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
这里的问题是您需要实际与页面上的 javascript 进行交互。 requests
,虽然是一个优秀的库,但不支持 javascript 交互,它只是一个 http 库。
如果您想以有意义的方式与 javascript 丰富的网页进行交互,我建议 selenium。 Selenium 实际上是一个完整的 Web 浏览器,可以完全像人一样导航。
主要问题是您会发现速度急剧下降。呈现网页比原始 html 请求花费的时间长得多。如果这对你来说是一个真正的交易破坏者,你有两个选择:
- Go headless:这里有很多选择,但我个人更喜欢casper。通过无头浏览,您应该会看到浏览时间加快了约 3 倍,但每个站点都不同。
- 找到一种通过 http 完成所有操作的方法:大多数非可视化站点功能都具有等效的 http 功能。使用 google 开发人员工具网络选项卡,您可以深入了解实际启动的请求,然后在 python. 中复制这些请求
就您提到的工具而言,mechanize
和 twill
都无济于事。由于您这里的主要问题是 javascript 交互而不是 cookie 管理,并且这些框架都不支持 javascript 交互,因此您会 运行 遇到相同的问题。
更新:如果 post 响应实际上是新页面,那么您实际上根本没有与 AJAX 进行交互。如果是这种情况并且您实际上拥有原始 html,您应该简单地模仿表单将发送的典型 http 请求。您在第一个表单上使用的相同方法将适用于第二个表单。您可以从 HTML 响应中获取信息,或者简单地对连续的请求进行硬编码。