【问题标题】:How do I run through a list of links one by one and then scrape data using selenium(driver.get)?如何逐个浏览链接列表,然后使用 selenium(driver.get) 抓取数据?
【发布时间】:2020-03-30 19:22:50
【问题描述】:

我正在尝试遍历 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"))

【问题讨论】:

    标签: python selenium selenium-webdriver web-scraping


    【解决方案1】:

    您已经很接近了,并且“您只需要稍等一下”是正确的。

    您可以等待页面加载:wait_for_page_load 检查文档的就绪状态,如果所有内容都已加载,那么您就可以开始了。检查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 should be browserdriver,同样适用于 Chrome_Path
    • 看看 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" 文本(部分匹配)

    【讨论】:

    • 感谢特拉普利的回复。这似乎仍然只想下载最后一季的链接。就像 driver.get 行只是想在上一季结束之前遍历所有链接,然后开始执行下一行代码。我不想在这里使用 Xpath 的原因是我需要以一般方式抓取一组链接以获取它们的列表。我的理解是 Xpath 是独一无二的,但我可能不正确。
    • 我已经更新了我的答案,对不起,我一直马虎。至于 xpath,它根本不是静态的。你可以收集通用模式的部分匹配,我真的推荐它。
    • 太棒了,非常感谢!我将阅读 xpaths,因为它会清理所有内容。
    • 这个链接是关于 Xpath 的好读物:librarycarpentry.org/lc-webscraping/02-xpath/index.html
    猜你喜欢
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多