POST请求后没有内容

时间:2017-07-14 15:06:30

标签: python python-3.x web-scraping python-requests

我正试图抓住这个网站: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)

但仍然没有运气......

2 个答案:

答案 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)