Как получить абсолютный url из JavaScript+Ajax с помощью парсинга Selenium, Python 3?

124
17 сентября 2019, 12:40

Я пишу парсер для этого сайта - https://www.oddsportal.com

Возьмём эту страницу - https://www.oddsportal.com/soccer/england/premier-league/wolves-newcastle-utd-nNNqedbR

Столкнулся со следующей проблемой. Нужно получить список URL с этого блока

Я так понимаю, что эти URL, формируются через JS (и Ajax). Я не знаю, как по ним пройтись. Видно, что у них есть какие-то uid... Видимо, нужно как-о их использовать?..

Если долго расписывать метод для получения всех URL, можете написать только получение URL из "Home / Away": "2nd Half", например.

def init_driver():
    chrome_option = webdriver.ChromeOptions()
    chrome_option.add_argument("headless")
    prefs = {"profile.managed_default_content_settings.images": 2}
    chrome_option.add_experimental_option("prefs", prefs)

    try:
        driver = webdriver.Chrome(options=chrome_option)
    except SessionNotCreatedException:
        print("Ошибка инициализации браузера. Скорее всего у вас не установлен браузер. Пожалуйста обратитесь к разработчику парсера")
    return driver
from selenium.webdriver.common.action_chains import ActionChains
def parse(driver):
    driver.get("https://www.oddsportal.com/soccer/england/premier-league/wolves-newcastle-utd-nNNqedbR")
    #Находим элемент ul с классом ul-nav
    ul_nav = driver.find_element_by_css_selector("ul.ul-nav")
    #Находим все li внутри ul, которые содержат style = "display:block;", этот параметр отвечает за видимость объекта
    lis = ul_nav.find_elements_by_css_selector('li[style = "display: block;"]')
    #Проходим по всем найденным li
    for li in lis:
        #Кликаем
        print(li.text)
        li.click()
        #Получаем текущую ссылку, на которой находится браузер
        print(driver.current_url)
        #Вытаскиваем ссылки из подпунктов (список)
        sub_ul_nav = driver.find_element_by_css_selector("ul.sub-menu.subactive[style = 'display: block;']")
        sub_a_more_list = sub_ul_nav.find_elements_by_css_selector('li > a')
        #Циклом for проходим по ним и записываем url
        for sub_a_more in sub_a_more_list:
            sub_a_more.click()
            print(driver.current_url)
        print('==========')
    a_list_text = []
    #Получаем ссылки
    li_more = ul_nav.find_element_by_css_selector('li.r.more')
    ActionChains(driver).move_to_element(li_more).perform()
    a_more_list = li_more.find_elements_by_css_selector('div > div > p > a')
    for a_more in a_more_list:
        text = a_more.text
        #Заносим значения text в список
        a_list_text.append(text)
    for a in a_list_text:
        #Переопределяем
        li_more = ul_nav.find_element_by_css_selector('li.r.more')
        #Наводим курсор на элемент, так как оно даже при нажатии скрывается через несколько секунд
        ActionChains(driver).move_to_element(li_more).perform()
        a_more_list = li_more.find_elements_by_css_selector('div > div > p > a')
        for a_more in a_more_list:
            if a == a_more.text:
                a_more.click()
                # print(a_more.text)
                print(driver.current_url)
                more_sub_ul_nav = driver.find_element_by_css_selector("ul.sub-menu.subactive[style = 'display: block;']")
                more_sub_a_more_list = more_sub_ul_nav.find_elements_by_css_selector('li > a')
                #Циклом for проходим по ним и записываем url
                # if more_sub_a_more_list:
                for more_sub_a_more in more_sub_a_more_list:
                    more_sub_a_more.click()
                    # li_more = ul_nav.find_element_by_css_selector('li.r.more')
                    #Наводим курсор на элемент, так как оно даже при нажатии    скрывается через несколько секунд
                    print(driver.current_url)
                    print('_____')
                break
Answer 1

Как вариант получить так:

def init_driver():
    ff = "../install/chromedriver.exe"
    chrome_option = webdriver.ChromeOptions()
    chrome_option.add_argument("headless")
    prefs = {"profile.managed_default_content_settings.images": 2}
    chrome_option.add_experimental_option("prefs", prefs)

    try:
        # driver = webdriver.Firefox(executable_path=ff)
        driver = webdriver.Chrome(executable_path=ff, options=chrome_option)
        # driver = webdriver.Chrome(executable_path=ff, chrome_options=chrome_option, service_args=service_args)
    except SessionNotCreatedException:
        print("Ошибка инициализации браузера. Скорее всего у вас не установлен браузер. Пожалуйста обратитесь к разработчику парсера")
    return driver
def parse(driver):
    driver.get("https://www.oddsportal.com/soccer/england/premier-league/wolves-newcastle-utd-nNNqedbR")
    #Находим элемент ul с классом ul-nav
    ul_nav = driver.find_element_by_css_selector("ul.ul-nav")
    #Находим все li внутри ul, которые содержат style = "display:block;", этот параметр отвечает за видимость объекта
    lis = ul_nav.find_elements_by_css_selector('li[style = "display: block;"]')
    #Проходим по всем найденным li
    for li in lis:
        #Кликаем
        li.click()
        #Получаем текущую ссылку, на которой находится браузер
        print(driver.current_url)
    a_list_text = []
    #Получаем ссылки
    li_more = ul_nav.find_element_by_css_selector('li.r.more')
    ActionChains(driver).move_to_element(li_more).perform()
    a_more_list = li_more.find_elements_by_css_selector('div > div > p > a')
    for a_more in a_more_list:
        text = a_more.text
        #Заносим значения text в список
        a_list_text.append(text)
        print("Добавляем:", text)
    for a in a_list_text:
        print(a)
        #Переопределяем
        li_more = ul_nav.find_element_by_css_selector('li.r.more')
        #Наводим курсор на элемент, так как оно даже при нажатии скрывается через несколько секунд
        ActionChains(driver).move_to_element(li_more).perform()
        a_more_list = li_more.find_elements_by_css_selector('div > div > p > a')
        for a_more in a_more_list:
            if a == a_more.text:
                a_more.click()
                print(driver.current_url)
                break

Результат:

https://www.oddsportal.com/soccer/england/premier-league/wolves-newcastle-utd-nNNqedbR
https://www.oddsportal.com/soccer/england/premier-league/wolves-newcastle-utd-nNNqedbR#ah;2
https://www.oddsportal.com/soccer/england/premier-league/wolves-newcastle-utd-nNNqedbR#over-under;2
https://www.oddsportal.com/soccer/england/premier-league/wolves-newcastle-utd-nNNqedbR#dnb;2
https://www.oddsportal.com/soccer/england/premier-league/wolves-newcastle-utd-nNNqedbR#eh;2
https://www.oddsportal.com/soccer/england/premier-league/wolves-newcastle-utd-nNNqedbR#double;2
https://www.oddsportal.com/soccer/england/premier-league/wolves-newcastle-utd-nNNqedbR#cs;2
READ ALSO
jquery datatable refresh

jquery datatable refresh

есть две таблицы, которые заполняются сходя из результатов одного аякс запросакак обновить таблицу после повторно аякса запроса?

76
Сложение квадратов цифр числах, пока не станет 1

Сложение квадратов цифр числах, пока не станет 1

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

79