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

使用Python使用下拉菜单+按钮进行抓取,python,web-scraping,drop-down-menu,beautifulsoup,python-requests,Python,Web Scraping,Drop Down Menu,Beautifulsoup,Python Requests,我试图从墨西哥央行网站上搜集数据,但遇到了麻烦。在操作方面,我需要首先访问初始URL中的链接。一旦链接被访问,我需要选择2个下拉值,然后点击激活提交按钮。如果一切顺利,我将被带到一个新的url,那里有一组指向PDF的链接 原始url为: 带有dropbox的嵌套URL为: 输入是任意的,例如:“2019年3月7日”和“2019年3月14日” 使用BeautifulSoup和请求,我觉得我已经在dropbox中填充了值,但未能单击按钮并使用链接列表获得最终url 我的代码如下: from bs

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

原始url为:

带有dropbox的嵌套URL为:

输入是任意的,例如:“2019年3月7日”和“2019年3月14日”

使用BeautifulSoup和请求,我觉得我已经在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)

在代码中,respo.url等于url…代码失败。有人能帮我找出问题所在吗?我是一个新手刮,所以这可能是显而易见的-事先道歉…我会感谢任何帮助。谢谢

当点击页面时,看起来有一些cookie/session内容正在进行,在使用请求时可能很难考虑到这些内容

例如:


使用selenium编写代码可能更容易,因为这将使浏览器自动化,并处理所有的标题等等。您仍然可以访问html,以便能够获取所需内容。您可能也可以在selenium中重复使用许多您正在做的事情。

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

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

使用无头浏览器 如果网站是用ASP.NET或类似的MVC框架编写的,那么最好的方法是使用无头浏览器填写表单并单击提交。一个流行的框架是。这将模拟普通浏览器。阅读更详细的教程


粗略地看一下您正在处理的页面,我建议使用方法2。

您必须刮取的页面是:

在有效负载和Referer、用户代理和请求头中的所有旧内容中添加要咨询的日期和来自cookies的JSSessionID

例如:


非常感谢你。但是,如果我错了,请纠正我的错误-这并不能解决正确单击按钮的问题?非常感谢-这将是一次尝试。RGRD
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)