谷歌新闻网页爬虫突然失效问题排查求助
问题回顾
我编写了一段谷歌新闻网页的爬虫代码,此前一直运行正常,但今日突然失效。代码无报错信息,却无法抓取任何数据。该代码参考2018年YouTube教程编写,使用了教程中的相同URL和div类(class='st'、class='slp')。通过浏览器检查元素发现这些类仍存在,且代码昨日还能正常运行。附上昨日可用代码,请问问题可能出在哪里?谷歌是否修改了HTML代码或URL?
代码如下:
from textblob import TextBlob from bs4 import BeautifulSoup import requests from datetime import date, timedelta, datetime term = 'coca cola' url = 'https://www.google.com/search?q={0}&source=lnms&tbm=nws'.format(term) response = requests.get(url) print(response) soup = BeautifulSoup(response.text, 'html.parser') snippet_text = soup.find_all('div', class_='st') print(len(snippet_text)) news_date = soup.find_all('div', class_='slp') print(len(news_date)) for paragraph_text, post_date in zip(snippet_text, news_date): paragraph_text = TextBlob(paragraph_text.get_text()) print(paragraph_text) todays_date = date.today() time_ago = TextBlob(post_date.get_text()).split('- ')[1] print(time_ago)
问题排查与解决思路
我帮你梳理下最可能的几个原因,都是谷歌反爬或页面动态调整导致的:
请求被谷歌反爬机制拦截,返回空/假页面
这是最常见的原因!你直接用requests.get()发起请求,没有任何浏览器标识,谷歌很容易识别出这是脚本而非真实用户访问。哪怕昨天还能用,谷歌的反爬规则是实时更新的,说不定今天就触发了拦截。你可以先打印response.text看看,大概率是没有新闻内容的空白页或者人机验证页面。
解决办法很简单,给请求加个模拟浏览器的User-Agent请求头:headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } # 另外注意URL里的&要换成&,避免解析问题 url = f'https://www.google.com/search?q={term}&source=lnms&tbm=nws' response = requests.get(url, headers=headers)页面DOM结构有隐藏调整(表面class未变)
有时候谷歌会给元素增加嵌套层级,或者把目标内容放在需要JS渲染的区域——你在浏览器里看到的st、slp类是JS执行后生成的,但requests只能获取静态HTML,自然抓不到。
如果是这种情况,你需要用selenium或playwright模拟真实浏览器加载页面,等JS执行完成后再抓取内容。不过要注意控制请求频率,别太激进导致IP被封。地域/语言限制导致内容为空
谷歌搜索会根据你的IP自动切换地域和语言,可能今天你的IP被识别到了没有相关新闻的区域?可以在请求头里指定语言和地域试试:headers['Accept-Language'] = 'en-US,en;q=0.9'
小提示
先优先测试加User-Agent的方案,这解决了90%以上的突发爬虫失效问题。另外,爬取谷歌内容时记得加随机延时(比如time.sleep(random.randint(2,5))),避免频繁请求触发更严格的封禁。
内容的提问来源于stack exchange,提问作者taga

