《Python自动化枯燥工作》I'm Feeling Lucky项目代码失效求助
问题原因与解决方案
嘿,我刚好碰到过这个问题!咱们一步步来拆解原因和修复方法:
为什么原来的代码失效了?
Google的搜索结果页面结构一直在迭代更新,《Automate the Boring Stuff》里的代码依赖的.r类选择器,现在已经从Google的搜索结果DOM结构中移除了。另外,Google会检测非浏览器发起的请求(比如requests库默认的请求头),可能返回简化版或者反爬的页面,这也会导致选择器找不到对应元素,最终linkElems变成空列表。
修复后的完整代码
import webbrowser, requests, bs4 def im_feeling_lucky(): # 格式化搜索关键词为Google支持的格式 search = '+'.join(input('Search Google: ').split(" ")) # 添加浏览器请求头,模拟真实浏览器访问,避免被Google识别为爬虫 headers = { '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' } # 拉取Google搜索页面内容 print('Googling...') # 下载时显示提示文本 res = requests.get(f'https://google.com/search?q={search}&oq={search}', headers=headers) res.raise_for_status() # 解析HTML页面 soup = bs4.BeautifulSoup(res.text, features='lxml') # 替换为当前Google搜索结果的有效链接选择器 linkElems = soup.select('.yuRUbf a') # 该选择器对应搜索结果的标题链接 numOpen = min(5, len(linkElems)) print('Opening top results...') for i in range(numOpen): # 现在href是完整的目标URL,无需拼接Google域名前缀 webbrowser.open(linkElems[i].get("href"))
关键修改点说明
- 添加请求头:通过
User-Agent模拟浏览器请求,确保获取到的页面和你在浏览器里看到的一致,避免Google返回特殊的反爬页面。 - 更新CSS选择器:当前(2024年)Google搜索结果的标题链接都包裹在类名为
yuRUbf的容器里,.yuRUbf a可以准确选中这些链接。 - 简化链接拼接:现在搜索结果的
href属性已经是完整的目标URL,不需要再拼接http://google.com前缀了。
以后遇到类似问题怎么办?
如果哪天这个选择器又失效了,你可以自己动手排查:
- 打开Google搜索任意关键词,右键点击搜索结果标题,选择「检查」。
- 在开发者工具里找到对应的
<a>标签,查看它的父元素或者自身的类名、ID等标识。 - 把
soup.select()里的选择器替换成新的标识即可。
内容的提问来源于stack exchange,提问作者Zack Plauché
相关产品推荐
相关产品推荐

