我如何逐一浏览链接列表,然后使用selenium(driver.get)刮取数据?

2024-04-16 15:41:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过两组链接进行循环。从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"))


Tags: fromimportbrowsersupportgetby链接selenium
1条回答
网友
1楼 · 发布于 2024-04-16 15:41:48

你很接近,你说的“你只需要等一会儿”是对的

您可以等待页面加载:wait_for_page_load检查文档readystate,如果所有内容都已加载,则可以继续。检查this线程以了解更多信息。:)

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{a2}或{},同样适用于{}
  • 看看Xpath,它太棒了

编辑:

我第一次很马虎,所以我更新了答案来回答这个问题:D.等待页面加载仍然是个好主意:)

问题是您在每个循环中重新定义了hrefs2,因此它总是包含上一次迭代的结果

关于xpath的原因:

如果要加载结果before 2000,url收集逻辑将中断。您仍然可以这样做:

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<;-在文档树的任何深度都可以找到td标记的元素
  • //a<;-在收集的td元素中,获取a标记的所有子元素(在任何深度)
  • [contains(@href, "https://cuetracker.net/tournaments")]来自收集的a标记元素列表,这些元素包含href属性中的"https://cuetracker.net/tournaments"文本(部分匹配)

相关问题 更多 >