首頁 >後端開發 >Python教學 >如何使用 Python 抓取 Google 搜尋結果

如何使用 Python 抓取 Google 搜尋結果

Susan Sarandon
Susan Sarandon原創
2024-12-05 12:31:10537瀏覽

抓取 Google 搜尋可提供基本的 SERP 分析、SEO 最佳化和資料收集功能。現代抓取工具使這個過程更快、更可靠。

我們的一位社群成員撰寫了此博客,作為對 Crawlee 博客的貢獻。如果您想向 Crawlee 博客貢獻此類博客,請透過我們的 Discord 頻道與我們聯繫。

在本指南中,我們將使用 Crawlee for Python 建立一個 Google 搜尋抓取工具,可以處理結果排名和分頁。

我們將建立一個抓取工具:

  • 從搜尋結果中擷取標題、URL 和描述
  • 處理多個搜尋查詢
  • 追蹤排名位置
  • 處理多個結果頁
  • 以結構化格式儲存資料

先決條件

  • Python 3.7 或更高版本
  • 對 HTML 和 CSS 選擇器的基本了解
  • 熟悉網頁抓取概念
  • Crawlee for Python v0.4.2 或更高版本

項目設定

  1. 安裝 Crawlee 所需的依賴:

    pipx install crawlee[beautifulsoup,curl-impersonate]
    
  2. 使用 Crawlee CLI 建立一個新專案:

    pipx run crawlee create crawlee-google-search
    
  3. 出現提示時,選擇 Beautifulsoup 作為您的範本類型。

  4. 導覽至專案目錄並完成安裝:

    cd crawlee-google-search
    poetry install
    

使用 Python 開發 Google 搜尋抓取工具

1. 定義擷取數據

首先,讓我們先定義提取範圍。谷歌的搜尋結果現在包括地圖、名人、公司詳細資訊、影片、常見問題和許多其他元素。我們將重點分析帶有排名的標準搜尋結果。

這是我們要提取的內容:

How to scrape Google search results with Python

我們來驗證是否可以從頁面的HTML程式碼中提取必要的數據,或者是否需要更深入的分析或JS渲染。請注意,此驗證對 HTML 標籤敏感:

How to scrape Google search results with Python

根據從頁面取得的數據,所有必要的資訊都存在於 HTML 程式碼中。因此,我們可以使用beautifulsoup_crawler。

我們將提取的欄位:

  • 搜尋結果標題
  • 網址
  • 描述文字
  • 排名位置

2.配置爬蟲

首先,讓我們建立爬蟲配置。

我們將使用 CurlImpersonateHttpClient 作為預設標頭的 http_client,並模擬與 Chrome 瀏覽器相關的內容。

我們也會配置 ConcurrencySettings 來控制抓取攻擊性。這對於避免被 Google 封鎖至關重要。

如果您需要更集中地提取數據,請考慮設定ProxyConfiguration。

pipx install crawlee[beautifulsoup,curl-impersonate]

3. 實現資料擷取

首先我們來分析一下需要擷取的元素的HTML程式碼:

How to scrape Google search results with Python

可讀 ID 屬性和產生 類別名稱和其他屬性之間有明顯差異。建立用於資料擷取的選擇器時,您應該忽略任何產生的屬性。即使您已經了解到 Google 已經使用特定的生成標籤 N 年了,您也不應該依賴它 - 這反映了您編寫健壯程式碼的經驗。

現在我們了解了 HTML 結構,讓我們來實作擷取。由於我們的爬蟲只處理一種類型的頁面,因此我們可以使用 router.default_handler 來處理它。在處理程序中,我們將使用 BeautifulSoup 迭代每個搜尋結果,在儲存結果時提取標題、url 和 text_widget 等資料。

pipx run crawlee create crawlee-google-search

4. 處理分頁

由於 Google 結果取決於搜尋請求的 IP 地理位置,因此我們不能依賴連結文字進行分頁。我們需要創建一個更複雜的 CSS 選擇器,無論地理位置和語言設定如何,它都可以工作。

max_crawl_depth 參數控制我們的爬蟲應該掃描多少頁面。一旦我們有了強大的選擇器,我們只需獲取下一頁連結並將其添加到爬蟲隊列中即可。

要編寫更有效率的選擇器,請學習 CSS 和 XPath 語法的基礎知識。

cd crawlee-google-search
poetry install

5. 將資料匯出為CSV格式

由於我們希望以方便的表格格式(例如 CSV)保存所有搜尋結果數據,因此我們可以在運行爬蟲後立即添加 export_data 方法呼叫:

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'])

6. 完成 Google 搜尋抓取工具

雖然我們的核心爬蟲邏輯有效,但您可能已經注意到我們的結果目前缺乏排名位置資訊。為了完成我們的抓取工具,我們需要透過使用請求中的 user_data 在請求之間傳遞資料來實現正確的排名位置追蹤。

讓我們修改腳本來處理多個查詢並追蹤搜尋結果分析的排名位置。我們還將爬行深度設定為頂級變數。讓我們將 router.default_handler 移至 paths.py 以符合專案結構:

@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)

我們也可以修改處理程序以新增 query 和 order_no 欄位以及基本錯誤處理:

    await context.enqueue_links(selector="div[role='navigation'] td[role='heading']:last-of-type > a")

我們就完成了!

我們的 Google 搜尋抓取工具已準備就緒。讓我們來看看 google_ranked.csv 檔案中的結果:

How to scrape Google search results with Python

程式碼儲存庫可在 GitHub 上取得

使用 Apify 抓取 Google 搜尋結果

如果您正在從事需要數百萬個數據點的大型項目,例如本文中有關 Google 排名分析的項目 - 您可能需要一個現成的解決方案。

考慮使用 Apify 團隊開發的 Google 搜尋結果抓取工具。

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

  • 代理支援
  • 大規模資料擷取的可擴充性
  • 地理位置控制
  • 與 Zapier、Make、Airbyte、LangChain 等外部服務整合

您可以在 Apify 部落格中了解更多

你會刮什麼?

在本部落格中,我們逐步探索如何建立收集排名資料的 Google 搜尋抓取工具。如何分析此數據集取決於您!

溫馨提示,您可以在 GitHub 上找到完整的專案代碼。

我想 5 年後我需要寫一篇關於「如何從 LLM 的最佳搜尋引擎中提取資料」的文章,但我懷疑 5 年後這篇文章仍然具有相關性。

以上是如何使用 Python 抓取 Google 搜尋結果的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn