Создание веб-страниц с использованием Python — Ссылка не изменяется при вводе формы

#python #web-scraping #beautifulsoup #scrapy #mechanize

#python #очистка веб-страниц #beautifulsoup #scrapy #механизировать

Вопрос:

Я планировал получить исторические данные из доступной открытой сети. Из ссылки:

https://www.entsoe.eu/db-query/consumption/mhlv-a-specific-country-for-a-specific-day

В идеале я пытаюсь изменить страну, день, месяц, год, используя входные данные из фрейма данных Pandas, и получить результаты (потребление энергии здесь, на этой веб-странице) и сохранить обратно в Excel.

Я пытаюсь использовать разные веб-скрапперы, и мне кажется сомнительной одна информация о возможностях.

Это: когда я вручную меняю страну, день, месяц, год и при повторном просмотре результатов, веб-ссылка остается неизменной. Возможно ли достичь моей цели с помощью этой веб-ссылки.

Спасибо за ваше время.

Комментарии:

1. Отправленные данные выполняются с помощью запроса POST на веб-сайт, а не запроса GET, поэтому URL-адрес не изменится. Несколько предложенных фреймворков будут работать для отправки post-запросов или отправки формы.

2. Вы можете использовать Developer Tools в Chrome / Firefox для просмотра данных в запросе POST.

3. Большое спасибо @Rejected и furas за обмен знаниями.

Ответ №1:

Прежде всего, вам нужно понять, что происходит, когда вы нажимаете кнопку «Отправить». Запрос POST отправляется на тот же URL-адрес с параметрами, соответствующими значениям, которые вы выбрали в форме. Вы можете увидеть этот запрос в инструментах разработчика браузера — вкладка «Сеть». Теперь вам нужно смоделировать этот запрос в вашем коде (я буду использовать потрясающий requests пакет ниже)

Другая проблема заключается в том, что если вы проверите, что вы получаете в ответ на этот запрос POST, вы не найдете тот же table элемент с нужными данными, который вы увидите в браузере. Это связано с тем, что table динамически генерируется из переменной myData javascript, «сидящей» в одном из script элементов. Поскольку nor BeautifiulSoup , nor requests является браузером и не может выполнять JavaScript, вам необходимо извлечь myData значение из скрипта.

Вот рабочий код, который даст вам нужные данные в «архивной» области на 01/01/2009:

 import re
from ast import literal_eval
from pprint import pprint

import requests
from bs4 import BeautifulSoup


url = "https://www.entsoe.eu/db-query/consumption/mhlv-a-specific-country-for-a-specific-day"
data = {
    "opt_period": "2",
    "opt_Country": "3",
    "opt_Day": "1",
    "opt_Month": "1",
    "opt_Year": "2009",
    "opt_Response": "1",
    "send": "send"
}
with requests.Session() as session:
    session.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36'}
    # visit the page
    session.get(url)

    # make a POST request
    response = session.post(url, data=data)
    soup = BeautifulSoup(response.content, 'html.parser')

    # find the desired script
    pattern = re.compile(r"var myData = (.*?);", re.MULTILINE | re.DOTALL)
    script = soup.find("script", text=pattern)

    # extract the data from the script
    match = pattern.search(script.get_text())
    data = match.group(1).strip()
    data = literal_eval(data)

    pprint(data)
  

Печатает список списков Python:

 [['AT',
  '2009-01-01',
  6277,
  6002,
  5649,
  5230,
  5034,
  5038,
  4858,
  5127,
  5342,
  5747,
  6100,
  6373,
  6325,
  6210,
  6129,
  6160,
  6588,
  7007,
  7058,
  6887,
  6586,
  6137,
  6494,
  5974]]
  

Комментарии:

1. Большое спасибо. Я многому научился из вашего ответа. Я очень уважаю ваше потраченное время 🙂