Webscraping: вывод, отличный от исходных данных

#python #html #web-scraping #beautifulsoup #python-requests

#python #HTML #соскабливание полотна #прекрасный суп #python-запросы

Вопрос:

Я пытаюсь создать веб-сайт, отображающий таймер обратного отсчета (цель состоит в том, чтобы в конечном итоге создать discord-бота, который по запросу отображает оставшееся время, оставшееся на таймере). Однако при печати данных выходные данные отличаются от исходного источника.

Оглядевшись вокруг, я не смог найти решения своей проблемы. Я уверен, что я что-то упускаю, но понятия не имею, что это такое (я делаю это только как личный проект, у меня очень мало предыдущего опыта работы с python)

 import requests
from bs4 import BeautifulSoup

result = requests.get("https://www.wowclassiccountdown.com/")
result.status_code
result.headers

c = result.content

soup = BeautifulSoup(c)

samples = soup.find_all("div", "fusion-digit")
samples[0]

data = {}
for div in samples:
    title = div.string.strip()
    data[title] = div.attrs['class']

    # displays data
    print(data)
 

Я не могу сказать вам, каков ожидаемый результат, поскольку он постоянно меняется, но очевидно, что он не должен быть полностью равен 0. Кто-нибудь может мне это объяснить?

Ответ №1:

Веб-сайт, который вы пытаетесь очистить, использует Javascript для обратного отсчета (попробуйте отключить Javascript в своем веб-браузере, и вы увидите, что обратный отсчет установится на 0). Что, к сожалению, делает невозможным использование библиотеки запросов.

Ответ №2:

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

 import requests 
from bs4 import BeautifulSoup as bs
import datetime
from dateutil.relativedelta import relativedelta

r = requests.get('https://www.wowclassiccountdown.com/')
soup = bs(r.content, 'lxml')
end = soup.select_one('#fusion-countdown-1')['data-timer']
ends = datetime.datetime.strptime(end, '%Y-%m-%d-%H-%M-%S')
start = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
starts = datetime.datetime.strptime(start, '%Y-%m-%d-%H-%M-%S')
diff = ends - starts
diff
 

Для меня также существует разница во времени в 9 часов, которую необходимо учитывать.

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

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