寻找相当于机械化功能的请求

2024-09-29 23:26:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有兴趣看看请求是否可以处理我在Mechanize中主要执行的一些任务。在

Mechanize可以很容易地处理填写表单和提交表单,我很难在请求中做同样的事情。在

例如

import mechanize
br = mechanize.Browser()
url = "https://www.euronext.com/en/data/download?ml=nyx_pd_stocks&cmd=default&formKey=nyx_pd_filter_values%3A18d1ee939a63d459d9a2a3b07b8837a7"
br.open(url)
br.select_form(nr=1)
br.form['format']=['2']
br.form['date_format']=['2']
response = br.submit().read()

等效请求是否不是:

^{pr2}$

是的请求.post不提交表单下载页面上嵌入的CSV?在

此外,如需了解更多信息,页面上的表单如下所示:

for form in br.forms():
    print form

<POST https://www.euronext.com/en/data/download?ml=nyx_pd_stocks&cmd=default&formKey=nyx_pd_filter_values%3A18d1ee939a63d459d9a2a3b07b8837a7  application/x-www-form-urlencoded
    <TextControl(search_block_form=)>
    <SubmitControl(op=Search) (readonly)>
    <RadioControl(search_type=[*quote, site])>
    <HiddenControl(form_build_id=form-af2eb21e9b6448ffca4e358d0b52f499) (readonly)>
    <HiddenControl(form_id=search_block_form) (readonly)>
    <HiddenControl(search_target=search_instruments) (readonly)>
    <HiddenControl(search_language=&lan=) (readonly)>>
<POST https://www.euronext.com/en/data/download?ml=nyx_pd_stocks&cmd=default&formKey=nyx_pd_filter_values%3A18d1ee939a63d459d9a2a3b07b8837a7 application/x-www-form-urlencoded
  <RadioControl(format=[*1, 2, 3])>
  <RadioControl(layout=[*2, 1])>
  <RadioControl(decimal_separator=[*1, 2])>
  <RadioControl(date_format=[*1, 2])>
  <SubmitControl(op=Go) (readonly)>
  <SubmitControl(op=Cancel) (readonly)>
  <HiddenControl(form_build_id=form-37e81285a4dbf60e091037f904bac2eb) (readonly)>
  <HiddenControl(form_id=nyx_download_form) (readonly)>>

Tags: httpsbrformidformat表单searchdownload
2条回答

requests与Mechanize不同。在

Mechanize加载实际的HTML表单并对其进行解析,允许您为表单中的各个元素填充值。然后,当您要求Mechanize提交表单时,它将使用表单中的所有信息来向服务器生成一个有效的请求。这包括没有为其提供新值的任何表单元素,如果存在,则使用默认值。这包括浏览器中不可见的任何隐藏表单元素。在

使用类似robobrowser的项目;它包装requests和{a2}来加载网页、解析表单元素、帮助您填写这些元素并再次提交它们。在

如果您想使用请求,则需要确保您发布了表单定义的所有字段。这意味着您需要查看method属性(默认为GET)、action属性(默认为当前URL),以及所有inputselecttextarea和{}元素。服务器也可能希望在HTTP请求中包含附加信息,例如cookies或Referer(sic)报头。在

例如,您打印的Mechanize信息表明它已经从表单中解析了多个字段,而您没有为这些字段提供值。所讨论的表单还包含一个隐藏的输入字段,例如form_build_id,服务器可能依赖它。Mechanize还将捕获与原始表单请求一起发送的任何cookie,服务器也可能需要这些cookie来接受请求。robobrowser会考虑相同的上下文。在

可以使用requestsBeautifulSoup来完成操作:

import requests
import urlparse
from bs4 import BeautifulSoup
url = "https://www.euronext.com/en/data/download?ml=nyx_pd_stocks&cmd=default&formKey=nyx_pd_filter_values%3A18d1ee939a63d459d9a2a3b07b8837a7"
resp = requests.get(url, allow_redirects=True)

soup = BeautifulSoup(resp.text, "lxml")
forms = soup.findAll("form")
params = dict([(parm.get("name"), parm.get("value")) for parm in forms[1].findAll("input")])
params.update({'format':'2','date_format':'2'})
formAction = forms[1].get("action")
# Make the relative URL absolute.
formAction = urlparse.urlunsplit(urlparse.urlsplit(url)[0:2] + urlparse.urlsplit(formAction)[2:])

resp = requests.post(formAction, data=params)

相关问题 更多 >

    热门问题