如何通过触发Load More按钮加载内容抓取网站,解决Selenium仅获第一页数据问题
问题解决思路
一、当前代码的核心错误
你现在的代码里,每次循环解析的都是初始requests.get获取的页面内容,而不是Selenium驱动的浏览器中点击"加载更多"之后的最新页面源码,所以永远只能抓到第一页的标题。
二、修复后的Selenium代码
修改循环内的页面获取逻辑,改用driver.page_source来获取当前浏览器的实时页面内容,替代复用第一次请求的静态内容:
from bs4 import BeautifulSoup import pandas as pd import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait # 浏览器配置 options = webdriver.ChromeOptions() options.add_argument('--ignore-certificate-errors') options.add_argument('--ignore-ssl-errors') options.add_argument('--ignore-certificate-errors-spki-list') options.add_argument('log-level=3') options.add_argument('--disable-notifications') # options.add_argument('--headless') # 取消注释可启用无头模式 # 初始化浏览器并打开目标页面 driver = webdriver.Chrome(executable_path="C:\webdrivers\chromedriver.exe", options=options) driver.get("https://learnwoo.com/blog/") productlist = [] for i in range(1, 3): # 关键修改:获取当前浏览器的实时页面源码 soup = BeautifulSoup(driver.page_source, features='lxml') items = soup.find_all('div', class_='td_module_1') print(f'第{i}页,共找到{len(items)}篇文章') for single_item in items: title = single_item.find('h3').text.strip() print('标题:', title) productlist.append({'Title': title}) # 非最后一页时点击加载更多 if i < 2: time.sleep(2) # 可根据网络情况调整等待时间 load_more_btn = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.XPATH, "//a[@id='next-page-tdi_5']")) ) load_more_btn.click() driver.close() # 保存结果 df = pd.DataFrame(productlist) df.to_csv('Results.csv', index=False)
三、learnwoo的AJAX分页接口方案
你之前用的抓AJAX接口的方式依然适用,learnwoo的分页请求通过wp-admin/admin-ajax.php发送,无需Selenium即可直接请求,效率更高:
- 打开浏览器开发者工具(F12)的Network标签,筛选XHR请求
- 点击"加载更多"后,会看到
admin-ajax.php的请求,核心参数包括:action=td_ajax_blocktd_block_id=tdi_5td_current_page=2(页码随点击递增)
直接用requests请求的示例代码:
import requests import pandas as pd from bs4 import BeautifulSoup productlist = [] base_url = "https://learnwoo.com/wp-admin/admin-ajax.php" # 抓取第一页内容 r = requests.get("https://learnwoo.com/blog/") soup = BeautifulSoup(r.content, 'lxml') items = soup.find_all('div', class_='td_module_1') for item in items: productlist.append({'Title': item.find('h3').text.strip()}) # 抓取第二页内容 payload = { "action": "td_ajax_block", "td_block_id": "tdi_5", "td_current_page": "2", "td_column_number": "1" } r = requests.post(base_url, data=payload) soup = BeautifulSoup(r.text, 'lxml') items = soup.find_all('div', class_='td_module_1') for item in items: productlist.append({'Title': item.find('h3').text.strip()}) # 保存结果 df = pd.DataFrame(productlist) df.to_csv('Results_AJAX.csv', index=False)
关键说明
- Selenium方案适合需要模拟完整浏览器行为的场景,但速度较慢;AJAX接口方案效率更高,适合大规模抓取
- 注意控制请求频率,避免触发网站反爬机制
内容的提问来源于stack exchange,提问作者MarkWP
相关产品推荐
相关产品推荐

