因为项目需求要“借”别人网站新闻,头大之余找到了大神制作的PHP爬虫框架:phpspider,Git地址:https://github.com/owner888/phpspider,官方文档在这里:https://doc.phpspider.org/。
如何嵌入自己项目:因为phpspider的compos.json文件中是一些作者和框架相关的邮箱、网址等,并不依赖其他包,只要求php版本大于等于5.5.0,所以只要在Git上下载,放入你项目文件夹中,引入他的自动加载文件和爬虫命名空间即可使用。
大致的使用官方文档上面都有给,我就以我遇到的说明一下
1.如何退出
要爬取一个新闻网站,需要隔一定时间爬取新增的新闻。官方文档上说明需要cli模式启动,linux下的定时任务crontab 执行php文件也是cli模式,
所以可以设定一个条件,手动调用其接受到暂停信号后调用的停止方法。
2.如何获取今天的不重复新闻
框架会先爬取给定域名列表domains,获取其中所有的a链接,将它们放入待爬数组/redis队列中,再爬取其中的内容和a链接,再将不重复的a链接放入待爬数组/redis队列中,有一种子子孙孙无穷尽也的感觉...
一般新闻的格式都是这种:域名/201912/31/DHASDHSA ,可以在爬取到url后进行判断
3.如何爬取分页新闻
分页新闻都带有特殊网址、页面结构,比如 域名/201912/31/DHASDHSA_X.html 和上一页 1 ... X 下一页 ,需要在发现内容是分页时获取最大页X的值,按照网址结构去请求其他分页同时将这些分页放入已爬列表防止重复,最终按页码将数据组合成一条即可
phpspider的url队列
public function queue_rpush($link = array(), $allowed_repeat = false)
{
if (empty($link) || empty($link['url']))
{
return false;
}
$url = $link['url'];
$status = false;
if (self::$use_redis)
{
$key = 'collect_urls-'.md5($url);
$lock = 'lock-'.$key;
// 加锁: 一个进程一个进程轮流处理
if (queue::lock($lock))
{
$exists = queue::exists($key);
// 不存在或者当然URL可重复入
if ( ! $exists || $allowed_repeat)
{
// 待爬取网页记录数加一
queue::incr('collect_urls_num');
// 先标记为待爬取网页
queue::set($key, time());
// 入队列
$link = json_encode($link);
//根据采集设置为顺序采集还是随机采集,使用列表或集合对象 2018-5 BY KEN
if (self::$configs['queue_order'] == 'rand')
{
queue::sadd('collect_queue', $link); //无序集合
}
else
{
queue::rpush('collect_queue', $link); //有序列表
}
$status = true;
}
// 解锁
queue::unlock($lock);
}
}
else
{
$key = md5($url);
if (!array_key_exists($key, self::$collect_urls))
{
self::$collect_urls_num++;
self::$collect_urls[$key] = time();
array_unshift(self::$collect_queue, $link);
$status = true;
}
}
return $status;
}