- 源碼下載地址:https://github.com/owner888/phpspider
- 文檔:https://doc.phpspider.org/
- 我的環境是寶塔lnmp,php是5.4版本,不要用這個版本,缺各種擴展庫
- 錯誤1:沒有該擴展,不需要再php.ini中配置

- 錯誤2:缺這個擴展庫,不需要再php.ini中配置
跑跑的報這個錯:PHP Fatal error: Call to undefined function phpspider\core\mb_detect_encoding() in /www/wwwroot/wx.xiyang66.top/vendor/owner888/phpspider/core/requests.php on line 474


解決方法:執行?yum install php-mbstring -y
[toc]
## :-: **1、在linux上跑demo**
條件:linux上要有php環境,代碼上傳上去,執行php -f demo.php

想退出這個頁面執行quit 或 ctrl + c
你可能會疑惑,這要跑,爬來的數據放到哪里了呢??
## :-: **2、需要在$configs中加,這倆個配置**
參考文檔configs詳解之成員
``` php
//日志存放的位置
'log_file' => './data/qiushibaike.log',
'export' => array(
'type' => 'csv',
'file' => './data/qiushibaike.csv', //爬下來的數據放在data目錄下,目錄和文件要自己提前創建好
)
```
- 這里是存成了csv需要下載到本地電腦上看,因為這是個excel還是下載下來方便看
- 當然你也可以存到數據庫等
## :-: **3、完整的示例**
### :-: **3.1、思路**
具體還是要看代碼,思路只是方便理解和記憶
- www.ncnews.com.cn //這個頁面是網站首頁
- http://www.ncnews.com.cn/xwzx/ncxw/twnc/ //這個頁面是列表頁
- http://www.ncnews.com.cn/xwzx/ncxw/twnc/index(_[0-9]{0,2})?.html //這個頁面是列表頁下面的頁碼
- 這回我們就清晰了,我們要爬取的是<span style="color:blue;">列表頁</span>的數據:
3.1.1、接下來設置爬取規則

