phpspider 的簡單使用


phpspider 的簡單使用

  • phpspider是一款PHP開發蜘蛛爬蟲框架。

    官方github下載地址:https://github.com/owner888/phpspider 
    官方文檔下載地址:https://doc.phpspider.org/ 
    由於官方文檔可能會出現打不開的情況(我一開始試了很多次都打不開),這里提供一個網盤下載地址:鏈接:https://pan.baidu.com/s/1LfJOCw1rthN_luotF7iUDw 密碼:cylb

  • 使用 
    代碼下載下來后里面有幾個例子,我這里就以代碼中糗事百科為例,主要介紹幾點注意事項。 
    1、代碼必須放到命令行運行,可以使用 php -f 語句。 
    2、在代碼中的例子糗事百科抓取網址寫的是 http,運行不成功,要改成 https。 
    3、save_running_state 參數表示是否保存爬蟲運行狀態,如果選擇了true,則會使用到redis。 
    4、抓取時默認使用的 selector 是 xpath,如果想使用其它的可以用 selector_type 參數修改,文檔中介紹目前可用 xpath, jsonpath, regex,但是我看使用 css 也是可以的。 
    5、寫 selector 時可以打開要抓取的頁面,審查元素,選擇要抓取的數據,右擊->copy,選擇 copy selector 或 copy xpath ,可以直接得到該元素的 selector。(這點在開發文檔上也有相應的介紹)。 
    6、抓取的數據存儲可以有三種選擇,.csv 文件,.sql 文件,也可以直接插入數據庫表中,選擇相應的表名即可(要字段對應)。

下面貼上我修改后的代碼:

<?php
// composer下載方式
// 先使用composer命令下載:
// composer require owner888/phpspider
// 引入加載器
//require './vendor/autoload.php';

// GitHub下載方式
require_once __DIR__ . '/../autoloader.php';
use phpspider\core\phpspider;

/* Do NOT delete this comment */
/* 不要刪除這段注釋 */

$configs = array(
    'name' => '糗事百科',
    'log_show' => true,
    'tasknum' => 1,
    'save_running_state' => false,
    'domains' => array(
        'qiushibaike.com',
        'www.qiushibaike.com'
    ),
    'scan_urls' => array(
        'https://www.qiushibaike.com/'
    ),
    'list_url_regexes' => array(
        "https://www.qiushibaike.com/8hr/page/\d+\?s=\d+"
    ),
    'content_url_regexes' => array(
        "https://www.qiushibaike.com/article/\d+",
    ),
    'max_try' => 5,
    //'proxies' => array(
        //'http://H784U84R444YABQD:57A8B0B743F9B4D2@proxy.abuyun.com:9010'
    //),
    //'export' => array(
        //'type' => 'csv',
        //'file' => '../data/qiushibaike.csv',
    //),
    //'export' => array(
        //'type'  => 'sql',
        //'file'  => '../data/qiushibaike.sql',
        //'table' => 'content',
    //),
    'export' => array(
        'type' => 'db',
        'table' => 'content',
    ),
    'db_config' => array(
        'host'  => '127.0.0.1',
        'port'  => 3306,
        'user'  => 'root',
        'pass'  => 'root',
        'name'  => 'test',
    ),
//    'queue_config' => array(
//        'host'      => '127.0.0.1',
//        'port'      => 6379,
//        'pass'      => 'foobared',
//        'db'        => 5,
//        'prefix'    => 'phpspider',
//        'timeout'   => 30,
//    ),
    'fields' => array(
        array(
            'name' => "article_title",
            'selector' => "//*[@id='single-next-link']//div[contains(@class,'content')]/text()[1]",
            'required' => true,
        ),
        array(
            'name' => "article_author",
            'selector' => "//div[contains(@class,'author')]//h2",
            'required' => true,
        ),
        array(
            'name' => "article_headimg",
            'selector' => "//div[contains(@class,'author')]//a[1]",
            'required' => true,
        ),
        array(
            'name' => "article_content",
            'selector' => "//*[@id='single-next-link']//div[contains(@class,'content')]",
            'required' => true,
        ),
        array(
            'name' => "article_publish_time",
            'selector' => "//div[contains(@class,'author')]//h2",
            'required' => true,
        ),
        array(
            'name' => "url",
            'selector' => "//div[contains(@class,'author')]//h2",   // 這里隨便設置,on_extract_field回調里面會替換
            'required' => true,
        ),
    ),
);

$spider = new phpspider($configs);

$spider->on_handle_img = function($fieldname, $img) 
{
    $regex = '/src="(https?:\/\/.*?)"/i';
    preg_match($regex, $img, $rs);
    if (!$rs) 
    {
        return $img;
    }

    $url = $rs[1];
    $img = $url;

    //$pathinfo = pathinfo($url);
    //$fileext = $pathinfo['extension'];
    //if (strtolower($fileext) == 'jpeg') 
    //{
        //$fileext = 'jpg';
    //}
    //// 以納秒為單位生成隨機數
    //$filename = uniqid().".".$fileext;
    //// 在data目錄下生成圖片
    //$filepath = PATH_ROOT."/images/{$filename}";
    //// 用系統自帶的下載器wget下載
    //exec("wget -q {$url} -O {$filepath}");

    //// 替換成真是圖片url
    //$img = str_replace($url, $filename, $img);
    return $img;
};

$spider->on_extract_field = function($fieldname, $data, $page) 
{
    if ($fieldname == 'article_title') 
    {
//        if (strlen($data) > 10)
//        {
//            // 下面方法截取中文會有異常
//            //$data = substr($data, 0, 10)."...";
//            $data = mb_substr($data, 0, 10, 'UTF-8')."...";
//            $data = trim($data);
//        }
    }
    elseif ($fieldname == 'article_publish_time') 
    {
        // 用當前采集時間戳作為發布時間
        $data = time();
    }
    // 把當前內容頁URL替換上面的field
    elseif ($fieldname == 'url') 
    {
        $data = $page['url'];
    }
    return $data;
};

$spider->start();

  

注意一點,on_handle_img,on_extract_field兩個方法抓取其它項目時不一定適用,要改成自己的邏輯處理。

  • 運行

至此一個簡單的抓取數據程序就完成了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM