PHP 爬蟲實戰:下載整個網站的圖片,技術宅男福利

什麼是網頁抓取?

你是否曾經需要從一個沒有提供 API 的站點獲取信息? 我們可以通過網頁抓取,然後從目標網站的 HTML 中獲得我們想要的信息,進而解決這個問題。 當然,我們也可以手動提取這些信息, 但手動操作很乏味。 所以, 通過爬蟲來自動化來完成這個過程會更有效率。

在這個教程中我們會從 Pexels 抓取一些貓的圖片。這個網站提供高質量且免費的素材圖片。他們提供了API, 但這些 API 有 200次/小時 的請求頻率限制。

PHP 爬蟲實戰:下載整個網站的圖片,技術宅男福利

福利圖片

發起併發請求

在網頁抓取中使用異步 PHP (相比使用同步方式)的最大好處是可以在更短的時間內完成更多的工作。使用異步 PHP 使得我們可以立刻請求儘可能多的網頁而不是每次只能請求單個網頁並等待結果返回。 因此,一旦請求結果返回我們就可以開始處理。

首先,我們從 GitHub 上拉取一個叫做 buzz-react 的異步 HTTP 客戶端的代碼 -- 它是一個基於 ReactPHP 的簡單、致力於併發處理大量 HTTP 請求的異步 HTTP 客戶端:

composer require clue/buzz-react

這裡用到了composer這個神器,不瞭解的同學可以私信回覆“composer”自助獲取相關資料。

現在, 我們就可以請求 pexels 上的圖片頁面 了:

PHP 爬蟲實戰:下載整個網站的圖片,技術宅男福利

我們創建了 Clue\React\Buzz\Browser 的實例, 把它作為 HTTP client 使用。上面的代碼發起了一個異步的 GET 請求來獲取網頁內容(包含一張小貓們的圖片)。 $client->get($url) 方法返回了一個包含 PSR-7 response 的 promise 對象。

客戶端是異步工作的,這意味著我們可以很容易地請求幾個頁面,然後這些請求會被同步執行:

PHP 爬蟲實戰:下載整個網站的圖片,技術宅男福利

這裡的代碼含義如下:

  • 發起一個請求
  • 獲取響應
  • 添加響應的處理程序
  • 當響應解析完畢就處理響應

所以,這個邏輯可以提取到一個類裡,這樣我們可以很容易地請求多個 URL 並添加相同的響應處理程序。讓我們基於Browser創建一個包裝器。

用下面的代碼創建一個名為Scraper的類:

PHP 爬蟲實戰:下載整個網站的圖片,技術宅男福利

我們把Browser作為依賴項注入到構造函數並提供一個公共方法scrape(array $urls)。接著對每個指定的 URL 發起一個GET請求。當響應完成時,我們調用一個私有方法processResponse(string $html)。這個方法負責遍歷 HTML 代碼並下載圖片。下一步是審查收到的 HTML 代碼,然後從裡面提取圖片。

小編建議PHP版本最好在7.0以上,在實踐過程中遇到問題的可以私信小編哦~~把你們的D盤,E盤,F盤都裝滿吧!!


分享到:


相關文章: