如何使用 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 作为您的模板类型。

立即学习“Python免费学习笔记(深入)”;

导航到项目目录并完成安装:

cd crawlee-google-searchpoetry install

使用 python 开发 google 搜索抓取工具

1. 定义提取数据

首先,让我们定义提取范围。谷歌的搜索结果现在包括地图、名人、公司详细信息、视频、常见问题和许多其他元素。我们将重点分析带有排名的标准搜索结果。

这是我们要提取的内容:

如何使用 Python 抓取 Google 搜索结果

我们来验证一下是否可以从页面的html代码中提取必要的数据,或者是否需要更深入的分析或js渲染。请注意,此验证对 html 标签敏感:

如何使用 Python 抓取 Google 搜索结果

根据从页面获取的数据,所有必要的信息都存在于 html 代码中。因此,我们可以使用beautifulsoup_crawler。

我们将提取的字段:

搜索结果标题网址描述文字排名位置

2.配置爬虫

首先,让我们创建爬虫配置。

我们将使用 curlimpersonatehttpclient 作为带有预设标头的 http_client,并模拟与 chrome 浏览器相关的内容。

我们还将配置 concurrencysettings 来控制抓取攻击性。这对于避免被 google 屏蔽至关重要。

如果您需要更集中地提取数据,请考虑设置proxyconfiguration。

from crawlee.beautifulsoup_crawler import beautifulsoupcrawlerfrom crawlee.http_clients.curl_impersonate import curlimpersonatehttpclientfrom crawlee import concurrencysettings, httpheadersasync 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代码:

如何使用 Python 抓取 Google 搜索结果

可读 id 属性和生成 类名和其他属性之间存在明显区别。创建用于数据提取的选择器时,您应该忽略任何生成的属性。即使您已经了解到 google 已经使用特定的生成标签 n 年了,您也不应该依赖它 – 这反映了您编写健壮代码的经验。

现在我们了解了 html 结构,让我们来实现提取。由于我们的爬虫只处理一种类型的页面,因此我们可以使用 router.default_handler 来处理它。在处理程序中,我们将使用 beautifulsoup 迭代每个搜索结果,在保存结果时提取标题、url 和 text_widget 等数据。

@crawler.router.default_handlerasync 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.mainfrom crawlee.beautifulsoup_crawler import beautifulsoupcrawler, beautifulsoupcrawlingcontextfrom crawlee.http_clients.curl_impersonate import curlimpersonatehttpclientfrom crawlee import request, concurrencysettings, httpheadersfrom .routes import routerqueries = ["apify", "crawlee"]crawl_depth = 2async 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.routesfrom crawlee.beautifulsoup_crawler import BeautifulSoupCrawlingContextfrom crawlee.router import Routerrouter = Router[BeautifulSoupCrawlingContext]()@router.default_handlerasync 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 文件中的结果:

如何使用 Python 抓取 Google 搜索结果

代码存储库可在 github 上获取

使用 apify 抓取 google 搜索结果

如果您正在从事需要数百万个数据点的大型项目,例如本文中有关 google 排名分析的项目 – 您可能需要一个现成的解决方案。

考虑使用 apify 团队开发的 google 搜索结果抓取器。

它提供了重要的功能,例如:

代理支持大规模数据提取的可扩展性地理位置控制与 zapier、make、airbyte、langchain 等外部服务集成

您可以在 apify 博客中了解更多信息

你会刮什么?

在本博客中,我们逐步探索了如何创建收集排名数据的 google 搜索抓取工具。如何分析此数据集取决于您!

温馨提示,您可以在 github 上找到完整的项目代码。

我想 5 年后我需要写一篇关于“如何从 llm 的最佳搜索引擎中提取数据”的文章,但我怀疑 5 年后这篇文章仍然具有相关性。

以上就是如何使用 Python 抓取 Google 搜索结果的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1354559.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月13日 18:38:07
下一篇 2025年12月13日 18:38:23

