簡體   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