PHP蜘蛛爬虫开发文档
PHP蜘蛛爬虫开发文档
官方文档
https://doc.phpspider.org/
githup地址
https://github.com/owner888/phpspider
phpspider-master/core 文件介绍
文件名 | 描述 |
---|---|
init.php | 公共入口文件 |
constans.php | 公共入口文件 |
phpspider.php | 核心类文件 |
- | - |
configs详解 | - |
requests.php | 请求类文件 |
selector.php | 选择器类文件 |
db.php | 数据库类文件 |
cache.php | 缓存类文件 |
log.php | 日志类文件 |
queue.php | Redis操作类文件 |
util.php | 实用函数集合类文件 |
worker.php | 多进程操作类 |
加载核心文件
require './vendor/autoload.php';
use phpspider\core\phpspider;
requests.php 请求类 详解
成员 | 描述 |
---|---|
input_encoding | 输入编码明确指定输入的页面编码格式(UTF-8,GB2312,…..),防止出现乱码,如果设置null则自动识别 |
output_encoding | 输出编码明确指定输出的编码格式(UTF-8,GB2312,…..),防止出现乱码,如果设置null则为utf-8 |
encoding | 获取网页编码 |
content | 获取响应内容 - 转码前内容 |
text | 获取响应内容 - 转码后内容 |
status_code | 网页状态码 |
headers | 获取响应头 |
request | 获取请求头 |
# 加载 核心文件
require './vendor/autoload.php';
use phpspider\core\phpspider;
# 加载 请求类文件
use phpspider\core\requests;
# 设置 输入编码
requests::$input_encoding = null; // null=自动识别
# 设置 输出编码
requests::$output_encoding = null; // null=utf-8
# 获取 网页编码
request::$encoding;
# 获取 响应内容 - 转码前内容
request::$content;
# 获取 响应内容 - 转码后内容
request::$text;
# 获取 网页状态码
request::$status_code;
# 获取 获取响应头
request::$headers;
# 获取 获取请求头
request::$request;
方法 | 描述 |
---|---|
set_timeout( $timeout ) | 设置请求超时时间 |
set_proxy( $proxy ) | 设置请求代理 |
set_useragent( $useragent ) | 浏览器useragent(UA) |
set_referer( $referer ) | 浏览器请求来路URL |
set_header( $key, $value ) | 添加请求的Header |
set_cookie( $key, $value, $domain = ‘’ ) | 添加请求的Cookie |
get_cookie( $name, $domain = ‘’ ) | 获取请求的Cookie |
set_cookies( $cookies, $domain = ‘’ ) | 设置请求Cookie |
get_cookie( $domain = ‘’ ) | 获取请求的Cookie |
set_client_ip( $ip ) | 设置请求伪IP |
set_hosts( $host, $ips ) | 设置请求的第三方主机和IP |
get( $url, $params, $allow_redirects, $cert ) | 用来获取某个网页 |
post( $url, $params, $files, $allow_redirects, $cert ) | 用来获取某个网页 |
put( $url, $params, $allow_redirects, $cert ) | 用来获取某个网页 |
delete( $url, $params, $allow_redirects, $cert ) | 用来获取某个网页 |
# 设置 请求超时时间
# 1. 单一值 (同时设置connect和read)
requests::set_timeout(10);
# 2. 数组值 (设置connect和read二者的timeout)
requests::set_timeout( array(3, 27) );
# 设置 请求代理
1. 字符串
requests::set_proxy('http://user:pass@host:port');
2. 数组
requests::set_proxy(
array(
'http://user:pass@host:port',
'http://user:pass@host:port'
)
);
# 设置 UA头
// 1. 字符串
requests::set_useragent("Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/");
// 2. 数组
requests::set_proxy(
array(
"Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/",
"Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/"
)
);
# 设置 请求来路URL
requests::set_referer('https://www.baidu.com');
# 设置 请求的Header
requests::set_header("Referer", "http://www.baidu.com");
# 添加 请求的Cookie
requests::set_cookie("BAIDUID", "FEE96299191CB0F11954F3A0060FB470:FG=1", "http://www.baidu.com");
requests::set_cookie("BAIDUID=FEE96299191CB0F11954F3A0060FB470:FG=1", "http://www.baidu.com");
# 获取 请求的Cookie
requests::get_cookie("BAIDUID", "http://www.baidu.com");
requests::get_cookie("http://www.baidu.com");
# 设置 设置请求伪IP
// 1. 单一值
requests::set_client_ip("192.168.0.2");
// 2. 数组
requests::set_client_ip(
array(
"192.168.0.1",
"192.168.0.2"
)
);
# 设置 请求的第三方主机和IP
requests::set_hosts(
"http://www.baidu.com",
array(
"203.195.143.21",
"203.195.143.22"
)
);
# 发起 get 请求
requests::get("https://github.com/timeline.json");
# 发起 post 请求
// 1. 登录
requests::post(
"http://www.domain.com",
array(
"username" => "test", "password" => "test"
)
);
// 2. 文件上传
request::post(
"http://www.domain.com",
null,
array(
"file1" => "test1.jpg",
"file2" => "test2.jpg"
)
);
# 发起 put 请求
requests::put(
"http://www.domain.com",
"{username:\"test888\",username:\"123456\"}"
);
# 发起 delete 请求
requests::delete(
"http://www.domain.com",
"{username:\"test888\"}"
);
selector.php 选择器类 详解
方法 | 描述 |
---|---|
select( $html, $selector, $selector_type = ‘xpath’ ) | 选择匹配的内容 |
remove( $html, $selector, $selector_type = ‘xpath’ ) | 删除匹配的内容 |
/**
* select( $html, $selector, $selector_type = 'xpath' )
* @param $html 需要筛选的网页内容
* @param $selector 选择器规则
* @param $selector_type 选择器类型: xpath (默认) / regex / css
*/
# 1. xpath
$html = requests::get("https://news.163.com/20/0831/15/FLCBLJOT000189FH.html");
$data = selector::select($html, '//*[@id="endText"]'); // 读取 网易新闻 新闻内容
var_dump($data);
# 2. css
$html = requests::get("https://news.163.com/20/0831/15/FLCBLJOT000189FH.html");
$data = selector::select($html, ".post_content_main > h1", "css"); // 读取 网易新闻 详情页标题
var_dump($data);
# 3. regex
$html = requests::get("https://news.163.com/20/0831/15/FLCBLJOT000189FH.html");
$data = selector::select($html, "@<title>(.*?)</title>@", "regex"); // 读取 网易新闻 title标题内容
var_dump($data);
/**
* remove( $html, $selector, $selector_type = 'xpath' )
* @param $html 需要筛选的网页内容
* @param $selector 选择器规则
* @param $selector_type 选择器类型: xpath (默认) / regex / css
*/
$html = requests::get("https://news.163.com/20/0831/15/FLCBLJOT000189FH.html");
$html = selector::select($html, '//*[@id="endText"]'); // 读取 网易新闻 新闻内容
// 在上面获取的内容基础上,删除第一个<p>标签(原标题)
$data = selector::select($html, '//*[@id="endText"]/p[1]');
var_dump($data);
db.php 数据库类 详解
# 数据配置链接
$db_config = array(
'host' => '127.0.0.1',
'port' => 3306,
'user' => 'root',
'pass' => '123456',
'name' => 'demo_db'
);
// 数据库配置
db::set_connect('default', $db_config);
// 数据库连接
db::init_mysql();
方法 | 描述 |
---|---|
query($sql) | 原生SQL操作 |
get_one($sql) | 原生SQL操作 |
get_all($sql) | 单条查询 |
insert($table, $data) | 单条插入 |
insert_batch($table, $data) | 单条修改 |
update_batch($table, $data, $index) | 批量修改 |
delete($table, $where) | 单条删除 |
# query 原生操作
// 1. 查询
$query = db::query("select * from
content");
while($row = db::fetch($query)) {
echo "id = {$row['id']}; name = {$row['name']}; \n";
}
// 2. 新增
db::query("insert into
content(
name) values (
test);");
// 3. 更新
db::query("update
contentset
name='test' where
id=1;");
// 4. 删除
db::query("delete from
contentwhere
id=1;");
# get_one
$row = db::get_one("select * from
contentwhere
id=1;");
# get_all
$rows = db::get_all("select * from
contentlimit 5;");
# insert
$rows = db::insert('content', array('name' => 'test'));
# insert_batch
$rows = db::insert_batch(
'content',
array(
array(
'name' => 'test1'
),
array(
'name' => 'test2'
)
)
);
# update_batch
db::update_batch(
'content',
array(
array(
'id' => 1,
'name' => 'test1'
),
array(
'id' => 2,
'name' => 'test2'
)
),
'id' // 以 id 为条件进行修改
);
# delete
$rows = db::delete('content', "
id=1");
使用 configs 来编写爬虫
# 加载 核心文件
require './vendor/autoload.php';
use phpspider\core\phpspider;
# 官方文档说不要删除这段注释,我并不知道有什么用,文档说加就加
/* Do NOT delete this comment */
/* 不要删除这段注释 */
# $configs = array(
'name' => '163新闻', // 当前爬虫名称
'log_show' => false, // 是否显示日志, 默认false, 可选 true (显示调试信息) | false (显示爬取面板, tail -f data/phpspider.log 查看日志)
'log_file' => 'data/phpspider.log', // 日志文件路径, 默认 data/phpspider.log
'log_type' => '', // 显示和记录的日志类型, 默认空, 可选 info(普通) | warn(警告) | debug(调试) | error(错误 )
'input_encoding' => null, // 输入编码, 默认null(自动识别)
'output_encoding' => null, // 输出编码, 默认null(null=utf-8)
'tasknum' => 1, // 同时工作的爬虫任务数, 默认1(单进程任务爬取)
'multiserver' => false, // 多服务器处理, 默认false, 可选 true | false
'serverid' => 1, // 服务器ID, 默认1, 启用第二天服务器可设置为2
'save_running_state' => false, // 保存爬虫运行状态, 默认false(不保存), 可选 true | false
'queue_config' => array( // redis 配置, 保存爬虫运行状态、多任务处理 和 多服务器处理 都需要 redis 来保存采集任务数据
'host' => '127.0.0.1',
'port' => 6379,
'pass' => '',
'db' => 5,
'prefix' => 'phpspider',
'timeout' => 30
),
'proxy' => array( // 代理服务器,如果爬取的网站根据ip做了反爬虫,可以设置此项
'http://host:port',
'http://user:pass@host:port',
),
'interval' => 1000, // 爬取单个网页的时间间隔, 单位毫秒
'timeout' => 5, // 爬取每个网页的超时时间, 单位秒
'max_try' => 0, // 爬取每个网页失败后尝试次数, 默认0(不重复爬取)
'max_depth' => 0, // 爬取网页深度, 超过深度的页面不再采集, 默认0(不限制)
'max_fields' => 0, // 爬取内容网页最大条数, 默认0(不限制)
'user_agent' => "", // 爬取网页所使用的浏览器类型
// 1. 枚举类型
// phpspider::AGENT_ANDROID, 表示爬虫爬取网页时, 使用安卓手机浏览器
// phpspider::AGENT_IOS, 表示爬虫爬取网页时, 使用苹果手机浏览器
// phpspider::AGENT_PC, 表示爬虫爬取网页时, 使用PC浏览器
// phpspider::AGENT_MOBILE, 表示爬虫爬取网页时, 使用移动设备浏览器
// 2. 自定义类型
// 'user_agent' => "Mozilla/5.0"
// 3. 随机浏览器类型
// 'user_agent' => array(
// "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",
// "Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_3 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13G34 Safari/601.1",
// "Mozilla/5.0 (Linux; U; Android 6.0.1;zh_cn; Le X820 Build/FEXCNFN5801507014S) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 Chrome/49.0.0.0 Mobile Safari/537.36 EUI Browser/5.8.015S",
// );
'client_ip' => "", // 爬取网页所使用的伪IP,用于破解防采集
// 1. 字符串类型
// 'client_ip' => '192.168.0.2'
// 2. 数组类型
// 'client_ip' => array(
// '192.160.0.1',
// '192.160.0.2',
// );
'export' => array( // 爬取数据数据导出
'type' => 'csv', // 导出类型 csv | sql | db
'file' => './data/163_news.csv', // 导出文件路径
// 'type' => 'sql'
// 'file' => './data/163_news.sql',
// 'table' => 'news_table', // 导出db、sql数据库表名
// 'type' => 'db'
// 'table' => 'news_table', // 导出db、sql数据库表名
),
'db_config' => array( // 数据库配置
'host' => '127.0.0.1',
'port' => 3306,
'user' => 'root',
'pass' => 'root',
'name' => 'demo',
),
'domains' => array( // 定义爬虫爬取哪些域名下的网页, 非域名下的url会被忽略以提高爬取速度
'163.com',
'new.163.com'
),
'scan_urls' => array( // 定义爬虫的入口链接, 爬虫从这些链接开始爬取,同时这些链接也是监控爬虫所要监控的链接
'https://news.163.com'
),
'content_url_regexes' => array( // 定义内容页url的规则, 正则表达式 最好填写以提高爬取效率
'https://news.163.com/\d+/\d+/\d+/\w+.html'
),
'list_url_regexes' => array( // 定义列表页url的规则, 对于有列表页的网站, 使用此配置可以大幅提高爬虫的爬取速率
'https://news.163.com/gz/page/\d+.html'
),
'fields' => array( // 定义内容页的抽取规则, 规则由一个个field组成, 一个field代表一个数据抽取项
array(
'name' => "content", // 名称, 不能为空
'selector' => '//*[@id="endText"]', // 定义抽取规则, 不能为空, 默认使用xpath
'selector_type' => 'xpath', // 抽取规则类型, 默认xpath, 可选 xpaht | jsonpath | regex
'required' => true, // 是否必须的, 默认false, 可选 true | false
'repeated' => false, // 抽取到的内容是否多项, 默认false, 可选 false | true(结果都是数组类型)
'children' => array( // 为此field定义子项, 子项的定义仍然是一个fields数组
array(
'name' => 'replay', // # 例如抽取新闻下面的评论
'selector' => "//div[contains(@class,'replay')]"
)
),
'source_type' => 'url_content', // 该field的数据源, 默认从当前的网页 (url_context) 中抽取数据, 可选 url_context | attached_url
// 'source_type' => 'attached_url',
// 'attached_url' => 'https://news.163.com/{comment_id}/comments', // 当source_type设置为attached_url时, 定义新请求的url
),
array(
'name' => "title",
'selector' => '//*[@id="epContentLeft"]/h1',
)
)
);
// 载入配置
$spider = new phpspider($configs);
// 启动爬虫
$spider->start();
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: