Python 3、填表有request(库)returns同页HTML不输入参数

Python 3, filling out a form with request (library) returns same page HTML without inputting parameters

我正在尝试使用请求在打开的新页面的 https://www.doleta.gov/tradeact/taa/taa_search_form.cfm 和 return 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 代码时,它 return 是 https://www.doleta.gov/tradeact/taa/taa_search_form.cfm(第一页)的 HTML,没有什么不同。

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

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

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

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

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

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

来获得正确的 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