繁体   English   中英

使用Python刮取下拉菜单+按钮

[英]Scraping with drop down menu + button using Python

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

原始网址是:

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

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

输入(任意)为:'07 / 03/2019'和'14 / 03/2019'。

使用BeautifulSoup和请求,我觉得我可以填写下拉列表中的值,但是无法单击按钮并使用链接列表获得最终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 ...代码失败。 有人可以帮助我确定问题出在哪里吗? 我是刮板的新手,所以这很明显-为此事向您道歉...我将不胜感激。 谢谢!

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

  1. 逆向工程表格

如果表单进行AJAX调用(例如,在幕后发出请求,这对于以React或Angular编写的SPA来说很常见),那么最好的方法是使用Chrome或其他浏览器中的网络请求标签来了解端点是什么以及有效载荷是。 获得这些答案后,您可以使用data=your_payload_dictionary端点发出带有requests库的POST请求(例如,手动执行表单在后台执行的操作)。 阅读这篇文章以获得更详尽的教程。

  1. 使用无头浏览器

如果网站是使用ASP.NET或类似的MVC框架编写的,则最好的方法是使用无头浏览器填写表单,然后单击提交。 一个流行的框架是Selenium 这模拟了普通的浏览器。 阅读这篇文章以获得更详尽的教程。

从粗略地看待您正在处理的页面来看,我建议采用方法2。

您必须抓取的页面是:

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

在有效载荷和RefererUser-Agent以及请求标头中的所有旧内容中添加cookie的查询日期和JSESSIONID

例:

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 /会话的事情,而在使用requests时可能难以考虑。

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

使用selenium编写代码可能会更容易,因为这将使浏览器自动化(并照顾所有标头和其他内容)。 您仍然可以访问html以便抓取所需的内容。 selenium您可能还可以重用很多您正在做的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM