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

BeautifulSoup多页爬取仅第一页数据存入DataFrame问题求助

问题排查

你这个问题是代码逻辑位置错误导致的,核心问题如下:

  • soup 对象仅在循环外初始化了一次,只解析了第一页的页面源码,后续翻页后soup不会自动更新,始终存储第一页的内容
  • master_list和df放在了循环内部,每次翻页前都会清空之前采集到的所有数据,哪怕内容更新也只会保留最后一次循环的采集结果
  • 多余的requests.get(url)代码无实际作用,你已经通过Selenium加载了页面,不需要重复发请求
  • 隐式等待implicitly_wait只需要全局设置一次,不需要每次翻页都调用

修正后代码

import time
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup

driver = webdriver.Chrome(ChromeDriverManager().install())
# 全局设置隐式等待
driver.implicitly_wait(2)
url = 'www.mywebsite.com'
driver.get(url)

# 全局初始化存储列表,不要放在循环内避免数据被清空
master_list = []

for _ in range(50):
    driver.find_element_by_tag_name('body').send_keys(Keys.END) # 滑动到页面底部
    # 每次翻页后重新获取当前页面源码,解析生成新的soup
    markup = driver.page_source
    soup = BeautifulSoup(markup, 'lxml')
    
    # 采集当前页的企业名称
    for name in soup.find_all(itemprop='name'):
        data_dict = {}
        data_dict['company name'] = name.get_text(strip=True, separator = '\n')
        master_list.append(data_dict)
        
    print('当前页面采集完成')
    
    # 处理翻页逻辑
    element = driver.find_element_by_class_name('prevnext')
    print('按钮是否可点击 : ' + str(element.is_enabled()))
    print('按钮是否可见 : ' + str(element.is_displayed()))
    time.sleep(5)
    element.click()
    print('已点击下一页按钮')

# 全部页面采集完成后统一生成DataFrame
df = pd.DataFrame(master_list)
print('全部页面采集完成')

额外优化建议

  • 可以增加判断逻辑,下一页按钮不可点击时直接跳出循环,避免最后一页翻页时报错
  • 可以用Selenium显式等待替代固定的time.sleep,有效提升爬取效率

内容的提问来源于stack exchange,提问作者komskisp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 22:06:02