phpspider

phpspider手册

下载

composer require owner888/phpspider

demo

require __DIR__ . '/../vendor/autoload.php';
use phpspider\core\phpspider;
/* Do NOT delete this comment */
/* 不要删除这段注释 */
$configs = [];//设置了待爬网站的一些信息
$spider = new phpspider($configs);
$spider->start();

config内容

$config = [
    'name'=>'糗事百科',//定义爬虫名称
    'log_show'=>true,//默认false显示爬取面板,true时显示调试信息(windows下只能true)
    'log_file'=>'../data/qiushibaike.log',//日志文件路径
    'log_type'=>'error,debug',//显示和记录的日志类型(普通类型: info/警告类型: warn/调试类型: debug/错误类型: error)
    'input_encoding'=>null,//明确指定输入的页面编码格式(UTF-8,GB2312,…..),防止出现乱码,如果设置null则自动识别
    'output_encoding'=>null,//明确指定输出的编码格式(UTF-8,GB2312,…..),防止出现乱码,如果设置null则为utf-8
    'tasknum'=>1,//同时工作的爬虫任务数,需要配合redis保存采集任务数据,供进程间共享使用
    'multiserver'=>false,//多服务器处理,需要配合redis来保存采集任务数据,供多服务器共享数据使用
    'serverid'=>1,//服务器ID
    //保存爬虫运行状态,需要配合redis来保存采集任务数据,供程序下次执行使用,注意:多任务处理和多服务器处理都会默认采用redis,可以不设置这个参数
    'save_running_state'=>false,
    //redis配置
    'queue_config'=>[
        'host'      => '127.0.0.1',
        'port'      => 6379,
        'pass'      => '',
        'db'        => 5,
        'prefix'    => 'phpspider',
        'timeout'   => 30,
    ],
    //代理服务器,如果爬取的网站根据IP做了反爬虫, 可以设置此项
    'proxy'=>[
        'http://host:port',//普通代理
        'http://user:pass@host:port',//验证代理
    ],
    'interval'=>1000,//爬虫爬取每个网页的时间间隔,单位:毫秒
    'timeout'=>5,//爬虫爬取每个网页的超时时间,单位:秒
    'max_try'=>0,//爬虫爬取每个网页失败后尝试次数,网络不好可能导致爬虫在超时时间内抓取失败, 可以设置此项允许爬虫重复爬取
    'max_depth'=>0,//爬虫爬取网页深度,超过深度的页面不再采集,对于抓取最新内容的增量更新,抓取好友的好友的好友这类型特别有用
    'max_fields'=>0,//爬取内容网页最大条数,抓取到一定的字段后退出,默认0为不限制
    /**
     * 爬虫爬取网页所使用的浏览器类型
     * phpspider::AGENT_ANDROID, 表示爬虫爬取网页时, 使用安卓手机浏览器
     * phpspider::AGENT_IOS, 表示爬虫爬取网页时, 使用苹果手机浏览器
     * phpspider::AGENT_PC, 表示爬虫爬取网页时, 使用PC浏览器
     * phpspider::AGENT_MOBILE, 表示爬虫爬取网页时, 使用移动设备浏览器
     * [],随机浏览器类型
     */
    'user_agent'=>'phpspider::AGENT_PC',
    //爬虫爬取网页所使用的伪IP,用于破解防采集
    'client_ip'=>[
        '192.168.0.2', 
        '192.168.0.3',
    ],
    //爬虫爬取数据导出
    'export'=>[
        'type' => 'csv', //导出类型 csv、sql、db
        'file' => './data/qiushibaike.csv', // 导出 csv、sql 文件地址
        'table' => '数据表',//导出db、sql数据表名
    ],
    //数据库配置
    'db_config'=>[
        'host'  => '127.0.0.1',
        'port'  => 3306,
        'user'  => 'root',
        'pass'  => 'root',
        'name'  => 'demo',
    ],
    //定义爬虫爬取哪些域名下的网页, 非域名下的url会被忽略以提高爬取速度
    'domains'=>[
        'qiushibaike.com',
        'www.qiushibaike.com'
    ],
    //定义爬虫的入口链接, 爬虫从这些链接开始爬取,同时这些链接也是监控爬虫所要监控的链接
    'scan_urls'=>[
        'http://www.qiushibaike.com/',
    ],
    //定义内容页url的规则,内容页是指包含要爬取内容的网页
    'content_url_regexes'=>[
        "http://www.qiushibaike.com/article/\d+",
    ],
    //定义列表页url的规则,对于有列表页的网站, 使用此配置可以大幅提高爬虫的爬取速率
    'list_url_regexes'=>[
        "http://www.qiushibaike.com/8hr/page/\d+\?s=\d+",
    ],
    //定义内容页的抽取规则,规则由一个个field组成, 一个field代表一个数据抽取项
    'fields'=>[
        [
            'name' => "content",//给此项数据起个变量名
            'selector_type'=>'xpath',//抽取规则的类型,可用xpath, jsonpath, regex
            'selector' => "//*[@id='single-next-link']",//定义抽取规则, 默认使用xpath
            'required'=>false,//定义该field的值是否必须,true的话如果该field没有抽取到内容, 该field对应的整条数据都将被丢弃
            'repeated'=>false,//定义该field抽取到的内容是否是有多项,赋值为true的话, 无论该field是否真的是有多项, 抽取到的结果都是数组结构
            'children'=>[],//为此field定义子项,子项的定义仍然是一个fields数组,没错, 这是一个树形结构
            //该field的数据源, 默认从当前的网页中抽取数据
            //选择attached_url可以发起一个新的请求, 然后从请求返回的数据中抽取
            //选择url_context可以从当前网页的url附加数据(点此查看“url附加数据”实例解析)中抽取
            'source_type'=>'attached_url',
            'attached_url'=>'',//当source_type设置为attached_url时, 定义新请求的url
        ],
    ]
];

