我正在尝试使用请求来填写 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/