1. 程式人生 > >php爬蟲——以爬取圖片為例

php爬蟲——以爬取圖片為例

爬蟲的一般思路如下:
  1. 分析目標源所有url
  2. 抓取URL
  3. 分析內容
  4. 入庫
現在以抓取一個圖片為主的網站為例,爬取其中的圖片。


1.分析目標源所有url



此處發現,

頻道的url

圖片詳情頁的url

注意,此網站頻道詳情頁運用非同步無限載入方式載入所有blog,隨著scrollbar的滾動,會通過api繼續請求文章,返回的是json檔案。

非同步載入blogapi


2.抓取url

一般的抓取url的思路是通過分析頁面的html結構,找到特定結構位置上的連結,通過get請求訪問該連結,進入到詳情頁,再獲取內容。

但是這個網站就不需要如此麻煩的操作,原因有如下幾點:

  • 網站文章詳情頁內容和頻道列表內容完全一致,都是圖片+

    一段描述

  • 網站雖然有翻頁按鈕,但是無限載入的json檔案可以不需要出發翻頁就能請求到所有資料

  • 非同步請求返回的json檔案內有我們需要的所有內容,包括圖片描述與圖片地址

所以只需要不停的請求非同步api就能夠爬取到圖片。下面我們來分析一下api


由於其中有json_encode()的中文符號,我們把這段url放到瀏覽器裡看一下



放大url部分


我們可以看到很多引數,再和其他url對比後發現,

影響獲取到的json檔案內容的引數有:

  • filter_id=時尚搭配_搭配達人//按照<大分類>_<小分類>的格式經過json_encode()後得到
  • start=24//這是分頁數目,一頁有25
    條記錄
  • _=1518201178347//這是大概是一個時間戳,且末尾的數字隨api請求詞數遞增,每次加1。並且沒有這個引數也能請求到資料。但是還是帶上比較好,防止請求過期和被網站限制請求次數

3.分析內容

也就是說,我們可以通過更改以上三個引數,獲取到json檔案封裝好的所有資料!我們把其中一個json檔案取出來看一下它的結構:


可以看到,limit引數表示了jsonitem的數目,

object_list下的msg是我們需要的圖片描述資訊,

object_list下的photo中的path是我們需要的圖片地址,

至此我們需要爬取的圖片資訊全部獲取到。

4.整理入庫

其實整個爬蟲過程中,最需要時間的是嗅探url

和整理入庫這兩步。

整理入庫需要根據表結構在提取出有用的資訊,再統一封裝好存入資料庫,這是一個很繁瑣的過程。不過本次圖片爬取先不細究改進入庫和統一入庫標準的操作,只研究到獲取到檔案為止。

我們已經有了圖片的地址,那麼如何將圖片批量下載到本地呢?

php中,只需呼叫file_get_contents()方法和file_put_contents()方法就可以了。

前者將檔案讀入到一個字串中,地址可以填寫網路地址;後者將字串寫進檔案。

$img = file_get_contents($path);

file_put_contents(‘檔名’,$img);

用這兩個核心語句就可以下載圖片到本地了~!