如何使用 Python 抓取 Google 搜索结果
“纵有疾风来,人生不言弃”,这句话送给正在学习文章的朋友们,也希望在阅读本文《如何使用 Python 抓取 Google 搜索结果》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新文章相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!
抓取 google 搜索可提供基本的 serp 分析、seo 优化和数据收集功能。现代抓取工具使这个过程更快、更可靠。
我们的一位社区成员撰写了此博客,作为对 crawlee 博客的贡献。如果您想向 crawlee 博客贡献此类博客,请通过我们的 discord 频道与我们联系。
在本指南中,我们将使用 crawlee for python 创建一个 google 搜索抓取工具,可以处理结果排名和分页。
我们将创建一个抓取工具:
- 从搜索结果中提取标题、url 和描述
- 处理多个搜索查询
- 追踪排名位置
- 处理多个结果页面
- 以结构化格式保存数据
先决条件
- python 3.7 或更高版本
- 对 html 和 css 选择器的基本了解
- 熟悉网络抓取概念
- crawlee for python v0.4.2 或更高版本
项目设置
-
安装 crawlee 所需的依赖项:
pipx install crawlee[beautifulsoup,curl-impersonate]
-
使用 crawlee cli 创建一个新项目:
pipx run crawlee create crawlee-google-search
出现提示时,选择 beautifulsoup 作为您的模板类型。
-
导航到项目目录并完成安装:
cd crawlee-google-search poetry install
使用 python 开发 google 搜索抓取工具
1. 定义提取数据
首先,让我们定义提取范围。谷歌的搜索结果现在包括地图、名人、公司详细信息、视频、常见问题和许多其他元素。我们将重点分析带有排名的标准搜索结果。
这是我们要提取的内容:
我们来验证一下是否可以从页面的html代码中提取必要的数据,或者是否需要更深入的分析或js渲染。请注意,此验证对 html 标签敏感:
根据从页面获取的数据,所有必要的信息都存在于 html 代码中。因此,我们可以使用beautifulsoup_crawler。
我们将提取的字段:
- 搜索结果标题
- 网址
- 描述文字
- 排名位置
2.配置爬虫
首先,让我们创建爬虫配置。
我们将使用 curlimpersonatehttpclient 作为带有预设标头的 http_client,并模拟与 chrome 浏览器相关的内容。
我们还将配置 concurrencysettings 来控制抓取攻击性。这对于避免被 google 屏蔽至关重要。
如果您需要更集中地提取数据,请考虑设置proxyconfiguration。
from crawlee.beautifulsoup_crawler import beautifulsoupcrawler from crawlee.http_clients.curl_impersonate import curlimpersonatehttpclient from crawlee import concurrencysettings, httpheaders async def main() -> none: concurrency_settings = concurrencysettings(max_concurrency=5, max_tasks_per_minute=200) http_client = curlimpersonatehttpclient(impersonate="chrome124", headers=httpheaders({"referer": "https://www.google.com/", "accept-language": "en", "accept-encoding": "gzip, deflate, br, zstd", "user-agent": "mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/131.0.0.0 safari/537.36" })) crawler = beautifulsoupcrawler( max_request_retries=1, concurrency_settings=concurrency_settings, http_client=http_client, max_requests_per_crawl=10, max_crawl_depth=5 ) await crawler.run(['https://www.google.com/search?q=apify'])
3. 实现数据提取
首先我们来分析一下需要提取的元素的html代码:
可读 id 属性和生成 类名和其他属性之间存在明显区别。创建用于数据提取的选择器时,您应该忽略任何生成的属性。即使您已经了解到 google 已经使用特定的生成标签 n 年了,您也不应该依赖它 - 这反映了您编写健壮代码的经验。
现在我们了解了 html 结构,让我们来实现提取。由于我们的爬虫只处理一种类型的页面,因此我们可以使用 router.default_handler 来处理它。在处理程序中,我们将使用 beautifulsoup 迭代每个搜索结果,在保存结果时提取标题、url 和 text_widget 等数据。
@crawler.router.default_handler async def default_handler(context: beautifulsoupcrawlingcontext) -> none: """default request handler.""" context.log.info(f'processing {context.request} ...') for item in context.soup.select("div#search div#rso div[data-hveid][lang]"): data = { 'title': item.select_one("h3").get_text(), "url": item.select_one("a").get("href"), "text_widget": item.select_one("div[style*='line']").get_text(), } await context.push_data(data)
4. 处理分页
由于 google 结果取决于搜索请求的 ip 地理位置,因此我们不能依赖链接文本进行分页。我们需要创建一个更复杂的 css 选择器,无论地理位置和语言设置如何,它都可以工作。
max_crawl_depth 参数控制我们的爬虫应该扫描多少页面。一旦我们有了强大的选择器,我们只需获取下一页链接并将其添加到爬虫队列中即可。
要编写更高效的选择器,请学习 css 和 xpath 语法的基础知识。
await context.enqueue_links(selector="div[role='navigation'] td[role='heading']:last-of-type > a")
5. 将数据导出为csv格式
由于我们希望以方便的表格格式(例如 csv)保存所有搜索结果数据,因此我们可以在运行爬虫后立即添加 export_data 方法调用:
await crawler.export_data_csv("google_search.csv")
6. 完成 google 搜索抓取工具
虽然我们的核心爬虫逻辑有效,但您可能已经注意到我们的结果目前缺乏排名位置信息。为了完成我们的抓取工具,我们需要通过使用请求中的 user_data 在请求之间传递数据来实现正确的排名位置跟踪。
让我们修改脚本来处理多个查询并跟踪搜索结果分析的排名位置。我们还将爬行深度设置为顶级变量。让我们将 router.default_handler 移至 paths.py 以匹配项目结构:
# crawlee-google-search.main from crawlee.beautifulsoup_crawler import beautifulsoupcrawler, beautifulsoupcrawlingcontext from crawlee.http_clients.curl_impersonate import curlimpersonatehttpclient from crawlee import request, concurrencysettings, httpheaders from .routes import router queries = ["apify", "crawlee"] crawl_depth = 2 async def main() -> none: """the crawler entry point.""" concurrency_settings = concurrencysettings(max_concurrency=5, max_tasks_per_minute=200) http_client = curlimpersonatehttpclient(impersonate="chrome124", headers=httpheaders({"referer": "https://www.google.com/", "accept-language": "en", "accept-encoding": "gzip, deflate, br, zstd", "user-agent": "mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/131.0.0.0 safari/537.36" })) crawler = beautifulsoupcrawler( request_handler=router, max_request_retries=1, concurrency_settings=concurrency_settings, http_client=http_client, max_requests_per_crawl=100, max_crawl_depth=crawl_depth ) requests_lists = [request.from_url(f"https://www.google.com/search?q={query}", user_data = {"query": query}) for query in queries] await crawler.run(requests_lists) await crawler.export_data_csv("google_ranked.csv")
我们还可以修改处理程序以添加 query 和 order_no 字段以及基本错误处理:
# crawlee-google-search.routes from crawlee.beautifulsoup_crawler import BeautifulSoupCrawlingContext from crawlee.router import Router router = Router[BeautifulSoupCrawlingContext]() @router.default_handler async def default_handler(context: BeautifulSoupCrawlingContext) -> None: """Default request handler.""" context.log.info(f'Processing {context.request.url} ...') order = context.request.user_data.get("last_order", 1) query = context.request.user_data.get("query") for item in context.soup.select("div#search div#rso div[data-hveid][lang]"): try: data = { "query": query, "order_no": order, 'title': item.select_one("h3").get_text(), "url": item.select_one("a").get("href"), "text_widget": item.select_one("div[style*='line']").get_text(), } await context.push_data(data) order += 1 except AttributeError as e: context.log.warning(f'Attribute error for query "{query}": {str(e)}') except Exception as e: context.log.error(f'Unexpected error for query "{query}": {str(e)}') await context.enqueue_links(selector="div[role='navigation'] td[role='heading']:last-of-type > a", user_data={"last_order": order, "query": query})
我们就完成了!
我们的 google 搜索抓取工具已准备就绪。我们来看看 google_ranked.csv 文件中的结果:
代码存储库可在 github 上获取
使用 apify 抓取 google 搜索结果
如果您正在从事需要数百万个数据点的大型项目,例如本文中有关 google 排名分析的项目 - 您可能需要一个现成的解决方案。
考虑使用 apify 团队开发的 google 搜索结果抓取器。
它提供了重要的功能,例如:
- 代理支持
- 大规模数据提取的可扩展性
- 地理位置控制
- 与 zapier、make、airbyte、langchain 等外部服务集成
您可以在 apify 博客中了解更多信息
你会刮什么?
在本博客中,我们逐步探索了如何创建收集排名数据的 google 搜索抓取工具。如何分析此数据集取决于您!
温馨提示,您可以在 github 上找到完整的项目代码。
我想 5 年后我需要写一篇关于“如何从 llm 的最佳搜索引擎中提取数据”的文章,但我怀疑 5 年后这篇文章仍然具有相关性。
今天关于《如何使用 Python 抓取 Google 搜索结果》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

