下载
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);)
}
->下次循环
}
->善后