Понадобилось мне получить данные о лотереях столото. К сожалению, на сайте лотереи в удобной табличной форме их нет. Можно посмотреть только результаты конкретного тиража. Причем данные даже не текстом: вместо номеров картинки с красивыми девушками. На самом деле, номера все таки есть, достаточно посмотреть исходный код страницы (в яндекс-браузере нужно нажать Ctrl+Shift+I) результаты тиража заключены в тег <div id="content" class="cleared game_567 game_6x45">, а непосредственно выпавшие шары в <p class="number">....</p>. Как же получить эти результаты в удобном виде? Для этого есть масса способов, я расскажу как это делается в популярном языке программирования Python. Есть замечательный пакет Анаконда, который включает язык Питон и множество пакетов к нему. Все нам необходимое уже есть в нем. Скачиваем, устанавливаем, жмем кнопку "new" и выбираем "Python 3" (файлы в программами называются в этой среде notebook). В открывшемся окне можно набирать и выполнять программы.
Получить html страницу в питоне просто, для этого есть библиотека requests :
import requests
r = requests.get('https://www.stoloto.ru/6x45/archive/1000')
print(r.text)
ВСЕ. Питон распечатает нам исходный код страницы. Правда разобраться в этом коде довольно сложно. Для разбора (парсинга) html тегов есть замечательная библиотека BeautifulSoup. Просто "скармливаем" ей код страницы:
from bs4 import BeautifulSoup
soup = BeautifulSoup(r.text, 'html.parser')
res = soup.find(class_='cleared game_567 game_6x45')
в переменной res у нас теперь содержимое тега <div id="content" class="cleared game_567 game_6x45"> , чтобы извлечь из них теги <p class="number">....</p> снова применяем BeautifulSoup:
new_str = []
for number in res.find_all(class_='number'):
new_str.append(int(number.text))
print(new_str)
В этом случае, поскольку шаров несколько применяем метод .find_all (найти все) и добавляем каждый шар в список. В питоне цикл for немного особенный, в нем нет условий выхода из цикла, нет приращений, просто указывается список для каждого элемента, для которого нужно выполнить действие. Просто и понятно. Итак, вот что получилось:
import requests
from bs4 import BeautifulSoup
r = requests.get('https://www.stoloto.ru/6x45/archive/1000')
soup = BeautifulSoup(r.text, 'html.parser')
res = soup.find(class_='cleared game_567 game_6x45')
new_str = [res.find('h2').text]
for number in res.find_all(class_='number'):
new_str.append(int(number.text))
print(new_str)
Здесь печать результатов я дополнил номером, датой и временем тиража - он находится в теге <h2> и извлекается запросом res.find('h2').text
Чтобы получить больше одной страницы, достаточно все это делать в цикле:
for i in range(1,100):
r = requests.get('https://www.stoloto.ru/6x45/archive/'+str(i))
........................
print(new_str)
Я уже говорил что цикл в Питоне своеобразный, нужен список. Оператор range(1,100) формирует список от 1 до 100, таким образом можно получить результаты тиражей с первого по сотый. В настоящее время в лотерее 6 из 45 более 4500 тиражей, загрузка всех занимает некоторое время, у меня все тиражи загрузились примерно за полчаса. Кроме самих шаров на странице есть информация по количеству проданных билетов, выплаченных денег, сумм выигрышей: вся эта информация извлекается аналогичным образом, просто используются другие теги.