Часы сайта для Python - PullRequest
0 голосов
/ 06 мая 2018

Хорошо, вот сделка. Когда я смотрю, чтобы соответствовать часам из моего браузера, например, он показывает 14.00, но когда я вытаскиваю его с моим ботом python, он дает мне -1 час, например 13.00, у меня возникает вопрос, как я могу установить часы питона для региона, где я подключаюсь с? Я имею в виду, как веб-сайт может установить свои собственные часы для Python.

Примечание: мои часы GMT +3 (Стамбул, Турция) Вот веб-страница: hltv.org/matches Вот мои коды:

import datetime, requests, time
from bs4 import BeautifulSoup

matchlinks_um = []

r = requests.get('http://hltv.org/matches')
sauce = r.content
soup = BeautifulSoup(sauce, 'lxml')

for links in soup.find(class_="standard-headline", text=(datetime.date.today())).find_parent().find_all(
        class_="upcoming-match"):
    matchlinks_um.append('https://hltv.org' + links.get('href'))

for x in range(len(matchlinks_um)):
    r = requests.get(matchlinks_um[x])
    sauce = r.content
    soup = BeautifulSoup(sauce, 'lxml')

    a = soup.find('div', class_='time').text
    print(a)

Кстати, если у вас есть предложения по названию, я могу изменить его.

1 Ответ

0 голосов
/ 06 мая 2018

Я подозреваю, что js отображает правильное время, потому что если вы отключите js в своем brwser, вы получите те же результаты, что и в вашем скрипте python.
Обычно при разборе динамического содержимого решением является selenium или аналогичные клиенты, но в этом случае в атрибутах вашего тега есть метка времени unix (data-unix), которую мы можем использовать для получения правильного времени.

import datetime
import requests
from bs4 import BeautifulSoup

r = requests.get('http://hltv.org/matches')
sauce = r.text
soup = BeautifulSoup(sauce, 'lxml')

matchlinks_um = []

for links in soup.find(class_="standard-headline", text=(datetime.date.today())).find_parent().find_all(
        class_="upcoming-match"):
    matchlinks_um.append('https://hltv.org' + links.get('href'))

for link in matchlinks_um:
    r = requests.get(link)
    soup = BeautifulSoup(r.text, 'lxml')
    a = soup.find('div', class_='time')['data-unix']
    t = datetime.datetime.fromtimestamp(int(a[:10])).time()
    print(t)

Обратите внимание, что t является datetime.time объектом, но вы можете легко преобразовать его в строку, если хотите.
Также при разборе html лучше использовать .text, поскольку он содержит декодированный контент.


Но даже если у тега нет атрибута «data-unix», мы все равно можем получить правильное время, добавив один час к значению текста тега с помощью timedelta. Например:

s = '15:30'
dt = datetime.datetime.strptime(s, '%H:%M') + datetime.timedelta(hours=1)
t = dt.time()

print(t)
#16:30:00
  • s - это строка со значением «15: 30» (формат H: M), аналогичная тем, которые мы получаем с веб-сайта. Когда мы передаем эту строку в strptime, мы получаем объект datetime, так что теперь мы можем добавить один час с timedelta.
  • dt - это объект datetime со значением 1900-01-01 16:30:00 (15:30 + 1 час). Вызывая метод .time, мы получаем объект datetime.time.
  • t является datetime.time объектом со значением 16:30:00. Вы можете получить час с помощью t.hour (целое число), или сделать больше вычислений, или преобразовать его в строку или оставить как есть.
    Суть в том, что t составляет s + 1 час.

Что касается атрибута data-unix, я не знаю, является ли он стандартным атрибутом (впервые вижу его), поэтому не думаю, что вы найдете его на других сайтах.

...