使用Selenium进行迭代而不被阻塞

问题描述 投票:0回答:1

上一个问题...

我有一个需要用 Selenium 抓取的 URL 列表,但在获得第一个 URL 的结果后它总是阻止我。

这就是我正在做的事情:

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import time
from selenium.webdriver.firefox.options import Options

options = Options()
options.add_argument('--disable-blink-features=AutomationControlled')
options.add_argument('--headless') # ensure GUI is off
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

expres = pd.DataFrame()

    d2 = ['http://www.biblioteca.presidencia.gov.br/presidencia/ex-presidentes/michel-temer/discursos-do-presidente-da-republica/discurso-do-presidente-da-republica-michel-temer-durante-cerimonia-de-inauguracao-do-hospital-notre-dame-barretos-sp',
 'http://www.biblioteca.presidencia.gov.br/presidencia/ex-presidentes/michel-temer/discursos-do-presidente-da-republica/discurso-do-presidente-da-republica-michel-temer-durante-a-visita-a-25a-edicao-da-feira-internacional-de-tecnologia-agricola-em-acao-agrishow',
 'http://www.biblioteca.presidencia.gov.br/presidencia/ex-presidentes/michel-temer/discursos-do-presidente-da-republica/brinde-do-presidente-da-republica-michel-temer-no-almoco-oferecido-em-homenagem-ao-senhor-desire-delano-bouterse-presidente-da-republica-do-suriname',
 'http://www.biblioteca.presidencia.gov.br/presidencia/ex-presidentes/michel-temer/discursos-do-presidente-da-republica/declaracao-a-imprensa-do-presidente-da-republica-michel-temer-apos-assinatura-de-atos',
 'http://www.biblioteca.presidencia.gov.br/presidencia/ex-presidentes/michel-temer/discursos-do-presidente-da-republica/discurso-do-presidente-da-republica-michel-temer-durante-a-solenidade-de-abertura-oficial-da-84a-exposicao-internacional-de-gado-zebu-expozebu-2018']

for j in d2:
    driver = webdriver.Chrome(options=options)
    driver.maximize_window()
    driver.get(j)
    cont = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//*[@id='content-core']"))).text
    print(cont)

在第一次迭代时,它获得所需的内容。

第二次,我收到这条消息:

TimeoutException: Message: 
Stacktrace:
RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8
WebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:192:5
NoSuchElementError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:510:5
dom.find/</<@chrome://remote/content/shared/DOM.sys.mjs:136:16

我做错了什么?我应该再给它一点时间吗?

python selenium-webdriver web-scraping
1个回答
0
投票

因此,我注意到的第一个问题是,您正在创建一个新的 Chrome 实例,并在循环内将其最大化。我假设这不是故意的。如果你把它们拿出来并在循环之外定义你的WebDriverWait,一切都对我有用。我确实将 XPath 更改为 ID,因为您只是在查找 ID。它使它更简单、更容易阅读等等。

driver = webdriver.Chrome()
driver.maximize_window()
wait = WebDriverWait(driver, 10)

d2 = ['http://www.biblioteca.presidencia.gov.br/presidencia/ex-presidentes/michel-temer/discursos-do-presidente-da-republica/discurso-do-presidente-da-republica-michel-temer-durante-cerimonia-de-inauguracao-do-hospital-notre-dame-barretos-sp',
'http://www.biblioteca.presidencia.gov.br/presidencia/ex-presidentes/michel-temer/discursos-do-presidente-da-republica/discurso-do-presidente-da-republica-michel-temer-durante-a-visita-a-25a-edicao-da-feira-internacional-de-tecnologia-agricola-em-acao-agrishow',
'http://www.biblioteca.presidencia.gov.br/presidencia/ex-presidentes/michel-temer/discursos-do-presidente-da-republica/brinde-do-presidente-da-republica-michel-temer-no-almoco-oferecido-em-homenagem-ao-senhor-desire-delano-bouterse-presidente-da-republica-do-suriname',
'http://www.biblioteca.presidencia.gov.br/presidencia/ex-presidentes/michel-temer/discursos-do-presidente-da-republica/declaracao-a-imprensa-do-presidente-da-republica-michel-temer-apos-assinatura-de-atos',
 'http://www.biblioteca.presidencia.gov.br/presidencia/ex-presidentes/michel-temer/discursos-do-presidente-da-republica/discurso-do-presidente-da-republica-michel-temer-durante-a-solenidade-de-abertura-oficial-da-84a-exposicao-internacional-de-gado-zebu-expozebu-2018']

for j in d2:
    driver.get(j)
    cont = wait.until(EC.visibility_of_element_located((By.ID, "content-core"))).text
    print(cont)

这将无一例外地打印您正在查找的文本。

© www.soinside.com 2019 - 2024. All rights reserved.