我正在尝试从墨西哥中央银行的网站上搜索数据但是已经碰壁了。在操作方面,我需要首先访问初始URL中的链接。访问链接后,我需要选择2个下拉值,然后点击激活提交按钮。如果一切顺利,我将被带到一个新的URL,其中提供了一组pdf链接。
原始网址是:
“Qazxswpoi”
嵌套的URL(带有dropbox的URL)是:“http://www.banxico.org.mx/mercados/valores-gubernamentales-secto.html”
输入(任意)是:'07 / 03/2019'和'14 / 03/2019'。
使用BeautifulSoup和请求我觉得我已经填充了Dropbox中的值,但未能单击按钮并使用链接列表实现最终URL。
我的代码如下:
http://www.banxico.org.mx/valores/LeePeriodoSectorizacionValores.faces?BMXC_claseIns=GUB&BMXC_lang=es_MX
在代码中,respo.url等于url ...代码失败。任何人都可以帮我确定问题所在?我是一个刮痧的新手,这可能是显而易见的 - 提前道歉......我会感激任何帮助。谢谢!
上次检查时,您无法通过单击BeautifulSoup和Python按钮提交表单。我经常看到两种方法:
如果表单进行AJAX调用(例如在幕后发出请求,对于用React或Angular编写的SPA来说很常见),那么最好的方法是使用Chrome或其他浏览器中的网络请求选项卡来了解端点是什么以及什么是有效载荷。获得这些答案后,您可以使用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)
向requests
库发出POST请求(例如,手动执行表单在幕后执行的操作)。阅读data=your_payload_dictionary
以获得更精细的教程。
如果网站是用ASP.NET或类似的MVC框架编写的,那么最好的方法是使用无头浏览器填写表单并单击提交。一个流行的框架是this post。这模拟了普通的浏览器。阅读Selenium以获得更精细的教程。
通过粗略看一下您正在处理的页面,我推荐方法#2。
你要抓的页面是:
从有效负载和http://www.banxico.org.mx/valores/PresentaDetalleSectorizacionGubHist.faces,JSESSIONID
中的cookie以及请求标题中的所有旧东西中添加日期以咨询和Referer
例:
User-Agent
当只是点击页面时,看起来有某种cookie /会话内容在使用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)
时可能很难考虑。
(例如:requests
)
使用http://www.banxico.org.mx/valores/LeePeriodoSectorizacionValores.faces;jsessionid=8AkD5D0IDxiiwQzX6KqkB2WIYRjIQb2TIERO1lbP35ClUgzmBNkc!-1120047000编写代码可能更容易,因为这将自动化浏览器(并处理所有标题和诸如此类的东西)。您仍然可以访问html以获取所需内容。你可以在selenium
中重复使用你正在做的很多东西。