python - 寻找与 Mechanize 功能等效的 Requests

标签 python mechanize python-requests

我很想知道 Requests 是否可以处理我主要在 Mechanize 中完成的一些任务。

Mechanize 可以轻松处理填写表单和提交表单,但我很难尝试在 Requests 中做同样的事情。

例如,

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()

请求是否等同于:

import requests
url = "https://www.euronext.com/en/data/download?ml=nyx_pd_stocks&cmd=default&formKey=nyx_pd_filter_values%3A18d1ee939a63d459d9a2a3b07b8837a7"
payload = {'format':'2','date_format':'2'}
r = requests.post(url, data=payload)

requests.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)>>

最佳答案

requests 与 Mechanize 的角色不同。

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

使用类似 robobrowser 的项目反而;它包装了 requests 以及 BeautifulSoup加载网页,解析表单元素,帮助您填写这些元素并再次提交。

如果您想 请求,您需要确保您发布了表单定义的所有字段。这意味着您需要查看 method 属性(默认为 GET)、action 属性(默认为当前 URL),并在所有 inputselecttextareabutton 元素。服务器可能还需要 HTTP 请求中的其他信息,例如 cookie 或 Referer (sic) header 。

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

关于python - 寻找与 Mechanize 功能等效的 Requests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25893517/

相关文章:

python - 我应该把这些功能放在哪里?在 models.py 内还是在views.py 内?

python - 使用 pandas 进行滚动统计模型协整

Python:beautifulsoup 的输出编码错误

Python ssl 登录卡在 Debian 上

ruby - 使用 Ruby Mechanize 难以访问网站部分

python - 记录来自 python-requests 模块的所有请求

python - 无法解析 'requests' 。此模块可能缺少 IntelliSense。 Visual Studio /Python

python - 为什么仅在带有 python 3.5 的 Jupyter notebook 中给出 SyntaxError : invalid syntax with async def?

python - Pypy 写文件慢

python - 根据位置抓取亚马逊价格时,cookie 随机无法保留位置信息?