Python 正在查找要向其发送post请求的url
我正在尝试从该站点获取数据: 我写了下面的代码来输入所需的开始日期,然后发布到表单中。我希望在您输入所需的开始日期后,我会看到弹出的页面;所需页面包含您可以单击以获取附加数据的所有业务。我看不到那一页。我认为网站安全阻止了我,或者我做错了什么。在一天结束时,我需要从站点的所有警告通知中提取数据 我怀疑可能我没有将POST请求发送到正确的url;如何找到发送POST请求的正确url 我从inspect元素获得了date4作为日期字段;我想这也可能是错误的Python 正在查找要向其发送post请求的url,python,selenium,beautifulsoup,python-requests,Python,Selenium,Beautifulsoup,Python Requests,我正在尝试从该站点获取数据: 我写了下面的代码来输入所需的开始日期,然后发布到表单中。我希望在您输入所需的开始日期后,我会看到弹出的页面;所需页面包含您可以单击以获取附加数据的所有业务。我看不到那一页。我认为网站安全阻止了我,或者我做错了什么。在一天结束时,我需要从站点的所有警告通知中提取数据 我怀疑可能我没有将POST请求发送到正确的url;如何找到发送POST请求的正确url 我从inspect元素获得了date4作为日期字段;我想这也可能是错误的 import requests param
import requests
params = {'date4': '01/01/2020'}
with requests.session() as s:
r = s.post("https://www.azjobconnection.gov/ada/mn_warn_dsp.cfm?securitysys=off&FormID=0", data=params)
site_text = r.text
查看此页面时,您缺少一些请求头,特别是真实性令牌。要抓住这一点,我们必须解析上一页的HTML才能找到它。请看这个快速示例:
# Imports
from bs4 import BeautifulSoup
from requests import Session
# Session Object
session = Session()
# Add a user agent, so the request looks more human like.
session.headers.update({
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"
})
# Initial sesssion, you need to fetch the url first, so the authenticity
# token can be parsed out of the html
init_session = session.get(url="https://www.azjobconnection.gov/ada/mn_warn_dsp.cfm?def=false")
# Beautiful soup object, used for HTML parsing
soup = BeautifulSoup(init_session.content, "html.parser")
# Get all of the input tags
inputs = soup.findAll('input')
# Upon running, we see that the authenticity token, is the first element in the array.
authenticty_token = inputs[0]['value']
# Now we can make our request!
# Request data
data = {
"authenticity_token" : authenticty_token,
"coname": "",
"coName_ADAdefault": "",
"coName_verify_char[0|50]": "The value you have supplied for Company Name is too long.",
"city": "",
"city_ADAdefault": "",
"city_verify_char[0|45]": "The value you have supplied for City is too long.",
"zip": "",
"zip_ADAdefault": "",
"zip_verify_char[0|10]": "The value you have supplied for Zip/Postal Code is too long.",
"sda": "",
"startdate": "01/01/2020",
"startDate_ADAdefault": "mm/dd/yyyy",
"startDate_verify_date4": "",
"startDate_verify_char[0|45]": "The value you have supplied for Start Date is too long.",
"enddate": "mm/dd/yyyy",
"endDate_ADAdefault": "mm/dd/yyyy",
"endDate_verify_date4": "",
"endDate_verify_char[0|45]": "The value you have supplied for End Date is too long.",
"layoffType": "y",
"search": "Search",
"old_choice": 1,
"ZIP_prev": "",
"def_prev": "false",
"CITY_prev": "",
"SDA_prev": "",
"STARTDATE_prev": "",
"CONAME_prev": "",
"ENDDATE_prev": "",
"FormName": "Form0",
}
# Get the data
get_warn_data = session.post("https://www.azjobconnection.gov/ada/mn_warn_dsp.cfm?securitysys=on&FormID=0", data=data)
# print the data, this looks messy, so lets prettify with bs4!
#print(get_warn_data.content)
soup = BeautifulSoup(get_warn_data.content, "html.parser")
print(soup.prettify())
这将为您获取所需的HTML。现在在这个HTML中,您需要解析a href标记来获取所需的链接。例如,它们将如下所示:
<tr class="cfOutputTableRow cfAlternate">
<td align="left" class="cfPadLeft cfAlternate" colspan="1" valign="top">
<span class="blTransparent">
<a href="mn_warn_dsp.cfm?id=399&callingfile=mn_warn_dsp.cfm&hash=0C2428869560C6832A1D929070C0278F">
Aecom
</a>
</span>
</td>
<td align="left" class="cfAlternate" colspan="1" valign="top">
<span class="blTransparent">
Glendale
</span>
</td>
<td align="left" class="cfAlternate" colspan="1" valign="top">
<span class="blTransparent">
85310
</span>
</td>
<td align="left" class="cfAlternate" colspan="1" valign="top">
<span class="blTransparent">
7
</span>
</td>
<td align="left" class="cfAlternate cfPadRight" colspan="1" valign="top">
<span class="blTransparent">
01/17/2020
</span>
</td>
</tr>
使用Firefox/Chrome中的
DevTools
(选项卡Network
)查看从浏览器发送的所有URL。但首先检查页面是否可以在没有JavaScirp的情况下工作,因为请求无法运行JavaScript。并且您应该使用web浏览器中使用的所有标题检查请求。通常,若并没有标题“用户代理”,那个么服务器会发送不同的数据。谢谢泰勒。我输入什么作为标题重要吗?我使用的是windows系统而不是Mac,这有关系吗?你问我想做什么:我试着在你输入日期后遍历所有出现的公司;我需要获取每家公司裁员的人数。最好在标题中使用用户代理。这会让你的请求看起来更合法。无论您使用的是哪种类型的操作系统。您可以使用任何想要的用户代理。Google windows用户代理,甚至通过检查浏览器开发工具中的请求头来获取您正在使用的用户代理。虽然包含所有请求头是最佳实践,但实际上您只需要身份验证令牌和要查找的字段。在服务器端,数据dict中遗漏的值将设置为零。运行代码后,在实际页面中输入日期时,我看不到看到的内容。输入开始日期后,应显示公司列表——“Aecom”应为第一家公司。然后单击每个公司以获得所需的数据。我无法访问公司列表。您需要包含所有请求标题。我更新了我的示例。完成后,您需要解析包含特定公司链接的a href标记,然后使用请求获取这些链接的内容。您真是了不起的泰勒。
<a href="mn_warn_dsp.cfm?id=399&callingfile=mn_warn_dsp.cfm&hash=0C2428869560C6832A1D929070C0278F">
https://www.azjobconnection.gov/ada/mn_warn_dsp.cfm?id=399&callingfile=mn_warn_dsp.cfm&hash=0C2428869560C6832A1D929070C0278F