Skip to content

Commit 590db26

Browse files
committed
support headless browser which can execute JavaScript codes for crawling dynamic pages
1 parent 82d0a46 commit 590db26

File tree

4 files changed

+69
-9
lines changed

4 files changed

+69
-9
lines changed

README.md

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ webman的爬山虎插件,[PHPCreeper | 爬山虎](https://github.com/blogdaren
44

55

66
## 更新
7-
本插件的使用说明最近一次更新时间是:2024-03-21,由于爬山虎迭代版新增了许多新特性和API,而且完全向下兼容,所以建议将本插件和爬山虎引擎更新到最新版。
7+
* 本插件的使用说明最近一次更新时间是:**2024-04-27**,由于爬山虎迭代版新增了许多新特性和API,而且完全向下兼容,所以建议将本插件和爬山虎引擎更新到最新版。
8+
* 重大更新:自**爬山虎v1.8.7版本**开始,爬山虎已经支持无头浏览器即支持运行JavaScript代码及其渲染的动态页面。使用非常简单,无缝切换,只需要通过$context上下文启用或禁用无头浏览器开关即可。
89

910

1011
## 安装
@@ -18,7 +19,8 @@ composer require blogdaren/webman-phpcreeper
1819
* 由于爬虫应用相对WEB应用而言比较独立,所以app内的爬虫目录结构建议自行独立部署。
1920
* 首先在自己的app项目下手动创建有效的爬虫目录, 比如:app/spider。
2021
* 然后在爬虫目录内(app/spider)创建相应的容器句柄类Hanlder。
21-
* 最后在对应容器内的`onXXXX`回调方法内编写业务逻辑.
22+
* 最后在对应容器内的`onXXXX`回调方法内编写业务逻辑。
23+
* 若启用无头开关,默认使用无头chrome驱动,否则使用默认的guzzle驱动,若爬取的不是动态页,建议禁用。
2224

2325
## 举个例子
2426

@@ -66,17 +68,17 @@ class Myproducer extends \Webman\PHPCreeper\Producer
6668
//自v1.6.0开始,爬山虎提供了更加短小便捷的API来创建任务, 而且参数类型更加丰富:
6769
//注意:仅仅只是扩展,原有的API依然可以正常使用,提倡扩展就是为了保持向下兼容。
6870
//1. 单任务API:$task参数类型可支持:[字符串 | 一维数组]
69-
//1. 单任务API:$producer->createTask($task);
70-
//2. 多任务API:$task参数类型可支持:[字符串 | 一维数组 | 二维数组]
71-
//2. 多任务API:$producer->createMultiTask($task);
71+
//2. 单任务API:$producer->createTask($task);
72+
//3. 多任务API:$task参数类型可支持:[字符串 | 一维数组 | 二维数组]
73+
//4. 多任务API:$producer->createMultiTask($task);
7274

7375
//使用字符串:不推荐使用,配置受限,需要自行处理抓取结果
7476
//$task = "http://www.weather.com.cn/weather/101010100.shtml";
7577
//$producer->createTask($task);
7678
//$producer->createMultiTask($task);
7779

7880
//任务私有context,其上下文成员与全局context完全相同,最终会采用合并覆盖策略
79-
$task_private_context = array(
81+
$private_task_context = array(
8082
//是否缓存下载数据(可选项,默认false)
8183
'cache_enabled' => true,
8284
//缓存下载数据存放目录 (可选项,默认位于系统临时目录下)
@@ -103,6 +105,10 @@ class Myproducer extends \Webman\PHPCreeper\Producer
103105
//除了内置参数之外,还可以自由配置自定义参数,在上下游业务链应用场景中十分有用
104106
'user_define_arg1' => 'user_define_value1',
105107
'user_define_arg2' => 'user_define_value2',
108+
//无头浏览器,如果是动态页面考虑启用,否则应当禁用 [默认使用chrome且为禁用状态]
109+
'headless_browser' => [
110+
'headless' => false,
111+
],
106112
//更多参数请参看手册
107113
);
108114

@@ -121,7 +127,7 @@ class Myproducer extends \Webman\PHPCreeper\Producer
121127
'refer' => '',
122128
'type' => 'text', //可以自由设定类型
123129
'method' => 'get',
124-
'context' => $task_private_context, //任务私有context,其上下文成员与全局context完全相同,最终会采用合并覆盖策略
130+
'context' => $private_task_context, //任务私有context,其上下文成员与全局context完全相同,最终会采用合并覆盖策略
125131
);
126132

127133
$this->createTask($task);
@@ -277,6 +283,42 @@ class Mydownloader extends \Webman\PHPCreeper\Downloader
277283
{
278284
//pprint($downloader->getDbo('test'), __METHOD__);
279285
}
286+
287+
/**
288+
* @brief onTaskEmpty
289+
*
290+
* @param object $downloader
291+
*
292+
* @return mixed
293+
*/
294+
public function onTaskEmpty($downloader)
295+
{
296+
//$downloader->createTask($task);
297+
}
298+
299+
/**
300+
* @brief onHeadlessBrowserOpenPage
301+
*
302+
* @param object $downloader
303+
* @param object $browser
304+
* @param object $page
305+
* @param string $url
306+
*
307+
* @return mixed
308+
*/
309+
public function onHeadlessBrowserOpenPage($downloader, $browser, $page, $url)
310+
{
311+
//注意:灵活设计特定类型的返回值有助于对付各种复杂的应用场景
312+
//1. 返回false, 会触发中断后续的业务逻辑;
313+
//2. 返回string,会触发中断后续的业务逻辑,一般多用于返回页面的HTML;
314+
//3. 返回array, 会继续执行后续的业务逻辑,一般多用于返回无头浏览器选项参数;
315+
//4. 返回其他, 会继续执行后续的业务逻辑,相当于是什么也没有发生;
316+
317+
//注意:一般无需调用如下几行代码,因为爬山虎内部默认会自动调用无头API做同样的工作.
318+
//$page->navigate($url)->waitForNavigation('firstMeaningfulPaint');
319+
//$html = $page->getHtml();
320+
//return $html;
321+
}
280322
}
281323
```
282324

composer.json

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,22 @@
11
{
22
"name": "blogdaren/webman-phpcreeper",
33
"type": "library",
4-
"description": "phpcreeper plugin for webman",
4+
"keywords": ["spider", "crawler", "multi-process", "event-loop", "async", "headless"],
5+
"homepage": "http://www.phpcreeper.com",
6+
"description": "PHPCreeper plugin for webman",
57
"license": "MIT",
8+
"authors": [
9+
{
10+
"name": "blogdaren",
11+
"email": "blogdaren@163.com"
12+
}
13+
],
14+
"support": {
15+
"wiki": "http://www.phpcreeper.com/docs/",
16+
"source": "https://github.com/blogdaren/webman-phpcreeper"
17+
},
618
"require": {
7-
"blogdaren/phpcreeper": "^1.3"
19+
"blogdaren/phpcreeper": ">=1.3"
820
},
921
"autoload": {
1022
"psr-4": {

src/Downloader.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ class Downloader extends \PHPCreeper\Downloader
2424
'onDownloaderReload',
2525
'onDownloaderStart',
2626
'onDownloaderStop',
27+
'onTaskEmpty',
28+
'onHeadlessBrowserOpenPage',
2729
];
2830

2931
/**

src/config/plugin/blogdaren/webman-phpcreeper/spider/main.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@
6565
'user_define_arg1' => 'user_define_value1',
6666
'user_define_arg2' => 'user_define_value2',
6767
),
68+
//无头浏览器,如果是动态页面考虑启用,否则应当禁用 [默认使用chrome且为禁用状态]
69+
'headless_browser' => [
70+
'headless' => false,
71+
],
6872
),
6973
);
7074

0 commit comments

Comments
 (0)