牛骨文教育服务平台(让学习变的简单)
博文笔记

PHP爬虫框架Beanbun

创建时间:2017-09-15 投稿人: 浏览次数:5695

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();



访问显示3个网站爬从成功,把爬从数据以文件形式存了起来


重点介绍多进程模式,支持多进程,可以让爬虫一直执行


普通模式下不依赖队列,而守护进程模式需要另外开启队列(内存队列、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还有很多扩展,详细看手册

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。