如何将Selenium爬虫抓取的评级数据追加存入Pandas DataFrame
问题排查
你当前的代码无法生成DataFrame主要有三个问题:
- 存储数据的变量定义在option遍历循环内部,每次循环都会清空上一次的抓取结果,无法累积全量数据
- 切换iframe读取数据后没有切回主页面上下文,后续循环会找不到option元素直接报错
- 没有定义结构化的字段映射规则,无法直接把爬取到的列表数据转为DataFrame格式
修正后可直接生成DataFrame的代码
from selenium import webdriver from bs4 import BeautifulSoup import pandas as pd import time # 路径用原始字符串避免Windows系统下转义字符报错 browser = webdriver.Chrome(r'F:\chromedriver.exe') browser.get("https://capitalonebank2.bluematrix.com/sellside/Disclosures.action") # 定义DataFrame对应的字段名称 columns = ['券商名称', '评级类型', '评级总数量', '评级总占比', '关联投行服务数量', '关联投行服务占比'] # 全量数据存储列表需放在循环外部,避免被清空 all_data = [] for title in browser.find_elements_by_css_selector('option'): broker_name = title.text.strip() title.click() time.sleep(1) # 切换到数据所在iframe browser.switch_to.frame(browser.find_elements_by_css_selector("iframe")[1]) table = browser.find_element_by_css_selector("table table") soup = BeautifulSoup(table.get_attribute("innerHTML"), "lxml") # 按行顺序对应三类评级 rating_types = ["BUY", "HOLD", "SELL"] for index, row in enumerate(soup.select("tr")[-4:-1]): info_list = row.select("td") count = info_list[1].text.strip() percent = info_list[2].text.strip() ib_count = info_list[4].text.strip() ib_percent = info_list[5].text.strip() # 组装单条数据加入总存储列表 all_data.append([broker_name, rating_types[index], count, percent, ib_count, ib_percent]) # 切回主页面,保障后续循环正常执行 browser.switch_to.default_content() # 直接生成DataFrame rating_df = pd.DataFrame(all_data, columns=columns) # 可选:导出为csv文件本地留存,使用utf_8_sig编码避免中文乱码 rating_df.to_csv("券商评级数据.csv", index=False, encoding="utf_8_sig") # 打印前10行校验数据 print(rating_df.head(10))
实现说明
- 提前在循环外部定义全量数据存储容器,累积所有券商的三类评级数据
- 每次读取完iframe内数据后切回主页面上下文,解决循环遍历中断的问题
- 给每条数据绑定对应的券商名称、评级类型字段,结构化程度更高,可直接用pandas构造函数生成标准DataFrame
内容的提问来源于stack exchange,提问作者Arslan Aziz
相关产品推荐
相关产品推荐

