Selenium+Python循环输出重复、多URL遍历及数据输出异常问题求助
问题排查与修复方案
问题根源
- 遍历URL逻辑错误:数据提取代码全部放在URL遍历循环外部,遍历阶段仅执行页面跳转和加载等待,全部URL跳转完成后driver停在最后一个URL页面,仅执行一次数据提取,因此只能拿到第二个URL的结果。
- 冗余嵌套循环:
for page in range(0, 1)仅会执行1次(range规则为左闭右开,0到1区间仅包含数值0),无实际作用可直接删除,若观测到重复迭代为其他逻辑残留导致。 - 无效数据遍历:原代码中遍历
audited-url__link元素的逻辑无实际作用,每个页面仅对应一个待抓取的URL指标,无需额外遍历。
修复后完整代码
# 提前导入所需依赖 import pandas as pd 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 urls = [ 'https://developers.google.com/speed/pagespeed/insights/?url=https://www.crutchfield.com/%2F&tab=mobile', 'https://developers.google.com/speed/pagespeed/insights/?url=https://www.lastpass.com%2F&tab=mobile' ] driver = webdriver.Chrome(executable_path='/Library/Frameworks/Python.framework/Versions/3.9/bin/chromedriver') # 全局初始化DataFrame,避免循环内重复覆盖 df = pd.DataFrame(columns = ['Title', 'Core Web Vitals', 'FCP', 'FID', 'CLS', 'TTI', 'TBT', 'Total Score']) for url in urls: driver.get(url) # 等待页面核心元素加载完成 WebDriverWait(driver, 120).until(EC.presence_of_element_located((By.CLASS_NAME, 'origin-field-data'))) # 直接提取当前页面指标数据 title = driver.find_element_by_xpath('//*[@id="page-speed-insights"]/div[2]/div[3]/div[2]/div[1]/div[1]/div/div[2]/h1/a') co_name = title.text cwv = driver.find_element_by_xpath('//*[@id="page-speed-insights"]/div[2]/div[3]/div[2]/div[1]/div[2]/div/div[1]/div[1]/div[1]/span[2]') core_web = cwv.text fcp = driver.find_element_by_xpath('//*[@id="page-speed-insights"]/div[2]/div[3]/div[2]/div[1]/div[2]/div/div[1]/div[1]/div[2]/div[1]/div[1]/div') first_content = fcp.text fid = driver.find_element_by_xpath('//*[@id="page-speed-insights"]/div[2]/div[3]/div[2]/div[1]/div[2]/div/div[1]/div[1]/div[2]/div[3]/div[1]/div') first_input = fid.text cls = driver.find_element_by_xpath('//*[@id="page-speed-insights"]/div[2]/div[3]/div[2]/div[1]/div[2]/div/div[1]/div[1]/div[2]/div[4]/div[1]/div') layout_shift = cls.text tti = driver.find_element_by_xpath('//*[@id="interactive"]/div/div[1]') time_interactive = tti.text tbt = driver.find_element_by_xpath('//*[@id="total-blocking-time"]/div/div[1]') total_block = tbt.text total_score = driver.find_element_by_xpath('//*[@id="page-speed-insights"]/div[2]/div[3]/div[2]/div[1]/div[1]/div/div[1]/a/div[2]') score = total_score.text # 写入当前行数据 df.loc[len(df)] = [co_name,core_web,first_content,first_input,layout_shift,time_interactive,total_block,score] driver.close() # df.to_csv('Double Page Speed Test 9-10.csv') print(df)
内容的提问来源于stack exchange,提问作者VRapport
相关产品推荐
相关产品推荐

