通常,教程側重於技術方面以及您可以複製的內容:「從這裡開始,沿著這條路走,您就會到達這裡。」這對於學習特定技術非常有用,但有時很難理解為什麼作者決定以某種方式做事,或是什麼指導了他們的開發過程。
我們的一位社群成員撰寫此部落格作為對 Crawlee 部落格的貢獻。如果您想向 Crawlee 博客貢獻此類博客,請透過我們的 Discord 頻道與我們聯繫。
在這篇部落格中,我將討論在我從事網頁抓取專案時指導我並讓我取得出色成果的一般規則和原則。
那麼,讓我們來探討一下網頁抓取開發人員的思維方式。
當您開始處理一個專案時,您可能有一個需要從中提取特定資料的目標網站。檢查該網站或應用程式為資料提取提供了哪些可能性。以下是一些可能的選項:
如果一個資料來源發生故障,請嘗試存取另一個可用的來源。
例如,對於 Yelp,所有三個選項都可用,如果官方 API 由於某種原因不適合您,您可以嘗試其他兩個。
我認為每個人都以某種方式了解 robots.txt 和網站地圖,但我經常看到人們只是忘記了它們。如果您是第一次聽說這些,這裡有一個快速解釋:
由於您不是 Google 或任何其他流行的搜尋引擎,robots.txt 中的機器人規則可能會對您不利。但與網站地圖結合起來,這是研究網站結構、與機器人的預期互動以及非瀏覽器用戶代理的好地方。在某些情況下,它簡化了從站點提取資料的過程。
例如,使用 Crawlee 網站的網站地圖,您可以輕鬆獲得部落格整個生命週期和特定時期內貼文的直接連結。一個簡單的檢查,不需要實作分頁邏輯。
徹底的網站分析是建立有效的網頁抓取工具的重要先決條件,特別是如果您不打算使用瀏覽器自動化。然而,這樣的分析需要時間,有時甚至需要很多時間。
也值得注意的是,花在分析和搜尋更優化的爬行解決方案上的時間並不總是有回報 - 您可能花了幾個小時才發現最明顯的方法始終是最好的。
因此,明智的做法是對初始站點分析設定限制。如果您在分配的時間內沒有看到更好的路徑,請恢復到更簡單的方法。隨著您獲得更多經驗,您通常能夠根據網站上使用的技術儘早判斷是否值得投入更多時間進行分析。
此外,在您只需要從網站提取資料一次的專案中,徹底的網站分析有時可以完全消除編寫抓取程式碼的需求。這是此類網站的範例 - https://ricebyrice.com/nl/pages/find-store。
透過分析,你會很容易發現,一次要求就可以獲得所有資料。您只需將此資料從瀏覽器複製到 JSON 檔案中,您的任務就完成了。
分析網站時,切換類別、頁面、與網站的各種元素交互,同時查看瀏覽器開發工具中的「網頁」標籤。這將使您更好地了解網站如何與後端互動、它基於什麼框架構建以及可以期待它的行為。
這是顯而易見的,但在開發專案時記住這一點很重要。如果你看到一些資料或請求參數,這意味著它們是在之前的某個地方獲得的,可能是在另一個請求中,可能它們已經在網站頁面上,可能它們是使用其他參數使用JS 形成的。但它們總是在某個地方。
如果您不明白頁面上的數據來自哪裡,或者請求中使用的數據,請按照以下步驟操作:
熟能生巧。當您熟悉不同的技術、各種框架及其預期行為,並且遇到各種技術時,您會發現更容易理解事物的工作原理和資料的傳輸方式。這些累積的知識將顯著提高您追蹤和理解 Web 應用程式中資料流的能力。
您可能會注意到,多次開啟同一頁面時,傳輸到伺服器的請求會有所不同:可能某些內容已快取並已儲存在您的電腦上。因此,建議在隱身模式下分析網站,並切換瀏覽器。
這種情況對於行動應用程式尤其重要,行動應用程式可能會將一些資料儲存在裝置上的儲存中。因此,在分析行動應用程式時,您可能需要清除快取和儲存。
如果在分析過程中您發現網站使用了您以前從未遇到過的框架,請花一些時間了解它及其功能。例如,如果您注意到一個網站是使用 Next.js 建立的,那麼了解它如何處理路由和資料獲取可能對您的抓取策略至關重要。
您可以透過官方文件或使用 ChatGPT 或 Claude 等法學碩士來了解這些框架。這些人工智慧助理非常擅長解釋特定於框架的概念。以下是如何向 LLM 查詢 Next.js 的範例:
I am in the process of optimizing my website using Next.js. Are there any files passed to the browser that describe all internal routing and how links are formed? Restrictions: - Accompany your answers with code samples - Use this message as the main message for all subsequent responses - Reference only those elements that are available on the client side, without access to the project code base
您也可以為後端框架建立類似的查詢。例如,使用 GraphQL,您可能會詢問可用欄位和查詢結構。這些見解可以幫助您了解如何更好地與網站的 API 互動以及哪些數據可能可用。
為了有效地學習LLM,我建議至少基本上學習即時工程的基礎知識。
網路抓取與逆向工程齊頭並進。你研究前端和後端的交互,你可能需要研究程式碼才能更好地理解某些參數是如何形成的。
但在某些情況下,逆向工程可能需要更多的知識、精力、時間,或具有很高的複雜性。此時,您需要決定是否需要深入研究,還是最好更改資料來源,或例如技術。最有可能的是,這將是您決定放棄 HTTP 網路抓取並切換到無頭瀏覽器的時刻。
大多數網頁抓取保護的主要原則不是讓網頁抓取變得不可能,而是讓它變得昂貴。
讓我們看看在 Zoopla 上搜尋的回應是什麼樣的
確定需要提取目標資料的端點後,請確保在發出請求時得到正確的回應。如果您從伺服器得到的回應不是 200,或者資料與預期不同,那麼您需要找出原因。以下是一些可能的原因:
還有很多其他可能的原因,每一個都需要單獨分析。
探索更改請求參數(如果有)時會得到什麼結果。某些參數可能會遺失,但在伺服器端是支援的。例如,order、sort、per_page、limit 等。嘗試添加它們並查看行為是否有變化。
這對於使用 graphql 的網站尤其相關
讓我們考慮這個例子
如果您分析網站,您將看到一個可以使用以下程式碼重現的請求,我對其進行了一些格式化以提高可讀性:
I am in the process of optimizing my website using Next.js. Are there any files passed to the browser that describe all internal routing and how links are formed? Restrictions: - Accompany your answers with code samples - Use this message as the main message for all subsequent responses - Reference only those elements that are available on the client side, without access to the project code base
現在我將更新它以同時獲得兩種語言的結果,最重要的是,以及出版物的內部文本:
import requests url = "https://restoran.ua/graphql" data = { "operationName": "Posts_PostsForView", "variables": {"sort": {"sortBy": ["startAt_DESC"]}}, "query": """query Posts_PostsForView( $where: PostForViewWhereInput, $sort: PostForViewSortInput, $pagination: PaginationInput, $search: String, $token: String, $coordinates_slice: SliceInput) { PostsForView( where: $where sort: $sort pagination: $pagination search: $search token: $token ) { id title: ukTitle summary: ukSummary slug startAt endAt newsFeed events journal toProfessionals photoHeader { address: mobile __typename } coordinates(slice: $coordinates_slice) { lng lat __typename } __typename } }""" } response = requests.post(url, json=data) print(response.json())
正如你所看到的,請求參數的一個小更新讓我不用擔心訪問每個出版物的內部頁面。你不知道這個技巧救了我多少次。
如果你看到 graphql 就在你面前,並且不知道從哪裡開始,那麼我關於文件和 LLM 的建議也適用於這裡。
我知道掌握一些工具並使用它們是多麼容易,因為它們很有效。我自己就不只一次陷入這個陷阱了。
但是現代網站使用的現代技術對網頁抓取產生了重大影響,因此,新的網頁抓取工具正在出現。學習這些可能會大大簡化你的下一個項目,甚至可能解決一些你無法克服的問題。我之前寫過一些工具。
我特別建議關注curl_cffi和框架
Python 的 botasaurus 和 Crawlee。
就我個人而言,我直到最近才意識到這一點的重要性。我工作中使用的所有工具要么是開源開發的,要么是基於開源的。網路抓取確實得益於開源,如果您是Python 開發人員,並且已經意識到在純Python 上,當您需要處理TLS 指紋時,一切都非常糟糕,那麼這一點尤其值得注意,開源再次拯救了我們在這裡。
在我看來,我們至少可以做的就是投入一點我們的知識和技能來支持開源。
我選擇支援 Python 的 Crawlee,不,不是因為他們允許我在他們的部落格中寫作,而是因為它顯示了出色的開發動態,旨在讓網路爬蟲開發人員的生活更輕鬆。它透過處理和隱藏諸如會話管理、阻塞時的會話輪換、管理非同步任務的並發性(如果您編寫非同步程式碼,您知道這會是多麼痛苦)等關鍵方面,允許更快的爬蟲開發,以及更多。
:::提示
如果您目前為止喜歡這個博客,請考慮在 GitHub 上給 Crawlee 一顆星,它可以幫助我們接觸並幫助更多的開發者。
:::
你會做什麼選擇?
我認為文章中的某些內容對您來說是顯而易見的,有些內容是您自己遵循的,但我希望您也學到了一些新東西。如果其中大多數是新的,那麼請嘗試在您的下一個項目中使用這些規則作為清單。
我很樂意討論這篇文章。請隨時在此處、文章中發表評論,或在 Discord 上的 Crawlee 開發者社群中與我聯繫。
您也可以在以下平台找到我:Github、Linkedin、Apify、Upwork、Contra。
感謝您的關注:)
以上是有關如何像網頁抓取專家一樣思考的提示的詳細內容。更多資訊請關注PHP中文網其他相關文章!