- 上一篇
- 如何在电脑上成功进入PE系统:一步步指导

- 下一篇
- 如何用 CSS、HTML 和 JavaScript 实现父元素中子元素的双行排列,并添加省略号按钮展开隐藏部分?
-
- 文章 · python教程 | 1分钟前 |
- Pythonopen函数详解与使用教程
- 209浏览 收藏
-
- 文章 · python教程 | 8分钟前 |
- Python正则匹配路径及系统适配教程
- 156浏览 收藏
-
- 文章 · python教程 | 26分钟前 |
- Python移动平均实战教程
- 123浏览 收藏
-
- 文章 · python教程 | 40分钟前 |
- 正则表达式优化技巧全解析
- 171浏览 收藏
-
- 文章 · python教程 | 46分钟前 |
- Python中len的作用及用法详解
- 344浏览 收藏
-
- 文章 · python教程 | 54分钟前 | 项目部署 requirements.txt Python虚拟环境 依赖隔离 venv模块
- Python虚拟环境教程:项目依赖隔离指南
- 283浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- gRPCPython重试超时设置全解析
- 273浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Pandas重复索引列如何添加方法
- 102浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- OpenCV与FFmpeg帧传输实时编码解决方案
- 175浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 千音漫语
- 千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
- 167次使用
-
- MiniWork
- MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
- 162次使用
-
- NoCode
- NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
- 169次使用
-
- 达医智影
- 达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
- 170次使用
-
- 智慧芽Eureka
- 智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
- 183次使用
-
- Flask框架安装技巧:让你的开发更高效
- 2024-01-03 501浏览
-
- Django框架中的并发处理技巧
- 2024-01-22 501浏览
-
- 提升Python包下载速度的方法——正确配置pip的国内源
- 2024-01-17 501浏览
-
- Python与C++:哪个编程语言更适合初学者?
- 2024-03-25 501浏览
-
- 品牌建设技巧
- 2024-04-06 501浏览