如何用Selenium实现带Load More按钮的网页数据爬取?
解决Paginegialle.it无限加载数据的抓取逻辑
核心思路是循环检查「Load More」按钮是否存在且可点击,存在则点击并等待新数据加载,重复直到按钮消失,同时每次加载完成后抓取当前页面的所有数据。
关键代码实现
假设你已有初始化Selenium Driver和抓取单页数据的函数(比如extract_page_data()),可以按以下逻辑扩展:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException import random import time # 初始化driver(你的已有代码) # driver = webdriver.Chrome(...) # 导航到目标查询页面(你的已有代码) # driver.get("你的查询URL") all_data = [] while True: # 抓取当前页面的所有数据 current_data = extract_page_data(driver) all_data.extend(current_data) try: # 等待Load More按钮出现并可点击,超时设为10秒 load_more_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Load More')]")) ) # 用JS点击避免按钮被遮挡的问题 driver.execute_script("arguments[0].click();", load_more_btn) # 等待新数据加载完成(替换为页面新增结果的元素选择器) WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".new-result-item")) ) # 随机延迟避免反爬 time.sleep(random.uniform(1, 3)) except TimeoutException: # 超时说明按钮不存在或无法点击,退出循环 break # 处理并保存所有数据 # save_to_file(all_data)
注意事项
- 替换
"//button[contains(text(), 'Load More')]"为页面实际的按钮选择器(用浏览器开发者工具查看) - 替换
".new-result-item"为每次加载后新增结果的元素选择器,确保等待逻辑准确 - 若页面加载无明显元素变化,可临时用
time.sleep(2)替代显式等待(不推荐长期使用) - 频繁操作可能触发反爬,建议添加随机延迟和请求头伪装
内容的提问来源于stack exchange,提问作者ManekyNeko
相关产品推荐
相关产品推荐

