我正试图抓住这个网站:https://ssweb.seap.minhap.es/portalEELL/consulta_alcaldes
当您从第一个菜单中选择Alicante,然后从第二个菜单中选择Ayuntamiento de Abengibre时,您将看到一个包含结果的表格。这就是我要的。
我在Chrome控制台中看到,在下拉列表中选择值会生成POST请求。所以我认为用requests.post
params = {
"consulta_alcalde[_csrf_token]":"dd1546dd35bf0f1af4a1f3aac165a1b5",
"consulta_alcalde[id_provincia]":"2",
"consulta_alcalde[id_entidad]":"17926"
}
r = requests.post("https://ssweb.seap.minhap.es/portalEELL/consulta_alcaldes", params)
但是当我检查r.text包含什么时,我得到200响应,但无法从表中看到我的数据。我做错了什么?
我知道可以用Selenium完成,但我试图避免它,因为它非常慢。
编辑:
根据Brian的建议,我将代码修改为:
params = {
"consulta_alcalde[_csrf_token]":"dd1546dd35bf0f1af4a1f3aac165a1b5",
"consulta_alcalde[id_provincia]":"2",
"consulta_alcalde[id_entidad]":"17951",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
}
with requests.Session() as s:
s.get("https://ssweb.seap.minhap.es/portalEELL/consulta_alcaldes")
r = s.post("https://ssweb.seap.minhap.es/portalEELL/consulta_alcaldes", data=params)
但仍然没有运气......
答案 0 :(得分:1)
" csrf_token"不是静态的,您必须使用bs4
解析页面才能获得它
该网站还通过xhr请求提供内容,因此您需要拥有" XMLHttpRequest"在标题中。代码:
url = 'https://ssweb.seap.minhap.es/portalEELL/consulta_alcaldes'
s = requests.Session()
r = s.get(url, verify=False)
soup = BeautifulSoup(r.content, 'html.parser')
csrf_token = soup.find('input', id="consulta_alcalde__csrf_token")['value']
data = {
"consulta_alcalde[_csrf_token]":csrf_token,
"consulta_alcalde[id_provincia]":"2",
"consulta_alcalde[id_entidad]":"17951"
}
headers = {"X-Requested-With":"XMLHttpRequest"}
r = s.post(url, data=data, headers=headers, verify=False)
print(r.content)
答案 1 :(得分:0)
通过发布请求,有效负载应该是请求的主体。为此,请使用data关键字参数传递params。
requests.post(url, data=payload)
如果帖子需要json,那么您可以使用json.dumps
或者只是将有效负载传递给json关键字参数。
requests.post(url, json=payload)