Python使用pandas将爬虫全量打印数据正确写入CSV的方法
问题原因及修正方案
你的代码存在三个核心问题导致导出CSV异常:
- 循环逻辑错位:字段提取逻辑在
for report in reports循环内部,但你原来的打印/存储逻辑放在了循环外部,每次循环都会覆盖title/price等变量,最终仅能保留当前页最后一条数据 - 存储结构错误:直接将4个字段拼成一维列表生成DataFrame,pandas会默认将每个元素识别为单独一行,因此出现字段拆分多行的问题
- 多页逻辑缺失:现有代码仅处理了初始传入的第一页链接,没有循环/递归调用下一页地址,无法爬取多页数据
修正后完整代码
import requests from bs4 import BeautifulSoup import pandas as pd # 初始化总列表存储所有爬取结果 all_results = [] # 基础域名用于拼接相对链接 base_url = 'https://www.marketresearch.com' def scrape_it(url): page = requests.get(url) soup = BeautifulSoup(page.text, 'html.parser') # 提取当前页所有报告条目 reports = soup.find_all('tr', class_='SearchTableRowAlt') for report in reports: title = report.find('a', class_='linkTitle').text.strip() price = report.find('div', class_='resultPrice').text.strip() date_author = report.find('div', class_='textGrey').text.strip() detail_link = base_url + report.a['href'].strip() # 每个条目作为子列表加入总列表,保证结构是二维的 all_results.append([title, price, date_author, detail_link]) # 处理下一页逻辑 next_btns = soup.find_all(class_="standardLinkDkBlue") if next_btns and "Next" in next_btns[-1].string: next_url = base_url + next_btns[-1]['href'] # 递归爬取下一页 scrape_it(next_url) # 启动爬取 start_url = 'https://www.marketresearch.com/search/results.asp?qtype=2&datepub=3&publisher=Technavio&categoryid=0&sortby=r' scrape_it(start_url) # 所有页面爬取完成后统一生成DataFrame导出,指定列名 df = pd.DataFrame(all_results, columns=['报告标题', '价格', '发布日期/作者', '详情链接']) df.to_csv('results-tech.csv', index=False, encoding='utf_8_sig')
代码说明
- 提前初始化二维总列表
all_results,每条爬取数据作为子列表存入,保证pandas生成DataFrame时每行对应一条数据、每列对应一个字段 - 将存储逻辑从循环内移出,所有页爬取完成后统一导出,避免重复IO
- 拼接基础域名补全相对链接,保证详情链接可直接访问
- 导出时添加
index=False参数去掉默认的索引列,encoding='utf_8_sig'保证中文在Excel中打开不乱码 - 添加下一页判断逻辑,只有存在“Next”按钮时才继续爬取,避免爬取到错误链接
内容的提问来源于stack exchange,提问作者Michael Wiz
相关产品推荐
相关产品推荐

