Selenium (python)在抓取许多页面时崩溃 (50+)

我有下面的脚本(如下)来刮取关闭TRACE的债券数据(代码中的链接)。这是一个修改后的版本。https:/github.comtreatmesubjFINRABondScrape。.

它在50-100页上可以工作,但当我试图刮取所有的约7,600页时,它就失败了。脚本在这里失败了。bond = [tablerow.text] 脚本在这里失败了: 它抛出了以下错误:

“StaleElementReferenceException: 消息:”StaleElementReferenceException: Message: 元素的引用是陈旧的;要么该元素不再附着在DOM上,要么它不在当前的框架上下文中,要么文档已经被刷新了。”

我增加了一个明确的等待时间 tablerows 以为有些表需要更长的时间来加载,但似乎没有什么帮助,因为问题依然存在。我已经尝试了其他几种方法,但我已经没有办法了。

任何关于如何解决这个问题的想法都会很有帮助。另外,欢迎提供任何加快代码速度的技巧。谢谢你

更新了。 下面是KunduK的建议+增加… time.sleep(0.8)time.sleep(1.5)for 循环似乎解决了问题。但是,在接受KunduK的答案之前,我将会等待一段时间,以防有人提出更好的答案。

# TRACE Bond Scraper
import os
import time
import numpy as np
import pandas as pd
from datetime import date
from datetime import datetime as dt
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.firefox.options import Options

options = Options()
options.headless = False
driver = webdriver.Firefox(options = options)
driver.get('http://finra-markets.morningstar.com/BondCenter/Results.jsp')

# Click agree, edit search and submit 
WebDriverWait(driver, 10).until(EC.element_to_be_clickable(
    (By.CSS_SELECTOR, ".button_blue.agree"))).click()
WebDriverWait(driver, 10).until(EC.element_to_be_clickable(
    (By.CSS_SELECTOR, 'a.qs-ui-btn.blue'))).click()
WebDriverWait(driver, 10).until(EC.element_to_be_clickable(
    (By.CSS_SELECTOR, 'a.ms-display-switcher.hide'))).click()
WebDriverWait(driver, 10).until(EC.element_to_be_clickable(
    (By.CSS_SELECTOR, 'input.button_blue[type=submit]'))).click()
WebDriverWait(driver, 10).until(EC.presence_of_element_located(
    (By.CSS_SELECTOR, '.rtq-grid-row.rtq-grid-rzrow .rtq-grid-cell-ctn')))
headers = [title.text for title in driver.find_elements_by_css_selector(
    '.rtq-grid-row.rtq-grid-rzrow .rtq-grid-cell-ctn')[1:]]

# Find out the total number of pages to scrape
pg_no = WebDriverWait(driver, 10).until(EC.presence_of_element_located(
            (By.CSS_SELECTOR, '.qs-pageutil-total > span:nth-child(1)'))).text
pg_no = int(pg_no)

# Scrape tables
bonds = []
for page in range(1, pg_no):
    WebDriverWait(driver, 10).until(EC.presence_of_element_located(
        (By.CSS_SELECTOR, (f"a.qs-pageutil-btn.on[value='{str(page)}']"))))
    time.sleep(0.8)
    tablerows = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located(
        (By.CSS_SELECTOR, 'div.rtq-grid-bd > div.rtq-grid-row')))
    for tablerow in tablerows:
        bond = [tablerow.text]
        bonds.append(bond)
    WebDriverWait(driver, 10).until(EC.presence_of_element_located(
        (By.CSS_SELECTOR, ('a.qs-pageutil-next')))).click()

解决方案:

将这一行改为

WebDriverWait(driver, 10).until(EC.presence_of_element_located(
        (By.CSS_SELECTOR, (f"a.qs-pageutil-btn.on[value='{str(page)}']"))))

这样就可以去掉类 on

WebDriverWait(driver, 10).until(EC.presence_of_element_located(
        (By.CSS_SELECTOR, (f"a.qs-pageutil-btn[value='{str(page)}']"))))

给TA打赏
共{{data.count}}人
人已打赏
未分类

如何将几个平方之和相加(伯恩脚本)

2022-9-13 13:23:38

未分类

with在laravel中不工作?

2022-9-13 13:23:40

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索