You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python爬取多关键词文章导出Excel时数据被覆盖问题求助

解决Python爬虫Excel数据被覆盖的问题

问题原因分析

你遇到的核心问题是每次处理一个关键词时,都重新创建了Excel工作簿并覆盖保存:在article_fetch函数内部,每次调用都会生成新的xlwt.Workbook(),然后直接保存为同一个文件名。这就导致前三个关键词的数据都被最后一个关键词的结果覆盖,最终只保留了最后一组数据。

另外还有个小细节:keyword.replace("+", " ")这行代码其实没生效,因为Python字符串是不可变的,需要重新赋值给keyword才会生效(不过你的关键词里没有+,暂时不影响功能)。

修复后的完整代码

我们调整一下逻辑:把Excel工作簿的创建和保存放到循环外面,让article_fetch只负责爬取数据,然后统一写入同一个工作表。这样所有关键词的数据都会被保留:

import requests
from bs4 import BeautifulSoup
import datetime
import xlwt
from xlwt import Formula

today = datetime.date.today().strftime("%Y%m%d")
keywords = ('PNC', 'Huntington', 'KeyCorp', 'Fifth Third')
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'}

def article_fetch(keyword):
    url = 'https://www.americanbanker.com/search?query={}'.format(keyword)
    r = requests.get(url, headers=headers)
    soup = BeautifulSoup(r.text, 'html.parser')
    data_rows = []
    # 只爬取数据行,表头在外面统一写入
    for articles in soup.find_all("div", "feed-item"):
        article = articles.find("h4").text.strip()
        timestamp = articles.find("span", "timestamp").text.strip()
        article_url = 'https://{}'.format(articles.find("a")["href"][2:])
        link = 'HYPERLINK("{}", "Link" )'.format(article_url)
        item = [keyword, article, Formula(link), timestamp]
        data_rows.append(item)
    return data_rows

# 初始化工作簿和工作表
book = xlwt.Workbook()
sheet = book.add_sheet("Articles")
# 写入表头
cols = ["KeyWord", "Article", "URL", "Publication Date"]
for j, col in enumerate(cols):
    sheet.write(0, j, col)

# 记录当前写入的行号,从第1行开始(表头是第0行)
current_row = 1
for keyword in keywords:
    # 如果需要处理关键词里的+,可以加上这行
    # keyword = keyword.replace("+", " ")
    rows = article_fetch(keyword)
    # 遍历每个数据行,写入工作表
    for row in rows:
        for j, col in enumerate(row):
            sheet.write(current_row, j, col)
        current_row += 1

# 最后统一保存工作簿
book.save("C:\\Python\\American Banker\\American Banker {}.xls".format(today))
print('Workbook Saved')

改动说明

  • 把工作簿的创建和保存移到了循环外部,确保所有数据都写入同一个文件
  • 修改article_fetch函数,让它返回爬取到的所有数据行(不包含表头)
  • current_row变量跟踪当前写入的行位置,避免不同关键词的数据互相覆盖
  • 表头只在最开始写入一次,避免重复

这样运行后,Excel文件里就会包含四个关键词的所有爬取结果啦!

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

火山引擎 最新活动