1. 程式人生 > >做PHP爬蟲之QUERYLIST庫(PHP爬蟲外掛)

做PHP爬蟲之QUERYLIST庫(PHP爬蟲外掛)

前言

很多人在做網站的時候可能有這樣的需求,前期網站內容不多需要從外站獲取,需求量較大的時候,我們不可能手工進行轉載。這時候“爬蟲”顯得尤為重要。下面就讓我介紹在php下如何做一個“爬蟲”。
前期我在做小程式的時候需要大量的關於電腦的文章(教程),自己打算寫一個爬蟲直接打算從網上爬取。由於自己的經驗不足只單純的利用了PHP的字元擷取替換查詢及正則表示式寫了一個PHP爬蟲,雖然最後達到了爬取的作用,但是因為使用這種方法只能針對具有一樣排版的網站(或者說只適用於一個網站),所以當我需要獲取其他網站內容時就需要重寫演算法。這極其不利於後期的維護。後來我想使用PYTHON爬蟲獲取內容然後入庫,然後再用PHP去讀,可是這樣PYTHON也要和資料對接,這樣也不利於維護。之後想到PY作為膠水語言,是不是可以和PHP一起使用呢?雖說可以,但是網上沒有確切的解決辦法,我也不想花時間去嘗試PHP+PYTHON的方法。後面經過查詢,找到了PHP中的爬蟲類庫QUERYLIST。有人可能會有疑問,呼叫這個類庫就能後輕鬆的爬取內容了嗎?我做個簡單的比喻,PHP中的QueryList類庫就相當於Python中的BS4(Beautiful Soup 4)模組。

QueryList類庫

QueryList雖然可以讓我們在PHP環境下輕鬆的爬取網站內容,但是在功能方面還是不如BS4,如果有特殊需求,建議使用Python BS4。

官方介紹

我們有時需要抓取一個網頁的內容,但只需要特定部分的資訊,通常會用正則來解決,這當然沒有問題。正則是一個通用解決方案,但特定情況下,往往有更簡單快 捷的方法。比如你想查詢一個程式設計方面的問題,當然可以使用Google,但stackoverflow 作為一個專業的程式設計問答社群,會提供給你更多,更靠譜的答案。

對於html頁面,不應該使用正則的原因主要有3個

1、編寫條件表示式比較麻煩

尤其對於新手,看到一堆”不知所云”的字元評湊在一起,有種腦袋都要炸了的感覺。如果要分離的物件沒有太明顯的特徵,正則寫起來更是麻煩。

2、效率不高

對於php來說,正則應該是沒有辦法的辦法,能通過字串函式解決的,就不要勞煩正則了。用正則去處理一個30多k的檔案,效率不敢保證。

3、有phpQuery

如果你使用過jQuery,想獲取某個特定元素應該是輕而易舉的事情,phpQuery讓這成為了可能。

phpQuery
在介紹QueryList之前,有必要先來介紹一下phpQuery。

phpQuery是一個用php實現的類似jQuery的開源專案,可以在伺服器端以jQuery的語法形式解析網頁元素。

基本上jQuery的選擇器都可以用在phpQuery上,phpQuery很強大可以對DOM進行任何複雜的操作,而接下來要介紹的QueryList則相當於phpQuery的子集,發揮它採集方面的強大功能。

QueryList
QueryList是一個基於phpQuery的PHP通用列表採集類,得益於phpQuery,讓使用QueryList幾乎沒有任何學習成本,只要會CSS3選擇器就可以輕鬆使用QueryList了,它讓PHP做採集像jQuery選擇元素一樣簡單。 QueryList的幾個特點:

學習簡單:只有一個核心的API
使用簡單:用jQuery選擇器來選擇頁面元素
自帶過濾功能,可過濾掉無用的內容
支援無限層級巢狀採集
採集結果直接以採集規則以列表的形式有序的返回
支援擴充套件

下載安裝使用

下載安裝使用,請直接移步官方文件進行檢視
官方文件

框架中使用QueryList

關於框架中使用的方法,官方給出的是THINKPHP3的教程,顯然在現在來說THINKPHP3框架太老了,在我寫這篇博文的時候THINKPHP框架已經更新到了5.1版本。QueryList官方提供的關於ThinkPHP3的使用方法在5中是不適用的。後期我會把這個補上,寫一篇關於ThinkPHP5如何使用類庫和QueryList在其中的一些使用技巧。(畢竟我也是剛接觸到QueryList類庫,需要一段時間的適應期,也希望有大佬可以指點。)

使用效果
  1. 網頁原型

  1. 示例程式碼
<?php

require 'vendor/autoload.php';

use QL\QueryList;

// 待採集的頁面地址
$url = 'https://www.cnbeta.com/articles/tech/779841.htm';

// 採集規則
$rules = [
    // 文章標題
    'title' => ['.title>h1','text'],
    // 釋出日期
    'date' => ['.meta>span:eq(0)','text'],
    // 文章內容
    'content' => ['#artibody','html']
];

$data = QueryList::Query($url,$rules)->data;

print_r($data);
  1. 效果
Array
(Array
(
    [0] => Array
        (
            [title] => GitHub意外宕機 已確認資料儲存系統存在問題
            [date] => 2018年10月22日 14:42
            [content] => <p style="text-align: center;"><img src="https://static.cnbetacdn.com/article/2018/1022/82e649adfde2e98.png" alt="github-down-due-to-data-storage-system-issue-523345-2.png"></p>
<p>發稿前,GitHub 已經排除了部分故障。目前似乎只有某些特定地區受到了影響,但歐洲等部分地區仍未完全恢復。</p>
<blockquote>
<p>GitHub 團隊表示,資料儲存系統是導致本次故障的罪魁禍首。為儘快恢復服務,他們正在努力修復。</p>
<p>過去的幾個小時,所有工作都集中在這方面。在此期間,部分使用者可能看到不一致的結果。</p>
</blockquote>
<p>今年早些時候,<a data-link="1" href="https://afflnk.microsoft.com/c/1251234/439031/7808" target="_blank">微軟</a>宣佈以 75 億美元收購 GitHub 。近日,歐盟委員會認定微軟接管 GitHub 不違背反競爭原則,並准予放行。</p>
<p>[編譯自:<a href="https://news.softpedia.com/news/github-down-due-to-data-storage-system-issue-523345.shtml" target="_self">Softpedia</a>]</p>
        )

)
END