#python #selenium
#python #selenium
Вопрос:
Я пытаюсь очистить исторические и прогнозируемые почасовые цены на энергию по следующему URL: https://hourlypricing.comed.com/pricing-table-today /
Я смог сделать это для другой таблицы здесь, которая является прогнозируемыми ценами на завтра https://hourlypricing.comed.com/pricing-table-tomorrow /
… работа с выпадающим списком пока немного выше моей головы.
Я не совсем понимаю, как это можно сделать с помощью средства выбора даты. Что я хотел бы сделать, так это извлечь данные за весь 2018 год. Когда я использую Selenium IDE для записи того, какие шаги нужно предпринять, он вообще не увеличивает год в режиме записи, но отлично работает, когда я меняю дату без записи? Любые указания относительно того, как подойти к этой проблеме, будут оценены. Насколько я понимаю, я должен иметь возможность записывать команды в IDE, а затем писать тот же код на python?
from pandas.io.html import read_html
from selenium import webdriver
from operator import itemgetter
#driver = webdriver.Firefox()
from bs4 import BeautifulSoup
options = webdriver.ChromeOptions()
options.add_argument('headless')
driver = webdriver.Chrome(chrome_options=options)
driver.get('https://hourlypricing.comed.com/pricing-table-tomorrow/')
table = driver.find_element_by_class_name('prices')
tablehtml = table.get_attribute('outerHTML')
soup = BeautifulSoup(tablehtml,'xml')
table = soup.find("table", { "class" : "prices" })
#print(table)
table_body = table.find('tbody')
#print(table_body)
data = []
rows = table_body.find_all('tr')
for row in rows:
cols = row.find_all('td')
cols = [ele.text.strip() for ele in cols]
cents = cols[1]
cents = cents[:-1]
cols[1] = cents
data.append([ele for ele in cols if ele])
sortedData = sorted(data, key=itemgetter(1))
pprint(sortedData)
driver.close()
Ответ №1:
Вместо того, чтобы просматривать календарь и выбирать каждый день, как это было бы долгое время. Вместо этого вы могли бы перейти прямо к источнику информации, проанализировать вывод fetch() в beautiful soup и получить всю необходимую информацию 🙂
Мы выясняем, сколько дней у нас есть в месяце, передавая этот список в запрос GET, который извлекает день. Все в течение цикла продолжительностью 12 месяцев. Вы можете настроить это на многие предыдущие годы, если вам нужно.
import requests
import calendar
def getDays(counter):
b = calendar.monthcalendar(2018, counter)
length = len(b)
lengthCounter = 0
days = []
for x in b:
lists = (b[lengthCounter])
lengthCounter = 1
for day in lists:
if day > 0:
days.append(day)
else:
pass
return(days)
def fetch(days, month):
if month < 10:
month = "0" str(month)
for d in days:
if d < 10:
mod = "0" str(d)
re = requests.get("https://hourlypricing.comed.com/rrtp/ServletFeed?type=pricingtabledualamp;date=2018" str(month) str(mod))
source = re.content
print(source)
else:
re = requests.get("https://hourlypricing.comed.com/rrtp/ServletFeed?type=pricingtabledualamp;date=2018" str(month) str(d))
source = re.content
print(source)
months = 1
while months < 12:
dayList = getDays(months)
print(fetch(dayList, months))
months =1
Ответ №2:
Существуют бесплатные API для исторической информации о ценах. Это позволяет вам указывать диапазоны для извлечения значений. Это 5-минутные цены, но есть множество вариантов запросов и различных форматов возврата
Пример формата диапазона данных для запроса GET, возвращающего json
Предоставленные даты представлены в формате: ггггММддххмм
Информация об API здесь
https://hourlypricing.comed.com/hp-api/
JSON: возвращает массив объектов json с элементами UTC millis и price.
[
{"millisUTC":"1434686700000","price":"2.0"},
{"millisUTC":"1434686100000″,"price”:"2.5"},
{"millisUTC":"1434685800000″,"price”:"2.5"}
]
Комментарии:
1. Хотя он предоставляет исторические цены, он не предоставляет почасовую цену на день вперед за данный день.
2. Нет. Но это может быть полезно для других, которые смотрят на что-то подобное. Насколько полезен день вперед при ретроспективном взгляде? Я не знаю этих данных.
3. Конечно. Хотите ответить на этот вопрос на самом деле и учиться по пути.