【问题标题】:Web scraping with a double loop with selenium and using By.SELECTOR使用带有硒的双循环并使用 By.SELECTOR 进行 Web 抓取
【发布时间】:2023-03-30 04:08:01
【问题描述】:

我正在尝试从该网站获取 pdf 文件。我正在尝试创建一个双循环,以便我可以滚动多年(季节)以获取每年的所有主要 pdf。

这行代码不起作用。问题是,我无法使这条线工作(应该多年来循环的那条线(季节)

for year in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#season a aria-valuetext"))):
 year.click() 

这是完整的代码:

  os.chdir("C:..")
    driver = webdriver.Chrome("chromedriver.exe")
    wait = WebDriverWait(driver, 10)
    driver.get("http://www.motogp.com/en/Results+Statistics/")
    links = []


    for year in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#season a aria-valuetext"))):
     year.click()                                                          
     for item in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#event option"))):
         item.click()
         elem = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "padleft5")))
         print(elem.get_attribute("href"))
         links.append(elem.get_attribute("href"))
         wait.until(EC.staleness_of(elem))

    driver.quit()

这是之前的一篇文章,我在上面的代码中得到了帮助:

Scraping pdfs from this web

【问题讨论】:

  • 问题/疑问是什么?
  • 我用粗体字更新了问题。我的问题是,for 循环的第一行,即 for year in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#season a aria-valuetext"))): year.click() 没有像我希望的那样工作。我想点击所有季节或年份来获取每年所有事件的 pdf,第二行它确实有效:for item in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#event option"))):
  • “代码行不工作是这个”不是一个有用的描述。您应该编辑您的帖子以包含您期望代码执行的操作以及它实际执行的操作。

标签: python selenium web-scraping selenium-chromedriver


【解决方案1】:

以下解决方案应该适合您。首先,我们遍历 CSS 滑块中的 # 年。然后我们使用您的代码示例处理列表。添加了一个睡眠命令,因为我一直在超时。

代码

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
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Chrome("chromedriver.exe")
wait = WebDriverWait(driver, 10)
driver.get("http://www.motogp.com/en/Results+Statistics/")

slider = driver.find_element_by_xpath('//*[@id="handle_season"]')

for year in range(68):
    wait.until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="event"]')))    
    for item in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#event option"))):
        item.click()
        elem = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "padleft5")))
        print(elem.get_attribute("href"))
        wait.until(EC.staleness_of(elem))

    slider.send_keys(Keys.ARROW_LEFT)
    time.sleep(1)


driver.quit()

结果:

【讨论】:

  • @Shahin 不错,更新了帖子以包含该导入。并感谢您的反馈。 :)
【解决方案2】:

如果您在防火墙后面工作,那么很多时候您的 EC 将无法正常工作。看看 time.sleep(10) 函数是否不能让你通过它,而不是 EC。其次,在运行 EC 之前检查 page_source ......如果你在防火墙后面,HTML 源代码会告诉你。

【讨论】:

    猜你喜欢
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    相关资源
    最近更新 更多