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兩個方法抓取其它項目時不一定適用,要改成自己的邏輯處理。
- 運行
至此一個簡單的抓取數據程序就完成了。