我正试图从墨西哥央行网站上搜集数据,但遇到了麻烦。在操作方面,我需要首先访问一个初始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…代码失败。有人能帮我找出问题出在哪里吗?我是刮胡子的新手,所以这可能是显而易见的-提前为此道歉…我将感谢任何帮助。谢谢!在
上次检查时,您不能通过单击带有BeautifulSoup和Python的按钮来提交表单。我经常看到两种典型的方法:
如果表单进行AJAX调用(例如,在后台发出请求,对于用React或Angular编写的spa来说很常见),那么最好的方法是使用Chrome或其他浏览器中的network requests选项卡来了解端点是什么以及负载是什么。一旦得到了这些答案,就可以使用
requests
库向使用data=your_payload_dictionary
的端点发出POST请求(例如,手动执行表单在幕后执行的操作)。阅读this post了解更详细的教程。在如果网站上写的是ASP.NET或者类似的MVC框架,那么最好的方法是使用headless浏览器填写表单并单击submit。一个流行的框架是Selenium。这将模拟普通浏览器。阅读this post以获得更详细的教程。在
粗略地看一下你正在处理的页面,我推荐第二种方法。在
你要刮的那一页是:
http://www.banxico.org.mx/valores/PresentaDetalleSectorizacionGubHist.faces
在有效负载中添加要咨询的日期和来自cookies的
JSESSIONID
,以及Referer
,User-Agent
以及请求头中所有旧的好东西示例:
当只需点击页面时,似乎有某种cookie/session的内容在使用
requests
时可能很难考虑这些内容。在(示例:http://www.banxico.org.mx/valores/LeePeriodoSectorizacionValores.faces;jsessionid=8AkD5D0IDxiiwQzX6KqkB2WIYRjIQb2TIERO1lbP35ClUgzmBNkc!-1120047000)
使用
selenium
编写代码可能更容易,因为这将使浏览器自动化(并处理所有标题等)。您仍然可以访问html来获取所需的内容。您可能还可以重用selenium
中所做的许多工作。在相关问题 更多 >
编程相关推荐