- 源码下载地址:https://github.com/owner888/phpspider
- 文档:https://doc.phpspider.org/
- 我的环境是宝塔lnmp,php是5.4版本,不要用这个版本,缺各种扩展库
- 错误1:没有该扩展,不需要再php.ini中配置
![](https://box.kancloud.cn/eaf77c491affd411c8061735ce872e8d_1438x362.png)
- 错误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
![](https://box.kancloud.cn/cd18365765d624c1fe1f9bc5fc012307_1057x189.png)
![](https://box.kancloud.cn/1c9c01afb4d58cd748d80bee8f11e458_1224x178.png)
解决方法:执行 yum install php-mbstring -y
[toc]
## :-: **1、在linux上跑demo**
条件:linux上要有php环境,代码上传上去,执行php -f demo.php
![](https://box.kancloud.cn/15ffa117287cb120f9f593e411ae7474_456x287.png)
想退出这个页面执行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、接下来设置爬取规则
![](https://box.kancloud.cn/b4932064b57840aa89ebcedbe00d90e8_845x234.png)
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、表的结构**
![](https://box.kancloud.cn/7a7ec893681169fe88079642c1a33fc9_595x148.png)
## :-: **4、测试爬取**
按照作者的思想,每次爬取之前先要测试一下,该网站能不能爬到(参考文档:如何进行运行前测试)
>[info]这是测试用的,该页面请用浏览器直接访问,方便查看
![](https://box.kancloud.cn/761d1907b09921bede2022c732c4dfe0_700x377.png)
## :-: **5、模拟登陆**
- 模拟登陆(参考文档:如何实现模拟登陆)
>[info]这是测试用的,该页面请用浏览器直接访问,方便查看
![](https://box.kancloud.cn/7867d5bd1d0f66b9d951fd456a3a205b_1051x757.png)
- 模拟登陆挖段子
![](https://box.kancloud.cn/772dbef7e7923e3d57a9f04be569a4dd_1392x171.png)
- 杂谈
- 开发 & 维护的工作流程
- 新手如何看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参数