如何使用Selenium实现200个目标URL的批量网页数据抓取?
批量抓取实现方案
核心实现逻辑
- 整理所有待抓取的200个同类URL为一个列表
- 复用同一个浏览器驱动实例,避免反复启动浏览器浪费性能
- 把单页抓取逻辑封装为独立函数,增加异常捕获逻辑,避免单个页面抓取失败导致整个程序崩溃
- 增加页面加载等待时间,避免元素未加载完成就触发定位报错
注意:你原有代码中
find_elements_by_xpath返回的是元素列表,无法直接调用.text属性,下方代码已修正该问题。
完整可运行代码
from selenium import webdriver from selenium.common.exceptions import NoSuchElementException, TimeoutException import time import random def scrape_single_page(driver, url): try: driver.get(url) # 随机等待1-3秒,等待页面加载完成,同时规避反爬 time.sleep(random.uniform(1,3)) # 抓取第一个目标元素文本 text1 = driver.find_element_by_xpath('//div[@class="b1yLWE b3zFtQ"]').text # 点击目标按钮 btn = driver.find_element_by_xpath('//button[@class="g1zAe-"]') btn.click() # 点击后等待内容加载 time.sleep(random.uniform(0.5,2)) # 批量抓取span元素文本(修正原代码的列表调用错误) span_elements = driver.find_elements_by_xpath('//span[@class="A2jAym q2jAym"]') span_text_list = [ele.text for ele in span_elements] # 抓取第二个div元素文本 text2 = driver.find_element_by_xpath('//div[@class="b1yLWE b1zAe-"]').text current_url = driver.current_url # 此处可自行添加存储逻辑,比如写入csv、数据库等 print(f"抓取成功:{current_url}\ntext1:{text1}\nspan内容:{span_text_list}\ntext2:{text2}\n---") return True except (NoSuchElementException, TimeoutException) as e: print(f"抓取失败:{url},错误原因:{str(e)}") return False if __name__ == "__main__": chrome_path = r"C:\Users\lenovo\Downloads\chromedriver_win32 (5)\chromedriver.exe" driver = webdriver.Chrome(chrome_path) # 待抓取URL列表,200个URL按格式填入即可 # 如果URL有规律,可直接通过循环生成,无需手动填写 # 如果URL存储在txt文件每行一个,可用以下代码读取: # with open('urls.txt', 'r', encoding='utf-8') as f: # urls = [line.strip() for line in f if line.strip()] urls = [ "https://www.kijijiautos.ca/vip/22442312", # 剩余199个URL在此处补充 ] success_count = 0 fail_count = 0 for url in urls: if scrape_single_page(driver, url): success_count += 1 else: fail_count += 1 # 每次抓取完成后随机间隔,避免请求频率过高被封禁 time.sleep(random.uniform(1,2)) print(f"全部任务执行完成,成功抓取{success_count}个,失败{fail_count}个") # 关闭浏览器 driver.quit()
额外优化建议
- URL批量生成/读取:如果200个URL只有末尾ID不同,可直接循环拼接生成列表;如果是零散URL,存到txt文件每行一个,用代码里注释的读取方法即可,无需手动逐个复制
- 数据存储:可根据需求把抓取到的内容写入csv、Excel或者本地数据库,不要仅做打印输出
- 异常优化:如果需要重试失败的URL,可以把失败的URL单独存到列表里,全部跑完后再重新遍历重试一次
内容的提问来源于stack exchange,提问作者Alian Nadeem
相关产品推荐
相关产品推荐

