使用Python使用下拉菜单+按钮进行抓取

2024-04-29 01:55:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图从墨西哥央行网站上搜集数据,但遇到了麻烦。在操作方面,我需要首先访问一个初始URL中的链接。一旦链接被访问,我需要选择2个下拉值,然后点击一个激活提交按钮。如果一切顺利,我将被带到一个新的url,那里有一组指向pdf的链接。在

原始url为:

http://www.banxico.org.mx/mercados/valores-gubernamentales-secto.html

嵌套的URL(带有dropbox的URL)是: “http://www.banxico.org.mx/valores/LeePeriodoSectorizacionValores.faces?BMXC_claseIns=GUB&BMXC_lang=es_MX

输入(任意)为:“07/03/2019”和“14/03/2019”。在

使用BeautifulSoup和requests,我觉得我可以在dropbox中填充值,但未能单击按钮并通过链接列表获得最终的url。在

我的代码如下:

from bs4 import BeautifulSoup
import requests

pagem=requests.get("http://www.banxico.org.mx/mercados/valores-gubernamentales-secto.html")
soupm = BeautifulSoup(pagem.content,"lxml")
lst=soupm.find_all('a', href=True)
url=lst[-1]['href']
page = requests.get(url)
soup = BeautifulSoup(page.content,"lxml")
xin= soup.find("select",{"id":"_id0:selectOneFechaIni"})
xfn= soup.find("select",{"id":"_id0:selectOneFechaFin"})
ino=list(xin.stripped_strings)
fino=list(xfn.stripped_strings)
headers = {'Referer': url}
data = {'_id0:selectOneFechaIni':'07/03/2019', '_id0:selectOneFechaFin':'14/03/2019',"_id0:accion":"_id0:accion"}
respo=requests.post(url,data,headers=headers)
print(respo.url)

在守则中,响应url等于url…代码失败。有人能帮我找出问题出在哪里吗?我是刮胡子的新手,所以这可能是显而易见的-提前为此道歉…我将感谢任何帮助。谢谢!在


Tags: orghttpurl链接wwwfindrequestsheaders
3条回答

上次检查时,您不能通过单击带有BeautifulSoup和Python的按钮来提交表单。我经常看到两种典型的方法:

  1. 对表单进行反向工程

如果表单进行AJAX调用(例如,在后台发出请求,对于用React或Angular编写的spa来说很常见),那么最好的方法是使用Chrome或其他浏览器中的network requests选项卡来了解端点是什么以及负载是什么。一旦得到了这些答案,就可以使用requests库向使用data=your_payload_dictionary的端点发出POST请求(例如,手动执行表单在幕后执行的操作)。阅读this post了解更详细的教程。在

  1. 使用无头浏览器

如果网站上写的是ASP.NET或者类似的MVC框架,那么最好的方法是使用headless浏览器填写表单并单击submit。一个流行的框架是Selenium。这将模拟普通浏览器。阅读this post以获得更详细的教程。在

粗略地看一下你正在处理的页面,我推荐第二种方法。在

你要刮的那一页是:

http://www.banxico.org.mx/valores/PresentaDetalleSectorizacionGubHist.faces

在有效负载中添加要咨询的日期和来自cookies的JSESSIONID,以及RefererUser-Agent以及请求头中所有旧的好东西

示例:

import requests
import pandas as pd

cl = requests.session()
url = "http://www.banxico.org.mx/valores/PresentaDetalleSectorizacionGubHist.faces"


payload = {
    "JSESSIONID": "cWQD8qxoNJy_fecAaN2k8N0IQ6bkQ7f3AtzPx4bWL6wcAmO0T809!-1120047000",
    "fechaAConsultar": "21/03/2019"
}

headers = {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
    "Content-Type": "application/x-www-form-urlencoded",
    "Referer": "http://www.banxico.org.mx/valores/LeePeriodoSectorizacionValores.faces;jsessionid=cWQD8qxoNJy_fecAaN2k8N0IQ6bkQ7f3AtzPx4bWL6wcAmO0T809!-1120047000"
}
response = cl.post(url, data=payload, headers=headers)
tables = pd.read_html(response.text)

当只需点击页面时,似乎有某种cookie/session的内容在使用requests时可能很难考虑这些内容。在

(示例:http://www.banxico.org.mx/valores/LeePeriodoSectorizacionValores.faces;jsessionid=8AkD5D0IDxiiwQzX6KqkB2WIYRjIQb2TIERO1lbP35ClUgzmBNkc!-1120047000

使用selenium编写代码可能更容易,因为这将使浏览器自动化(并处理所有标题等)。您仍然可以访问html来获取所需的内容。您可能还可以重用selenium中所做的许多工作。在

相关问题 更多 >