PHP爬虫框架Beanbun
Beanbun 是用 PHP 编写的多进程网络爬虫框架,具有良好的开放性、高可扩展性。
手册文档:http://beanbun.org/
支持守护进程与普通两种模式,守护模式在Linux环境命令运行,普通可以直接访问运行
如:普通模式直接访问,创建一个文件 start.php,包含以下内容
<?php
require_once(__DIR__ . "/vendor/autoload.php");
use BeanbunBeanbun;
$beanbun = new Beanbun;
$beanbun->seed = [
"http://www.950d.com/",
"http://www.950d.com/list-1.html",
"http://www.950d.com/list-2.html",
];
$beanbun->afterDownloadPage = function($beanbun) {
file_put_contents(__DIR__ . "/" . md5($beanbun->url), $beanbun->page);
};
$beanbun->start();
重点介绍多进程模式,支持多进程,可以让爬虫一直执行
普通模式下不依赖队列,而守护进程模式需要另外开启队列(内存队列、Redis
队列等),但拥有更多的功能,如可以自动发现页面中的链接加入队列,循环爬取。
首先建立一个队列文件
queue.php,写入下列内容
<?php require_once(__DIR__ . "/vendor/autoload.php"); // 启动队列 BeanbunQueueMemoryQueue::server();
启动 start.php 之前,先命令行启动queue.php,即 先启动队列进程,再启动爬虫。
$ php queue.php start
$ php start.php start
这次爬虫以我csnd博客为例子,爬虫抓取所有博客标题
start.php 文件如下:
<?php
use BeanbunBeanbun;
use BeanbunLibHelper;
require_once(__DIR__ . "/vendor/autoload.php");
$beanbun = new Beanbun;
$beanbun->name = "blog"; //爬虫名称
$beanbun->count = 5; //爬虫进程数
$beanbun->seed = "http://blog.csdn.net/a519395243"; //爬虫地址
$beanbun->max = 20; //最大抓取网页数量
$beanbun->logFile = __DIR__ . "/qiubai_access.log"; //爬虫日志文件路径
$beanbun->afterDownloadPage = function($beanbun) { //爬取网页后执行此回调。
$aa=$beanbun->page;
$pa = "%<span class="link_title"><a href="/a519395243/article/details/.*?>(.*?)</a>s+</span>%si";
preg_match_all($pa,$aa,$match); //简单正则处理,选出文章标题
print_r($match[1]); //打印在日志上
};
$beanbun->start();
linux 命令行先启动 内存队列 再 启动爬虫
执行成功后,查看日记 ,成功爬虫抓取到自己的所有文章标题
关闭爬虫
$ php queue.php stop
$ php start.php stop
还可以设置 header 或者ua头,模拟人真实访问
$beanbun->userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36";
或者直接设置header头,浏览器F12开发工具 ,直接搞个header头过来就行
$beanbun->options["headers"] = [ "Accept"=>"image/webp,image/*,*/*;q=0.8", "Accept-Encoding"=>"gzip, deflate, sdch, br", "Accept-Language"=>"zh-CN,zh;q=0.8", "Connection"=>"keep-alive", "Host":"hm.baidu.com", "Referer":"http://blog.csdn.net/a519395243" "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" ]
抓取csdn博客不需要登录,如碰见需要登录的,可加上Cookie,模拟登录爬从
抓取网页后,可转化为JSON备用
$beanbun->afterDownloadPage = function($beanbun) {
$beanbun->page = json_decode($beanbun->page, true);
}或者存进数据库
use BeanbunLibDb;
Db::$config = [
"zhihu" => [
"server" => "127.0.0.1",
"port" => "3306",
"username" => "blog",
"password" => "xxxxxx",
"database_name" => "blog",
"database_type" => "mysql",
"charset" => "utf8",
]
];//插入数据库 ,其他请看手册
Db::instance("blog")->insert("account", [
"user_name" => "D丶",
"email" => "XXX",
"title" => "XXXX"
]);
Beanbun还有很多扩展,详细看手册
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