log类

提供不同级别的日志打印

require __DIR__ . '/../vendor/autoload.php';
use phpspider\core\log;

log::info($msg);//打印普通日志
log::debug($msg);//打印出错级别日志, 调试时使用
log::warn($msg);//打印警告情况的日志
log::error($msg);//打印错误情况的日志

回调函数

require __DIR__ . '/../vendor/autoload.php';
use phpspider\core\phpspider;
$config = [];
$spider = new phpspider($config);
$spider->on_start = function($phpspider) {};//爬虫初始化时调用, 用来指定一些爬取前的操作
//判断当前网页是否被反爬虫了, 需要开发者实现
$spider->on_status_code = function($status_code, $url, $content, $phpspider) 
{
    // 如果状态码为429,说明对方网站设置了不让同一个客户端同时请求太多次
    if ($status_code == '429') 
    {
        // 将url插入待爬的队列中,等待再次爬取
        $phpspider->add_url($url);
        // 当前页先不处理了
        return false; 
    }
    // 不拦截的状态码这里记得要返回,否则后面内容就都空了
    return $content;
};
//判断当前网页是否被反爬虫了, 需要开发者实现
$spider->is_anti_spider = function($url, $content, $phpspider) 
{
    // $content中包含"404页面不存在"字符串
    if (strpos($content, "404页面不存在") !== false) 
    {
        // 如果使用了代理IP,IP切换需要时间,这里可以添加到队列等下次换了IP再抓取
        // $phpspider->add_url($url);
        return true; // 告诉框架网页被反爬虫了,不要继续处理它
    }
    // 当前页面没有被反爬虫,可以继续处理
    return false;
};
//在一个网页下载完成之后调用. 主要用来对下载的网页进行处理.
$spider->on_download_page = function($page, $phpspider) {};
// 在一个网页下载完成之后调用. 主要用来对下载的网页进行处理.
$spider->on_download_attached_page = function($content, $phpspider) {};
//在一个网页获取到URL之后调用. 主要用来对获取到的URL进行处理.
$spider->on_fetch_url = function($url, $phpspider) {};
//在爬取到入口url的内容之后, 添加新的url到待爬队列之前调用. 主要用来发现新的待爬url, 并且能给新发现的url附加数据
$spider->on_scan_page = function($page, $content, $phpspider){};
$spider->on_list_page = function($page, $content, $phpspider) {};   
$spider->on_content_page = function($page, $content, $phpspider) {};
//在抽取到field内容之后调用, 对其中包含的img标签进行回调处理
$spider->on_handle_img = function($fieldname, $img) {};
//当一个field的内容被抽取到后进行的回调, 在此回调中可以对网页中抽取的内容作进一步处理
$spider->on_extract_field = function($fieldname, $data, $page) {};
//在一个网页的所有field抽取完成之后, 可能需要对field进一步处理, 以发布到自己的网站
$spider->on_extract_page = function($page, $data) {};

requests

表示当前正在爬取的网站的对象

require_once __DIR__ . '/../autoloader.php';
use phpspider\core\phpspider;
use phpspider\core\requests;