相关推荐

  • AoC ‘- 日历史学家歇斯底里(C# 和 Python)#剧透

    今天的挑战非常简单: 第 1 部分:为了解决这个问题,我们必须 根据字符串输入创建 2 个数字列表,按升序排序对于list1中的每个数字,在list2中获取相同的索引,并找到两个数字之间的距离。 然后将距离相加 简单吧。 第 2 部分: 这有点棘手,但我的解决方案的主要概念是: 立即学习“Pytho…

    好文分享 2025年12月13日
    000
  • 爬虫python怎么读

    Python 网页爬取可通过 requests 库获取响应内容,再用 BeautifulSoup 库解析 HTML 结构。首先导入 requests 库发送 HTTP 请求,然后导入 BeautifulSoup 库解析内容,可查找和提取 HTML 元素,从而获取网页内容。requests 库适用于发…

    2025年12月13日
    000
  • python爬虫怎么点按钮

    使用 Seleniumwebdriver 来模拟浏览器操作,通过单击元素的 ID 或 XPath 来点击按钮。步骤包括:安装 Seleniumwebdriver、导入模块、创建 WebDriver 实例、导航到页面、定位按钮(使用 find_element_by_id() 或 find_elemen…

    2025年12月13日
    000
  • python爬虫代码怎么操作

    如何操作 Python 爬虫代码?导入 Python 库(requests、BeautifulSoup);发送 HTTP 请求获得 HTML 代码;解析 HTML 代码形成树形结构;查找所需的 HTML 元素;提取所需的数据;对提取的数据进行处理;输出处理后的数据。 如何操作 Python 爬虫代码…

    2025年12月13日
    000
  • python 怎么验证反爬虫

    Python 中验证反爬虫措施的步骤包括:检查 HTTP 状态码;分析响应头;提取 капча;分析 JavaScript 行为;检查限速机制;使用代理;使用防浏览器检测工具库;人工验证。 如何验证 Python 中的反爬虫措施 在网络爬取过程中,网站通常会实施反爬虫措施来防止滥用或过量爬取。验证反…

    2025年12月13日
    000
  • python爬虫时怎么设置访问时间间隔

    回答:使用 Python 爬虫时,设置访问时间间隔至关重要,以避免服务器过载和封禁。方法如下:导入 time 模块。设置时间间隔(以秒为单位)。访问网页。等待时间间隔。时间间隔的好处包括减少服务器负载、避免封禁和提高爬取效率。最佳间隔取决于流量大小(高流量网站需要较长间隔)。其他注意事项包括网站限制…

    2025年12月13日
    000
  • python爬虫不按顺序怎么办

    解决 Python 爬虫页面抓取无序问题的方法:并行抓取:使用同步机制(如队列)按请求顺序抓取页面。动态页面:使用 JavaScript 渲染引擎模拟用户交互以获得一致视图。服务器端排序:分析排序规则,禁用排序机制或使用 headless 浏览器。爬虫速度过快:调整延迟或速度,使用代理避免被识别为爬…

    2025年12月13日
    000
  • python3爬虫实习报告怎么写

    Python3 爬虫实习收获:熟练掌握 Python3 爬虫技术,精通 Scrapy 框架。培养了问题解决能力,了解了反爬虫技术和应对策略。参与团队协作,提升了沟通和协作能力。了解了互联网数据采集行业的现状和发展趋势。提升了就业竞争力,拓宽了职业视野。 Python3 爬虫实习报告 引言随着互联网技…

    2025年12月13日
    000
  • python 爬虫 该怎么问面试者

    在 Python 爬虫面试中,通过询问以下问题可评估应聘者的能力和经验:Python 爬虫编写经验:了解候选人的经验程度。应对爬虫挑战:考察其解决问题和处理复杂任务的能力。爬虫被阻止的对策:评估其应对常见爬虫挑战的策略。Python 爬虫库的了解程度:确定对 Python 网络爬虫库的熟悉程度。网络…

    2025年12月13日
    000
  • Python爬虫怎么设置进度条

    Python爬虫设置进度条的方法有:使用 tqdm 库:提供易用的 API 和丰富的自定义选项。使用进度条回调函数:适合需要自定义进度或低级爬虫任务。使用 rich 库:提供美观且高级的进度条和控制台输出。 Python爬虫如何设置进度条 简介 在爬取大型网站或处理庞大数据集时,使用进度条可以直观地…

    2025年12月13日
    000
  • python爬虫验证码怎么解决

    Python爬虫验证码解决方案包括图像识别、服务端API、模拟浏览器行为和打码平台。选择解决方案取决于验证码类型、复杂程度和预算,使用验证码解决方案时需要注意遵守网站爬虫政策和避免频繁访问。 Python爬虫验证码解决方案 在网络爬取的过程中,经常会遇到验证码的阻碍。验证码是一种安全机制,用于防止恶…

    2025年12月13日
    000
  • python爬虫之谷歌怎么抓包

    使用Python爬虫抓取谷歌数据可以使用谷歌搜索API或第三方工具。具体步骤包括:使用谷歌搜索API:注册谷歌云平台账号并启用搜索API。安装google-api-python-client库。创建API客户端并执行搜索。解析搜索结果。使用第三方工具:selenium:用于模拟真实浏览器的行为。Be…

    2025年12月13日
    000
  • 快速编程

    快速编程是指自动插入代码并解决简单问题的模板。 从文件中卸载样本并用标签填充数据数组是可以复制并粘贴到不同项目中的基本操作。 from google.colab import drivedrive.mount(‘/content/gdrive’, force_remount=true)!cp /co…

    2025年12月13日
    000
  • 用于快速启动 Polylith 的 Cookiecutter

    向您展示一个python cookiecutter,用于在python 中快速启动polylith。如果您不知道什么是 polylith,请阅读文档,对于不耐烦的读者: polylith 是一种软件架构,旨在构建简单、可维护、可测试和可扩展的后端系统。它通过在系统规模上应用功能思维来实现这一点,将代…

    2025年12月13日
    000
  • [CVHSV 与 RGB:理解和利用 HSV 进行图像处理

    在上一篇文章中,我们探索了在 opencv 中处理 rgb 图像的基础知识,包括绘图以及调整亮度和对比度。虽然 rgb 色彩空间非常适合计算机显示器,因为它以屏幕发出的光强度来表示颜色,但它与人类在自然世界中感知颜色的方式并不相符。这就是 hsv(色相、饱和度、明度)发挥作用的地方——一个旨在以更接…

    2025年12月13日 好文分享
    000
  • 单一性下界

    幺正性确保矩阵和顶点被相同数量的内存覆盖。每个存储单元的单一数据类型简化了其每个单独函数的代码和操作。修剪可选参数(例如 3 个限制)可以更轻松地测试和验证复杂的 python 机制。 a.numerical_approx(digits = 3)x.numerical_approx(digits =…

    2025年12月13日
    000
  • 人工智能如何塑造更智能的游戏和模拟世界

    人工智能 (AI) 正在迅速改变游戏格局,使视频游戏变得更加身临其境、智能且引人入胜。从增强 NPC(非玩家角色)行为到创建逼真的虚拟环境,人工智能是游戏开发和模拟体验中许多创新的核心。 在本文中,我们将探讨人工智能如何将游戏提升到一个新的水平,深入探讨埃隆·马斯克对游戏中人工智能的愿景,并讨论这些…

    2025年12月13日
    000
  • 如何使用 Python 创建带有时间和日期的动态壁纸

    如果您曾经想要一张能根据当前时间和日期自动更新的壁纸,那么本教程适合您。我们将使用 python 和一些库(如 pil (pillow))生成图像,添加带有时间和日期的动态文本,然后将此图像设置为 windows 上的壁纸。 我们需要什么? 已安装 python:如果您尚未安装 python,可以从…

    2025年12月13日
    000
  • 理解 Python 中的闭包

    在python中,闭包是一个重要的概念,它允许函数“记住”它被创建的环境,即使在函数完成执行之后也是如此。闭包允许我们在不使用全局变量或类实例的情况下实现有状态函数。 在这篇文章中,我们将通过使用 nonlocal 关键字实现一个简单的计数器来探索闭包。让我们深入探讨一下! 什么是闭包? 当嵌套函数…

    2025年12月13日
    000
  • 配置 Django 项目以将敏感数据存储在 YAML 文件中

    .py 文件中硬编码令牌、数据库凭据和其他敏感数据并不安全。很多人使用django-environ库,但我认为它不方便。因此,我使用 yaml 文件来存储敏感数据,并使用 pyyaml 库来读取它们的数据。 创建项目文件夹: mkdir myproject 切换创建的文件夹: cd myprojec…

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信