Python 3,使用请求(库)填写表单返回同一页面 HTML,无需输入参数

标签 python html selenium python-requests mechanize

我正在尝试使用请求来填写 https://www.doleta.gov/tradeact/taa/taa_search_form.cfm 上的表单并返回打开的新页面的 HTML 并从新页面中提取信息。

这是相关的 HTML

  <form action="taa_search.cfm" method="post" name="number_search" id="number_search" onsubmit="return validate(this);">
    <label for="input">Petition number</label>
    :
    <input name="input" type="text" size="7" maxlength="7" id="input">
    <input type="hidden" name="form_name" value="number_search" />
    <input type=submit value="Get TAA information" />
  </form>

这是我尝试使用的 python 代码。

url = 'https://www.doleta.gov/tradeact/taa/taa_search.cfm'
payload = {'number_search':'11111'}
r = requests.get(url, params=payload)
with open("requests_results1.html", "wb") as f:
    f.write(r.content)

当您手动执行查询时,此页面将打开 https://www.doleta.gov/tradeact/taa/taa_search.cfm .

但是,当我使用上面的Python代码时,它返回https://www.doleta.gov/tradeact/taa/taa_search_form.cfm的HTML (第一页)没有什么不同。

我无法在 https://www.doleta.gov/tradeact/taa/taa_search.cfm 上执行类似的代码因为它重定向到第一个 URL,因此运行代码会返回第一个 URL 的 HTML。

由于我的计算机的权限设置,我无法重定向我的 PC 的路径(这意味着 Selenium 不可用),并且我无法安装 Python 2(这意味着 mechanize 不可用)。我愿意使用 urllib,但不太了解这个库。

我需要执行此操作约 10,000 次才能废弃信息。我可以自己构建迭代部分,但我不知道如何让基本函数正常工作。

最佳答案

第一个观察结果是,您似乎在示例代码中使用 get 请求,而不是 post 请求。

<form action="taa_search.cfm" method="post" ...>
                              ^^^^^^^^^^^^^

更改为 post 请求后,我仍然得到与您相同的结果(来自主搜索表单页面的 html)。经过一些实验,我似乎能够通过在标题中添加 referer 来获得正确的 html 结果。

这是代码(我只是为了示例目的注释掉了写入文件部分):

import requests

BASE_URL = 'https://www.doleta.gov/tradeact/taa'


def get_case_decision(case_number):
    headers = {
        'referer': '{}/taa_search_form.cfm'.format(BASE_URL)
    }
    payload = {
        'form_name': 'number_search',
        'input': case_number
    }
    r = requests.post(
        '{}/taa_search.cfm'.format(BASE_URL),
        data=payload,
        headers=headers
    )
    r.raise_for_status()
    return r.text
    # with open('requests_results_{}.html'.format(case_number), 'wb') as f:
    #     f.write(r.content)

测试:

>>> result = get_case_decision(10000)
>>> 'MODINE MFG. COMPANY' in result
True
>>> '9/12/1980' in result
True
>>> result = get_case_decision(10001)
>>> 'MUSKIN CORPORATION' in result
True
>>> '2/27/1981' in result
True

既然您提到您需要执行此操作约 10,000 次,您可能需要考虑使用 requests.Session也是如此。

关于Python 3,使用请求(库)填写表单返回同一页面 HTML,无需输入参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48847881/

相关文章:

javascript - 如何在单击表格中的按钮时添加动态行?

java - 如何使用 Selenium 默认启用地理位置?

javascript - 来自 Javascript API 的 Selenium WebDriverJS

python - DJANGO REST 和 mongoengine 中的 PUT 测试用例

python - 如何在 sklearn 中使用 datasets.fetch_mldata()?

html - 具有 first-child 伪语法的 CSS ID 选择器使用空格是否正确?

java - Selenium 网络驱动程序 | java |无法在 Firefox 浏览器窗口之间切换

python - 如何将 Django 模型元选项应用于我未编写的模型?

python - osx 上 python 2.7.4 的连接出现段错误 - 正确的行为还是错误?

javascript - 通过 AngularJS 创建带有虚拟内容的更新 ListView