博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
*使用phpspider -- PHP蜘蛛爬虫框架来爬取数据
阅读量:3780 次
发布时间:2019-05-22

本文共 6529 字,大约阅读时间需要 21 分钟。

源码下载地址: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

1、在linux上跑demo。

条件:linux上要有php环境,代码上传上去,执行php -f demo.php

想退出这个页面执行quit 或 ctrl + c

你可能会疑惑,这要跑,爬来的数据放到哪里了呢??

2、需要在$configs中加这俩个配置(参考文档configs详解之成员):

//日志存放的位置'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 //这个页面是列表页下面的页码

这回我们就清晰了,我们要爬取的是列表页的数据:

3.1.1、接下来设置爬取规则

3.1.2、实例化,将配置传给这个类的构造函数

3.1.3、添加新的url到带爬对列

3.1.4、筛选爬到的数据,如标题弄出来,内容弄出来,并组装好数据...

3.1.5、进行入库操作

3.2、代码

'爬取新闻', //'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 = '/

<>]+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 "
";//    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、按照作者的思想,每次爬取之前先要测试一下,该网站能不能爬到(参考文档:如何进行运行前测试)

注意:这是测试用的,该页面请用浏览器直接访问,方便查看

5、模拟登陆(参考文档:如何实现模拟登陆)注意:这是测试用的,该页面请用浏览器直接访问,方便查看

模拟登陆挖段子

模拟登陆知乎

 

附一篇:

你可能感兴趣的文章
基本类型包装类
查看>>
System类常用方法
查看>>
Runtime类、Math类和Random类的常用方法
查看>>
数据处理类常用方法
查看>>
Collections和Character类 常用静态方法
查看>>
HTML之Javascript——BOM浏览器对象模型
查看>>
JAVA基础中的基础
查看>>
JDBC基础操作
查看>>
连接池
查看>>
Servlet的使用——重定向和转发
查看>>
JSP技术的使用——好像过时了唉。。。。。
查看>>
MVC模式概述
查看>>
Web之过滤器Filter
查看>>
JSON和AJAX
查看>>
web之监听器listener
查看>>
类加载器
查看>>
数据库设计
查看>>
Java虚拟机的内存分配和运行机制(粗谈)
查看>>
web开发之BaseServlet的使用
查看>>
初识Maven
查看>>