gpt4 book ai didi

python - 优化 python selenium 网页抓取

转载 作者:行者123 更新时间:2023-12-04 14:23:00 27 4
gpt4 key购买 nike

我下面有这段代码,它使用 selenium 从网站中提取信息,代码工作正常,但速度很慢

from selenium import webdriver
from bs4 import BeautifulSoup
dat =[]

for m in range(1,10000):
driver = webdriver.Chrome()
driver.get("http://www.ultimatetennisstatistics.com/playerProfile?playerId="+str(m))
dat.append([driver.find_element_by_xpath('/html/body/h3').text])
dat.append(m)
try:
dropdown = driver.find_element_by_xpath('//*[@id="playerPills"]/li[9]/a')
dropdown.click()
bm = driver.find_element_by_id('statisticsPill')
bm.click()
driver.maximize_window()
soup = BeautifulSoup(driver.page_source,"lxml")
for i in soup.select('#statisticsOverview table tr'):
dat.append([x.get_text(strip=True) for x in i.select("th,td")])
driver.quit()

except ValueError:
print("error")
dat.append('????')

最佳答案

不要为每次迭代创建一个新的驱动程序实例。您的脚本几乎不需要任何时间来提取数据。其中大部分仅用于打开浏览器并一次又一次地加载 URL。

这是我对你的代码所做的 -

1) 放置驱动初始化和 driver.quit()在循环之外。

2) 使用 selenium webdriver 本身来抓取数据而不是漂亮的汤,因为后者的结果不一致和可靠,因为数据来自 javascript。 (另外,不需要外部库,您可以从 selenium 本身获取所有数据。)

3) 二手 javascript打开网址,以便我们只能等待您网站中的相关内容(使用 WebDriverWait )出现而不是全部加载。

最终代码花了不到一半比原始代码抓取数据的时间长。 (通过 this 方法测量 3 次迭代)

编辑 -

有一些页面像this它没有所需的统计数据。在这种情况下,下面的行将抛出 TimeoutException ——

rows = small_wait.until(EC.presence_of_all_elements_located((By.XPATH,"//div[@id = 'statisticsOverview']//tr")))

因此,您可以简单地处理该异常,而是检查是否存在 No Statistics available"元素(使用 is_displayed() )。

最终代码 -
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
import time

dat =[]
driver = webdriver.Chrome()
driver.maximize_window()
wait = WebDriverWait(driver, 10)
small_wait = WebDriverWait(driver, 4) #because performance is a concern

for m in range(0,10000):
driver.execute_script('window.open("http://www.ultimatetennisstatistics.com/playerProfile?playerId=' + str(m) + '","_self")')
dat.append([wait.until(EC.presence_of_element_located((By.XPATH, '/html/body/h3'))).text])
dat.append(m)
try:
dropdown = driver.find_element_by_xpath('//*[@id="playerPills"]/li[9]/a')
dropdown.click()
bm = driver.find_element_by_id('statisticsPill')
bm.click()
try:
rows = small_wait.until(EC.presence_of_all_elements_located((By.XPATH,"//div[@id = 'statisticsOverview']//tr")))
for i in rows:
dat.append([i.text])
except TimeoutException:
no_statistics_element = small_wait.until(EC.presence_of_element_located((By.XPATH, "//div[@id='playerStatsTab']/p[contains(text(),'No statistics available')]")))
if(no_statistics_element.is_displayed()):
dat.append([no_statistics_element.text])
continue
except ValueError:
print("error")
dat.append('????')

driver.quit()

关于python - 优化 python selenium 网页抓取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51792222/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com