$config = [];
$spider = new phpspider($config);
$spider->on_start = function($phpspider) 
{
    requests::set_timeout(5);//设置请求超时时间,秒,同时设置connect和read
    requests::set_timeout( array(3, 27) );//设置请求超时时间,秒,分别设置connect和read
    requests::set_proxy('http://user:pass@host:port');//设置请求代理
    //设置多个请求代理
    requests::set_proxy([
        'http://user:pass@host:port',
        'http://user:pass@host:port',
    ]);
    //设置浏览器useragent
    requests::set_useragent("Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/");
    //随机伪造useragent
     requests::set_useragent([
        "Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/",
        "Opera/9.80 (Android 3.2.1; Linux; Opera Tablet/ADR-1109081720; U; ja) Presto/2.8.149 Version/11.10",
        "Mozilla/5.0 (Android; Linux armv7l; rv:9.0) Gecko/20111216 Firefox/9.0 Fennec/9.0"
    ]);
    requests::set_referer("http://www.qiushibaike.com");//设置请求来路URL
    requests::set_header("Referer", "http://www.9game.cn/kc/");//添加一些HTTP请求的Header
    requests::set_cookie("NAME", "phpspider", "www.phpspider.org");//添加一些HTTP请求的Cookie
    requests::set_cookies("NAME1=value1; NAME2=value2;");//批量添加一些HTTP请求的Cookie
    $cookie = requests::get_cookie("SUB", "s.weibo.com");//用来得到某个域名所附带的某个Cookie
    $cookies = requests::get_cookies("s.weibo.com");//批量获取cookie,返回数组
    requests::set_client_ip("192.168.0.2");//设置请求伪IP
    requests::set_client_ip([
        "192.168.0.1",
        "192.168.0.2",
    ]);
    $host = "www.qiushibaike.com";
    $ips = array(
        "203.195.143.21",
        "203.195.143.22"
    );
    requests::set_hosts($host, $ips);//设置请求的第三方主机和IP
    requests::get($url, $params, $allow_redirects, $cert)//获取某个网页
    requests::post($url, $params, $files, $allow_redirects, $cert)//获取某个网页
    requests::put($url, $params, $allow_redirects, $cert)//获取某个网页
    requests::delete($url, $params, $allow_redirects, $cert)//获取某个网页
    requests::$encoding;//获取网页编码
    requests::$content;// 转码前内容
    requests::$text;// 转码后内容
    requests::$status_code,//状态码
    requests::$history;// 如果是302跳转,获取跳转前状态码
    requests::$headers;//获取响应头内容
    requests::$request['headers'];// 获取请求头内容。
    requests::$request['headers']['User-Agent'] = 'phpspider';//自定义请求头部
};

selector类

页面元素选择器类

require __DIR__ . '/../vendor/autoload.php';
use phpspider\core\requests;
use phpspider\core\selector;

$html = requests::get("http://www.epooll.com/archives/806/");
selector::select($html, $selector, $selector_type = 'xpath');//提取网页内容
selector::remove($html, $selector, $selector_type = 'xpath');//删除网页内容
$data = selector::select($html, "//div[contains(@class,'page-header')]//h1//a");

db类

数据库配置

require __DIR__ . '/../vendor/autoload.php';
use phpspider\core\db;
$db_config = array(
    'host'  => '127.0.0.1',
    'port'  => 3306,
    'user'  => 'root',
    'pass'  => 'root',
    'name'  => 'qiushibaike',
);
// 数据库配置
db::set_connect('default', $db_config);
// 数据库链接
db::init_mysql();
db::query($sql);//执行原生sql语句
db::get_one($sql);//单条查询
db::get_all($sql);//多条查询
db::insert($table, ["name"=>1,"age"=>2]);//单条插入
db::insert_batch($table, $data);//批量插入
db::update($table, ["name"=>1,"age"=>2]);//单条修改
db::update_batch($table, $data);//批量修改
db::delete($table, $where);//单条删除

内置方法

add_url($url, o p t i o n s = a r r a y ( ) ) ; / / 用 来 往 待 爬 队 列 中 添 加 u r l a d d s c a n u r l ( options = array());//用来往待爬队列中添加url add_scan_url( options=array());//urladdscanurl(url, o p t i o n s = a r r a y ( ) ) ; / / 用 来 往 待 爬 队 列 中 添 加 s c a n u r l r e q u e s t u r l ( options = array());//用来往待爬队列中添加scan_url request_url( options=array());//scanurlrequesturl(url, $options = array());//下载网页, 得到网页内容

基本运行过程

// 伪代码
start()
->检查环境
->遍历$configs['scan_urls'],按正则匹配分类(scan_page|list_page|content_page)入列($collect_queue)
->运行回调on_start()
->开始循环采集
{
    ->队列($collect_queue)长度不为0则循环
    ->爬取页面(collect_page())
    {
        ->出列($link = $this->queue_rpop();)
        ->解压($link = $this->link_uncompress($link);)
        ->运行回调on_before_download_page()
        ->请求结果($html = $this->request_url($url, $link);)
        ->运行回调(is_anti_spider())
        ->运行回调(on_download_page())
        ->按url类型运行回调(on_scan_page()|on_content_page()|on_list_page())
        ->如果为content_page则提取字段(get_html_fields())
        ->休眠(usleep(self::$configs['interval'] * 1000);)
    }
    ->下次循环
}
->善后
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值