Chromedriver продолжает менять часовой пояс при очистке - PullRequest
0 голосов
/ 04 марта 2019

Ниже приведено начало моего кода Python, который успешно извлекает всю информацию таблицы с этого веб-сайта и экспортирует ее в файл CSV.Единственная проблема, с которой я сталкиваюсь с этим скребком, это то, что Chromedriver продолжает изменять часовой пояс в верхнем правом углу, что в конечном итоге искажает мой вывод, назначая некоторым играм неправильную дату.Я пытался найти в источнике страницы ссылки или теги, которые позволят мне нажать «GMT-8 Pacific Time Zone», но, к сожалению, я ничего не могу найти.Расстраивает то, что когда я копирую и вставляю URL в свой браузер, Chrome немедленно переключается обратно на часовой пояс Тихого океана.Кто-нибудь знает, как исправить эту проблему с часовым поясом при использовании Chromedriver для очистки данных?Заранее спасибо!

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import re
import pandas as pd

# set scope and create empty lists
year = 2018
lastpage = 50
Date = []
Time = []
Team1 = []
Team2 = []
Score = []
All_ML = []
Team1_ML = []
Team2_ML = []

driver = webdriver.Chrome()
driver.get('http://www.oddsportal.com/')
driver.execute_script('op.selectTimeZone(6);')

# set up for loop to loop through all pages
for x in range(1, lastpage + 1):
    url = "http://www.oddsportal.com/baseball/usa/mlb-" + str(year) + "/results/#/page/" + str(x) + "/'"
    driver.get(url)


    # wait until java table loads and then grab data
    element = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.XPATH, '//*[@id="tournamentTable"]')))
    odds = element.text
    print (odds)

    # close temporary chrome screen
    driver.close()

    # reformat resulting text for consistency
    odds = re.sub("[0-9] - ", str(year)[-1] + " -- ", odds)
    odds = re.sub(" - ", "\nteam2", odds)

    # split text by line
    odds = odds.split("\n")

    counter = 1

    # set up loop to classify each line of text
    for line in odds:

        # if a game was abandoned or cancelled, set score to N/A
        if re.match(".*( {1})[a-zA-Z]*\.$", line):
            Score.append("N/A")

            # if date format is matched, add to date list and reset counter
        if re.match("(.{2} .{3} .{4}.*)", line):
            currdate = line[:11]
            Date.append(currdate)
            counter = 1

        # if time format is matched at beginning of string, add time to list, add team1 to list, check if there was a new date for this game. if not, add current date from previous game
        elif re.match('(.{2}:.{2})', line):
            Time.append(line[:5])
            Team1.append(line[6:])
            if counter > 1:
                Date.append(currdate)
            counter += 1

        # if its a team2 line, add to team2 list. if score is on the same line, add to score list
        elif re.match("team2.*", line):
            if re.match(".*:.*", line):
                Score.append(re.sub("[a-zA-Z]* *", "", line[-5:]))
                Team2.append(re.sub(" {1}[0-9]*:[0-9]*", "", line[5:len(line)]))
            else:
                Team2.append(re.sub(" {1}[a-zA-Z]*\.", "", line[5:]))

        # if score is on it's own line, add to score list
        elif re.match(".*:.*", line):
            Score.append(re.sub(" ", "", line))

        # add all moneylines to a list
        elif re.match("[+\-.*]", line):
            All_ML.append(line)

    # add odd money lines to list1, even moneylines to list 2
    Team1_ML = All_ML[0::2]
    Team2_ML = All_ML[1::2]

# create dataframe with all lists
df = pd.DataFrame(
    {'Date': Date,
     'Time': Time,
     'Team1': Team1,
     'Team2': Team2,
     'Score': Score,
     'Team1_ML': Team1_ML,
     'Team2_ML': Team2_ML})

# save
df.to_csv('odds2018.csv')

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Чтобы конкретизировать примечание pguardiario, если вы используете Chrome devtools для просмотра кнопки в правом верхнем углу, каждая из кнопок вызывает ссылку на https://www.oddsportal.com/set-timezone/n/, где n - это код часового пояса.Эти функции фактически вызывают функцию op.selectTimeZone(n), которая изменит ваш часовой пояс на экране.Вы можете поэкспериментировать с этим в консоли Chrome, набрав op.selectTimeZone(n).

Если это работает для вас, вы можете включить это, эмулируя консольные вызовы javascript, используя, где n - код для выбранного часового пояса:

driver.execute_script('op.selectTimeZone(n);')

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

for x in range(1, lastpage + 1):
    url = "http://www.oddsportal.com/baseball/usa/mlb-" + str(year) + "/results/#/page/" + str(x) + "/'"

   driver = webdriver.Chrome()
    driver.get(url)

    # Set timezone
    driver.execute_script('op.selectTimeZone(6);')

    # wait until java table loads and then grab data
    element = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.XPATH, '//*[@id="tournamentTable"]')))
    odds = element.text

Обратите внимание, что вам может потребоваться поиграть с настройкой таймера ожидания, так как вы добавляете дополнительное выполнение после выбора часового пояса.

Кроме того, вам действительно не нужно сбрасывать вызов драйвера для каждого цикла, если только вы не планируете распараллелить цикл for.Скорее всего, это будет выполняться намного быстрее, если вы возьмете инициализацию и закрытие драйвера из цикла.

РЕДАКТИРОВАТЬ:

Таким образом, если вы обращаетесь к странице результатов напрямую, вы не сможете установить часовой пояс без запуска перезагрузки на странице.Скорее всего, вам потребуется вывести настройки и загрузить из цикла, например,

driver = webdriver.Chrome()
driver.get('http://www.oddsportal.com/')
# Proc JS on-click for timezone selection button
driver.execute_script("op.showHideTimeZone();ElementSelect.expand( 'user-header-timezone' , 'user-header-timezone-expander' , null , function(){op.hideTimeZone()} );this.blur();")
driver.execute_script('op.selectTimeZone(6);')

for x in range(1, lastpage + 1):
    url = "http://www.oddsportal.com/baseball/usa/mlb-" + str(year) + "/results/#/page/" + str(x) + "/'"

    driver.get(url)

    # wait until java table loads and then grab data
    element = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.XPATH, '//*[@id="tournamentTable"]')))
    odds = element.text
    print(odds)
# close temporary chrome screen
driver.close()
0 голосов
/ 04 марта 2019

Похоже, вы можете установить это с помощью:

driver.get("https://www.oddsportal.com/set-timezone/6/")
...