Как запустить список ссылок по одной, а затем очистить данные с помощью selenium (driver.get)? - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь l oop через 2 набора ссылок. Начиная с https://cuetracker.net/seasons> нажимайте ссылку на каждый сезон (последние 5 сезонов), а затем нажимайте ссылку на каждый турнир в каждой ссылке сезона и собирайте данные матчей каждого турнира.

Использование Код ниже, мне удалось получить список ссылок на сезон, которые я хочу, но затем, когда я пытаюсь захватить ссылки на турниры и поместить их в список, он получает только ссылки на турниры прошлого сезона, а не на каждый сезон.

Я предполагаю, что это как-то связано с driver.get, который просто завершается до того, как сработают следующие строки кода, и мне нужно зацикливаться / повторяться с использованием индексов, но я новичок, поэтому не уверен.

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
from selenium.webdriver.support.select import Select
from bs4 import BeautifulSoup
import re
import pandas as pd
import os

Chrome_Path = r"C:\Users\George\Desktop\chromedriver.exe"
Browser = webdriver.Chrome(Chrome_Path)

Browser.get("https://cuetracker.net/seasons")


links = Browser.find_elements_by_css_selector("table.table.table-striped a")
hrefs=[]
for link in links:
    hrefs.append(link.get_attribute("href"))

hrefs = hrefs[1:5]

for href in hrefs:
    Browser.get(href)
    links2 = Browser.find_elements_by_partial_link_text("20")
    hrefs2 =[]
    for link in links2:
        hrefs2.append(link.get_attribute("href"))

1 Ответ

0 голосов
/ 30 марта 2020

Вы довольно близки, и вы правы насчет "вам просто нужно немного подождать".

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

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
from selenium.webdriver.support.select import Select
from bs4 import BeautifulSoup

import os
import re
import time
import pandas as pd


def wait_for_page_load():
    timer = 10
    start_time = time.time()
    page_state = None
    while page_state != 'complete':
        time.sleep(0.5)
        page_state = Browser.execute_script('return document.readyState;')
        if time.time() - start_time > timer:
            raise Exception('Timeout :(')


Chrome_Path = r"C:\Users\George\Desktop\chromedriver.exe"
Browser = webdriver.Chrome()

Browser.get("https://cuetracker.net/seasons")


links = Browser.find_elements_by_css_selector("table.table.table-striped a")
hrefs=[]
for link in links:
    hrefs.append(link.get_attribute("href"))

hrefs = hrefs[1:5]

hrefs2 = {}

for href in hrefs:
    hrefs2[href] = []
    Browser.get(href)
    wait_for_page_load()
    links2 = Browser.find_elements_by_partial_link_text("20")
    for link in links2:
        hrefs2[href].append((link.get_attribute("href")))

Несколько замечаний, если вы не возражаете:

  • Browser должно быть browser или driver, то же самое относится к Chrome_Path
  • проверить Xpath, это круто

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

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

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

О том, почему xpath:

Если вы хотите загрузить результаты до 2000 , ваш логин сбора URL c сломается. Вы все еще можете сделать это:

table = Browser.find_element_by_xpath('//*[@class="table table-striped"]')
all_urls = [x.get_attribute('href') for x in table.find_elements_by_xpath('.//tr/td[2]/a')]

Где вы найдете таблицу по имени класса, затем соберите URL-адреса из второго столбца таблицы.

Если вы знаете шаблон URL, вы даже можете сделать это:

all_urls = [x.get_attribute('href') for x in Browser.find_elements_by_xpath('//td//a[contains(@href, "https://cuetracker.net/tournaments")]')]

Xpath выше:

  • //td <- на любой глубине В дереве документа найдите <code>td теговых элементов
  • //a <- в собранных <code>td элементах получаются все дочерние элементы, помеченные a (на любой глубине)
  • [contains(@href, "https://cuetracker.net/tournaments")] из список собранных теговых элементов a, которые содержат текст "https://cuetracker.net/tournaments" в атрибуте href (частичное совпадение)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...