3.1.2、實例化,將配置傳給這個類的構造函數
3.1.3、添加新的url到帶爬對列
3.1.4、篩選爬到的數據,如標題弄出來,內容弄出來,并組裝好數據...
3.1.5、進行入庫操作
### :-: **3.2、代碼**
~~~
<?php
/**
* http://blog.csdn.net/will5451/article/details/78999995?%3E
* Created by PhpStorm.
* User: Administrator
* Date: 2018/2/1
* Time: 22:51
*/
require './vendor/autoload.php';
use phpspider\core\phpspider;
use phpspider\core\requests; //請求類
use phpspider\core\selector; //選擇器類
use phpspider\core\db; //選擇器類
use phpspider\core\log; //選擇器類
/* Do NOT delete this comment */
/* 不要刪除這段注釋 */
$configs = array(
'name' => '爬取新聞',
//'log_show' => true,
//定義爬蟲爬取哪些域名下的網頁, 非域名下的url會被忽略以提高爬取速度
'domains' => array(
'www.ncnews.com.cn' //寫域名
),
//定義爬蟲的入口鏈接, 爬蟲從這些鏈接開始爬取,同時這些鏈接也是監控爬蟲所要監控的鏈接
'scan_urls' => array(
'http://www.ncnews.com.cn/xwzx/ncxw/twnc/'
),
//定義內容頁url的規則
'content_url_regexes' => array(
"http://www.ncnews.com.cn/xwzx/ncxw/twnc/index(_[0-9]{0,2})?.html"
),
//爬蟲爬取每個網頁失敗后嘗試次數
'max_try' => 5,
//爬蟲爬取數據導出
'export' => array(
'type' => 'db',
'table'=> 'pachong', //表名
),
'db_config' => array(
'host' => 'localhost',
'port' => 3306,
'user' => '改成自己的', //mysql的賬號
'pass' => '改成自己的', //mysql的密碼
'name' => '改成自己的', //庫名
),
'fields' => array(
//從列表頁開始爬
array(
'name' => "lists",
'selector' => "//div[contains(@id,'container')]//ul//li[contains(@class,'item')]",
'required' => true,
'repeated' => true //寫上是數組(抓的是整個列表頁),不寫是字符串(只抓第一個)
),
),
//日志存放的位置
'log_file' => 'data/qiushibaike.log',
//只記錄 錯誤和調試日志
'log_type' => 'error,debug,warn,error',
//爬蟲爬取網頁所使用的瀏覽器類型.隨機瀏覽器類型,用于破解防采集
'user_agent' => array(
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",
"Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_3 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13G34 Safari/601.1",
"Mozilla/5.0 (Linux; U; Android 6.0.1;zh_cn; Le X820 Build/FEXCNFN5801507014S) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 Chrome/49.0.0.0 Mobile Safari/537.36 EUI Browser/5.8.015S",
),
//爬蟲爬取網頁所使用的偽IP。隨機偽造IP,用于破解防采集
'client_ip' => array(
'192.168.0.2',
'192.168.0.3',
'192.168.0.4',
),
);
$spider = new phpspider($configs);
//爬蟲初始化時調用, 用來指定一些爬取前的操作
$spider->on_start = function($spider)
{
requests::set_header("Referer", "http://www.ncnews.com.cn/xwzx/ncxw/twnc/index.html");
};
//在爬取到入口url的內容之后, 添加新的url到待爬隊列之前調用. 主要用來發現新的待爬url, 并且能給新發現的url附加數據(點此查看“url附加數據”實例解析).
$spider->on_scan_page = function($page,$content,$spider){
//列表頁只采集3頁。
for($i=0;$i<3;$i++){
if($i == 0){ //第一頁
$url = "http://www.ncnews.com.cn/xwzx/ncxw/twnc/index.html";
}else{ //之后的n頁
$url = "http://www.ncnews.com.cn/xwzx/ncxw/twnc/index_{$i}.html";
}
$options = [
'method' => 'get',
'params' => [
'page' => $i
],
];
$spider->add_url($url,$options); //添加新的url到待爬隊列
}
};
/**
* 對匹配后的字段field進行回調處理
* @param $filename
* @param $data
* @param $page
* @return array
*/
$spider->on_extract_field = function($filename,$data,$page){
$arr = [];
//處理抽取到的fields中name == lists的數據
if($filename == 'lists'){
if(is_array($data)){
foreach($data as $k=>$v){
$img = selector::select($v,"//img");
//如果該新聞沒有圖片,就刪除這條數據
if(empty($img)){
unset($data[$k]);
}else{
$url = "http://www.ncnews.com.cn/xwzx/ncxw/twnc";
$title = trim(selector::select($v,"//h3//a")); //抓列表頁的標題
//抓列表頁的圖片
if(substr(selector::select($v,"//img"),0,1)){
$title_imgs = selector::select($v,"//img");
}else{
$title_imgs = $url . ltrim(selector::select($v,"//img"),'.');
}
$title_desc = trim(selector::select($v,"//h5")); //抓列表頁的新聞簡介
//抓文章,跳轉到內容頁
$p = '/<h3><a[^<>]+href * \= *[\"\']?([^\'\"\+]).*?/i';
$title_url = selector::select($v,$p,'regex');
if(substr($title_url,0,1) == 'h'){
$title_link = $title_url;
}else{
$title_link = $url . ltrim($title_url,'.');
}
$title_time = strip_tags(selector::select($v,"//h6")); //抓列表頁的時間
//組裝數據
$arr[$k] = [
'title' => $title,
'title_imgs' => $title_imgs,
'title_desc' => $title_desc,
'title_link' => $title_link, //前往內容頁的鏈接
'title_time' => $title_time,
];
}
}
}
}
return $arr;
};
//入庫操作
$spider->on_extract_page = function($page,$data){
// echo "<pre>";
// var_dump($data);
// die;
//處理哪個數據
if(isset($data['lists'])){
foreach($data['lists'] as $v){
$arr = [
'title' => trim($v['title']),
'title_imgs' => urlencode($v['title_imgs']),
'title_desc' => $v['title_desc'],
'title_link' => urlencode($v['title_link']),
'title_time' => $v['title_time']
];
//標題重復就不入庫
$sql = "select count(*) as `count` from `pachong` where `title`".$v['title'];
$row = db::get_one($sql);
if(!$row['count']){
db::insert('pachong',$arr);
}
}
$data = $arr;
}
return $data;
};
$spider->start();
~~~
### :-: **3.3、表的結構**

## :-: **4、測試爬取**
按照作者的思想,每次爬取之前先要測試一下,該網站能不能爬到(參考文檔:如何進行運行前測試)
>[info]這是測試用的,該頁面請用瀏覽器直接訪問,方便查看

