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
。
我正在尝试使用请求在打开的新页面的 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.
这是代码(出于示例目的,我只注释掉了写入文件部分):
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
。