#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. Большое спасибо. Я многому научился из вашего ответа. Я очень уважаю ваше потраченное время
![]()