【发布时间】:2020-12-11 10:02:15
【问题描述】:
我试图抓取网站中的评论。对于 1 个网站,它运行良好。但是,当我创建一个循环以在许多网站中进行爬网时,它会引发错误引发
TimeoutException(message, screen, stacktrace) TimeoutException
我现在尝试将等待时间从 30 增加到 50,但仍然无法正常运行。 这是我的代码:
import requests
import pandas as pd
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
from datetime import datetime
start_time = datetime.now()
result = pd.DataFrame()
df = pd.read_excel(r'D:\check_bols.xlsx')
ids = df['ids'].values.tolist()
link = "https://www.bol.com/nl/ajax/dataLayerEndpoint.html?product_id="
for i in ids:
link3 = link + str(i[-17:].replace("/",""))
op = webdriver.ChromeOptions()
op.add_argument('--ignore-certificate-errors')
op.add_argument('--incognito')
op.add_argument('--headless')
driver = webdriver.Chrome(executable_path='D:/chromedriver.exe',options=op)
driver.get(i)
WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[data-test='consent-modal-confirm-btn']>span"))).click()
WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.review-load-more__button.js-review-load-more-button"))).click()
soup = BeautifulSoup(driver.page_source, 'lxml')
product_attributes = requests.get(link3).json()
reviewtitle = [i.get_text() for i in soup.find_all("strong", class_="review__title") ]
url = [i]*len(reviewtitle)
productid = [product_attributes["dmp"]["productId"]]*len(reviewtitle)
content= [i.get_text().strip() for i in soup.find_all("div",attrs={"class":"review__body"})]
author = [i.get_text() for i in soup.find_all("li",attrs={"data-test":"review-author-name"})]
date = [i.get_text() for i in soup.find_all("li",attrs={"data-test":"review-author-date"})]
output = pd.DataFrame(list(zip(url, productid,reviewtitle, author, content, date )))
result.append(output)
result.to_excel(r'D:\bols.xlsx', index=False)
end_time = datetime.now()
print('Duration: {}'.format(end_time - start_time))
以下是我尝试抓取的一些链接:
【问题讨论】:
-
哪一行错误? - 当
webdriverwait失败并且它不是nosuchelement时发生超时 - 验证该对象是否存在于失败的链接上。例如,您的第二个等待是“a.review-load-more__button.js-review-load-more-button” - 这就是“加载更多按钮”,但如果没有按钮怎么办?如果没有评论或没有更多评论要加载怎么办? (它会超时找到它) -
行错误是您提到的第二次等待。我该如何解决这个错误?有些链接有超过 5 条评论,所以需要点击按钮,有些则不需要。我应该如何调整适用于这两种情况的代码?
-
使用 Try 和 except -w3schools.com/python/python_try_except.asp 捕获超时错误 - 您还需要在脚本开始时导入该错误。
标签: python selenium selenium-webdriver selenium-chromedriver timeoutexception