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

Python爬取谷歌新闻代码导出CSV仅含表头无数据,求错误排查

谷歌新闻爬虫仅输出表头无数据问题排查

问题根因

  • 页面选择器失效:你使用的.dbsr、.XTjFC类名是多年前谷歌新闻的旧页面结构,现在谷歌已经更新了前端类名,soup.select无法匹配到任何元素,所有存储数据的列表都是空值,最终导出的CSV只有表头。
  • 未定义函数报错:代码中调用了find_date(url_w)函数,但全程没有定义该函数,运行到此处会直接抛出异常,即使有try捕获也会导致数据采集逻辑中断。
  • 请求头过于陈旧:预设的UA是2013年的Firefox24、2020年的Safari版本,谷歌会直接识别为爬虫请求,返回拦截页面或非标准结构的响应,无法解析到新闻内容。
  • 无反爬规避逻辑:循环请求谷歌搜索没有添加延时,短时间高频请求会触发谷歌反爬机制,返回验证码页面,无有效数据返回。
  • 路径兼容性问题:CSV导出路径写死为Colab的云盘路径/content/drive/MyDrive/,如果在本地环境运行会触发路径不存在的报错,无法正常保存文件。
  • 网络环境问题:谷歌搜索在国内普通网络环境下无法正常访问,若没有配置代理,请求会直接失败,返回空内容或错误页。

修复方案

1. 更新请求头为新版浏览器UA

替换原有的list_header函数,使用近期的Chrome、Edge浏览器UA:

def list_header():
  headers_list = [
        {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Accept-Language': 'en-US,en;q=0.5',
            'DNT': '1',
            'Connection': 'keep-alive',
            'Upgrade-Insecure-Requests': '1',
        },
        {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Accept-Language': 'en-US,en;q=0.5',
            'DNT': '1',
            'Connection': 'keep-alive',
            'Upgrade-Insecure-Requests': '1',
        }]
  return headers_list

2. 替换为有效页面选择器,移除未定义的find_date调用

修改谷歌搜索结果解析部分的代码,直接从谷歌搜索结果页提取日期、来源等信息,不需要跳转详情页获取日期,避免多余请求:

# 原soup.select(".dbsr a")替换为新的选择器
news_items = soup.select("div.SoaBEf")
for item in news_items:
    tickers.append(t)
    try:
        # 提取新闻链接
        url_w = item.select_one("a").get("href")
        urls.append(url_w)
        # 提取谷歌返回的发布日期,不需要调用未定义的find_date
        dt = item.select_one(".OSrXXb").get_text(strip=True)
        dates.append(dt)
        # 提取发布来源
        publisher.append(item.select_one(".NUnG9d span").get_text(strip=True).lower())
        # 抓取详情页内容
        res = requests.get(url_w, headers=headers, timeout=10)
        parsed_article = bs4.BeautifulSoup(res.text,'lxml')
        paragraphs = parsed_article.find_all('p')
        article_text = "".join([p.get_text(strip=True) for p in paragraphs])
    except Exception as e:
        article_text = ''
        # 异常时补空值避免列表长度不匹配
        if len(urls) < len(tickers):
            urls.append('')
            dates.append('')
            publisher.append('')
    news.append(article_text)

删掉原来的sources = soup.select(".XTjFC g-img")循环部分,来源已经在上面的逻辑里提取了。

3. 添加反爬与异常判断逻辑

在每次请求谷歌搜索后添加状态码校验和延时:

res = r.get(url, headers=headers, timeout=10)
# 加状态码判断,被拦截时提前报错
if res.status_code != 200:
    print(f"请求{t}新闻失败,状态码:{res.status_code}")
    continue
soup = bs4.BeautifulSoup(res.text, "html.parser")
# 加延时,避免触发反爬
import time
time.sleep(random.randint(3,6))

4. 修复保存路径

将CSV保存路径改为本地兼容路径,比如当前目录:

df.to_csv(f'./google_news_{d1}.csv', index=False, encoding='utf-8-sig')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:48:01