## :-: **5、模擬登陸**
- 模擬登陸(參考文檔:如何實現模擬登陸)
>[info]這是測試用的,該頁面請用瀏覽器直接訪問,方便查看

- 模擬登陸挖段子

- 雜談
- 開發 & 維護的工作流程
- 新手如何看php手冊 和 框架手冊
- 開發 & 維護的不同點
- 從0到1,搭建新項目的工作流程
- 從1到N,維護的工作流程
- 優化流程
- 生成錯誤日志和慢日志的方法
- 查錯思路
- 怎么快速接手一個項目
- 前端常用知識點
- javascript
- 自己封裝的函數
- 處理數字
- 功能代碼
- 動態添加圖片
- 判斷是手機端還是pc端
- javascript:;是什么意思?怎么用呢
- html & h5
- a標簽中target設置為blank和_blank有什么區別?
- 亂碼
- 提交方式:button標簽 和 input
- 塊元素
- 內聯元素
- h5特有屬性
- h5的localStorage【增、刪、改、查】
- jquery
- 常用方法
- 功能代碼
- 動態刪除圖片
- 一個按鈕,切換2種狀態
- 換膚
- 深入理解(function(){... })();
- json & xml
- json
- 語法速記
- json對象取值
- 字符串、對象、數組的區別
- xml
- [CDATA[%s]]的作用是什么
- 轉義字符
- CDATA 想被xml解析的文本數據
- CDATA 不想被xml解析的文本數據
- 微信小程序
- 其他
- websocket
- 跨域
- css
- 行內 & 內連 & 外連 寫法
- 優先級
- 更加精準的匹配
- 使用百分比如何生效
- php在html、js、jq中的的原生寫法
- *php在html中的語法
- php在js中的語法
- php在jq中的語法
- 正則表達式
- php常用基礎知識(思想為主)
- php為什么是“邊編譯邊運行”
- 冒號、endif、endwhile、endfor使用
- 遞歸思想(速記法)
- cookie和session的理解
- php常用內置(系統)函數
- 常量
- 字符串
- 數組
- 日期時間
- 文件 & 目錄
- 數學
- 程序執行
- 判斷
- 選項和信息(修改配置文件的)
- 錯誤處理 & 日志記錄
- 編碼格式
- session
- IP相關
- 類 & 對象
- 性能
- 其他函數
- 魔術方法
- $_SERVER
- 變量處理
- php自己封裝的一些函數
- 導入、導出、生成文件
- 數組
- 數字
- 字符串
- 其他
- 獲取linux硬件信息
- 常見插件/類庫使用
- 前端-框架/插件
- bootstrap 學習筆記
- layer 學習筆記
- layDate 學習筆記
- 百度ueditor1.4.4.3富文本編輯器
- quill富文本編輯器
- 百度ECharts圖形報表
- webuploader上傳圖片
- 后端類庫
- workerman 聊天室
- QRCODE 二維碼
- redis
- seaslog 日志
- phpspider 爬蟲
- Mailer 發送郵件
- simple_html_dom
- phpstorm使用
- 快捷鍵
- 連接mysql數據庫
- 斷點 + debug調試
- 運行內存不夠
- wamp環境
- yii、laravel、tp、開發自己的php框架
- 看框架源碼的思路
- tp5框架的使用
- 1、助手函數原理解析
- 開發自己的php框架
- 常用的開發思路 和 小功能實現代碼
- 爬蟲思路
- 功能點思路
- tp5判斷是不是異地登錄(簡單版)
- 微信開發,反向代理
- 微信開發,關閉當前頁面
- 消息隊列的實現
- 頁面靜態化
- session串號
- 站內信設計思路
- web在線管理器
- 語言相關(開發有關)
- 接收json(text/xml)格式數據
- 原生文件上傳(狀態碼)
- openssl擴展
- 打印對象 和 遍歷對象
- 使用OB緩存的幾個原則
- CLI模式執行php文件
- foreach時,添加元素 或 修改元素的值
- 功能點 代碼實現
- 生成url目錄樹(沒有pid)
- 多圖上傳(vue傳base64)
- 下載文件,耗時算法
- 生成商品二維碼
- 導出excel
- 搜索
- 阿里大魚發短信
- 使用阿里云oss
- location.href跳轉后,丟失用戶的session
- “\r ” “\r\n” “\t”的區別
- php的配置文件詳解
- 開啟錯誤日志
- 開啟慢日志
- 開啟短標簽
- 分析php-fpm.conf中的request_terminate_timeout參數