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
相关产品推荐
相关产品推荐

