You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过触发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_block
    • td_block_id=tdi_5
    • td_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:30:54