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

