Соскоб с выпадающего меню + кнопка с использованием Python - PullRequest
1 голос
/ 09 апреля 2019

Я пытаюсь собрать данные с веб-сайта Центрального банка Мексики, но попал в стену.Что касается действий, мне нужно сначала получить доступ к ссылке в начальном URL.Как только ссылка будет доступна, мне нужно выбрать 2 раскрывающихся значения и нажать кнопку «Отправить».Если все пойдет хорошо, я перейду на новый URL, где доступен набор ссылок на PDF-файлы.

Исходный URL-адрес:

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

Вложенный URL-адрес (с раскрывающимся списком):" http://www.banxico.org.mx/valores/LeePeriodoSectorizacionValores.faces?BMXC_claseIns=GUB&BMXC_lang=es_MX"

входные данные (произвольные), скажем, '07 / 03/2019 'и '14 / 03/2019'. * 10101 *

Используя 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 ... код завершается ошибкой.Кто-нибудь может помочь мне определить, где проблема?Я новичок в расчистке, так что это может быть очевидно - заранее извиняюсь за это ... Буду признателен за любую помощь.Спасибо!

Ответы [ 3 ]

1 голос
/ 10 апреля 2019

В прошлый раз, когда я проверял, вы не можете отправить форму, нажимая кнопки в BeautifulSoup и Python. Обычно я вижу два подхода:

  1. Обратный инженер по форме

Если форма выполняет вызовы AJAX (например, делает запрос за кулисами, общий для SPA, написанных в React или Angular), тогда лучшим подходом является использование вкладки сетевых запросов в Chrome или другом браузере, чтобы понять, какова конечная точка и какова полезная нагрузка. Получив эти ответы, вы можете сделать запрос POST с библиотекой requests к этой конечной точке с помощью data=your_payload_dictionary (например, вручную выполнить то, что форма делает за кулисами). Прочитайте этот пост для более детального обучения.

  1. Использование браузера без головы

Если веб-сайт написан на чем-то похожем на ASP.NET или аналогичную инфраструктуру MVC, тогда лучшим подходом будет использование браузера без головы для заполнения формы и нажатия кнопки «Отправить». Популярным фреймворком для этого является Selenium . Это имитирует обычный браузер. Прочитайте этот пост для более детального обучения.

Судя по беглому взгляду на страницу, над которой вы работаете, я рекомендую подход №2.

1 голос
/ 10 апреля 2019

Страница, которую вы должны почистить:

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

Добавьте дату для консультации и JSESSIONID из файлов cookie в полезной нагрузке и Referer, User-Agent и всестарые добрые вещи в заголовках запросов

Пример:

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)
0 голосов
/ 10 апреля 2019

Когда вы просто нажимаете на страницы, создается впечатление, что происходит какое-то печенье / сеанс, который может быть сложно учесть при использовании requests.

(Пример: http://www.banxico.org.mx/valores/LeePeriodoSectorizacionValores.faces;jsessionid=8AkD5D0IDxiiwQzX6KqkB2WIYRjIQb2TIERO1lbP35ClUgzmBNkc!-1120047000)

Возможно, будет проще закодировать это с помощью selenium, так как это автоматизирует браузер (и позаботится обо всех заголовках и еще много чего). Вы по-прежнему будете иметь доступ к HTML, чтобы иметь возможность очистить то, что вам нужно. Вы можете, вероятно, повторно использовать многое из того, что делаете, в selenium.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...