PHP抓取采集类snoopy介绍
来源:互联网 发布:c标准库源码 编辑:程序博客网 时间:2024/04/23 22:54
snoopy是一个php类,用来模仿web浏览器的功能,它能完成获取网页内容和发送表单的任务。官方网站 http://snoopy.sourceforge.net/
Snoopy的一些功能特点:
- 抓取网页的内容 fetch()
- 抓取网页的文本内容 (去除HTML标签) fetchtext()
- 抓取网页的链接,表单 fetchlinks() fetchform()
- 支持代理主机
- 支持基本的用户名/密码验证
- 支持设置 user_agent, referer(来路), cookies 和 header content(头文件)
- 支持浏览器重定向,并能控制重定向深度
- 能把网页中的链接扩展成高质量的url(默认)
- 提交数据并且获取返回值
- 支持跟踪HTML框架
- 支持重定向的时候传递cookies
要求php4以上就可以。由于本身是php一个类,无需扩支持,服务器不支持curl时候的最好选择。
类方法
1. fetch($uri)
这是为了抓取网页的内容而使用的方法。$URI参数是被抓取网页的URL地址。抓取的结果被存储在 $this->results 中。
如果你正在抓取的是一个框架,Snoopy将会将每个框架追踪后存入数组中,然后存入 $this->results。
1
<?php
2
$url
=
"http://www.nowamagic.net/librarys/veda/"
;
3
include
(
"./Snoopy.class.php"
);
4
5
$snoopy
=
new
Snoopy;
6
$snoopy
->fetch(
$url
);
//获取所有内容
7
echo
$snoopy
->results;
//显示结果
8
?>
2. fetchtext($URI)
本方法类似于fetch(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回网页中的文字内容。
1
<?php
2
$url
=
"http://www.nowamagic.net/librarys/veda/"
;
3
include
(
"./Snoopy.class.php"
);
4
5
$snoopy
=
new
Snoopy;
6
$snoopy
->fetchtext(
$url
);
//获取文本内容
7
echo
$snoopy
->results;
//显示结果
8
?>
3. fetchform($URI)
本方法类似于fetch(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回网页中表单内容(form)。
1
4. fetchlinks($URI)
本方法类似于fetch(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回网页中链接(link)。默认情况下,相对链接将自动补全,转换成完整的URL。
1
5. submit($URI,$formvars)
本方法向$URL指定的链接地址发送确认表单。$formvars是一个存储表单参数的数组。
1
6. submittext($URI,$formvars)
本方法类似于submit(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回登陆后网页中的文字内容。
1
7. submitlinks($URI)
本方法类似于submit(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回网页中链接(link)。默认情况下,相对链接将自动补全,转换成完整的URL。
1
类属性 (缺省值在括号里)
- $host 连接的主机
- $port 连接的端口
- $proxy_host 使用的代理主机,如果有的话
- $proxy_port 使用的代理主机端口,如果有的话
- $agent 用户代理伪装 (Snoopy v0.1)
- $referer 来路信息,如果有的话
- $cookies cookies, 如果有的话
- $rawheaders 其他的头信息, 如果有的话
- $maxredirs 最大重定向次数, 0=不允许 (5)
- $offsiteok whether or not to allow redirects off-site. (true)
- $expandlinks 是否将链接都补全为完整地址 (true)
- $user 认证用户名, 如果有的话
- $pass 认证用户名, 如果有的话
- $accept http 接受类型 (image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*)
- $error 哪里报错, 如果有的话
- $response_code 从服务器返回的响应代码
- $headers 从服务器返回的头信息
- $maxlength 最长返回数据长度
- $read_timeout 读取操作超时 (requires PHP 4 Beta 4+),设置为0为没有超时
- $timed_out 如果一次读取操作超时了,本属性返回 true (requires PHP 4 Beta 4+)
- $maxframes 允许追踪的框架最大数量
- $status 抓取的http的状态
- $temp_dir 网页服务器能够写入的临时文件目录 (/tmp)
- $curl_path cURL binary 的目录, 如果没有cURL binary就设置为 false
Demo
01
include
"Snoopy.class.php"
;
02
$snoopy
=
new
Snoopy;
03
04
$snoopy
->proxy_host =
"http://www.nowamagic.net/librarys/veda/"
;
05
$snoopy
->proxy_port =
"80"
;
06
07
$snoopy
->agent =
"(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)"
;
08
$snoopy
->referer =
"http://www.4wei.cn"
;
09
10
$snoopy
->cookies[
"SessionID"
] = 238472834723489l;
11
$snoopy
->cookies[
"favoriteColor"
] =
"RED"
;
12
13
$snoopy
->rawheaders[
"Pragma"
] =
"no-cache"
;
14
15
$snoopy
->maxredirs = 2;
16
$snoopy
->offsiteok = false;
17
$snoopy
->expandlinks = false;
18
19
$snoopy
->user =
"joe"
;
20
$snoopy
->pass =
"bloe"
;
21
22
if
(
$snoopy
->fetchtext(
"http://www.4wei.cn"
))
23
{
24
echo
"<PRE>"
.htmlspecialchars(
$snoopy
->results).
"</PRE>n"
;
25
}
26
else
27
echo
"error fetching document: "
.
$snoopy
->error.
"n"
;
获取指定url内容:
01
<?
02
$url
=
"http://www.nowamagic.net/librarys/veda/"
;
03
include
(
"snoopy.php"
);
04
$snoopy
=
new
Snoopy;
05
$snoopy
->fetch(
$url
);
//获取所有内容
06
echo
$snoopy
->results;
//显示结果
07
//可选以下
08
//$snoopy->fetchtext //获取文本内容(去掉html代码)
09
//$snoopy->fetchlinks //获取链接
10
//$snoopy->fetchform //获取表单
11
?>
表单提交:
01
<?php
02
$formvars
[
"username"
] =
"admin"
;
03
$formvars
[
"pwd"
] =
"admin"
;
04
$action
=
"http://www.nowamagic.net/librarys/veda/"
;//</A>表单提交地址
05
$snoopy
->submit(
$action
,
$formvars
);
//$formvars为提交的数组
06
echo
$snoopy
->results;
//获取表单提交后的 返回的结果
07
//可选以下
08
$snoopy
->submittext;
//提交后只返回 去除html的 文本
09
$snoopy
->submitlinks;
//提交后只返回 链接
10
?>
既然已经提交的表单,那就可以做很多事情。接下来我们来伪装ip,伪装浏览器:
01
<?php
02
$formvars
[
"username"
] =
"admin"
;
03
$formvars
[
"pwd"
] =
"admin"
;
04
$action
=
"http://www.4wei.cn"
;
05
include
"snoopy.php"
;
06
$snoopy
=
new
Snoopy;
07
$snoopy
->cookies[
"PHPSESSID"
] =
'fc106b1918bd522cc863f36890e6fff7'
;
//伪装sessionid
08
$snoopy
->agent =
"(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)"
;
//伪装浏览器
09
$snoopy
->referer = http:
//www.4wei.cn; //伪装来源页地址 http_referer
10
$snoopy
->rawheaders[
"Pragma"
] =
"no-cache"
;
//cache 的http头信息
11
$snoopy
->rawheaders[
"X_FORWARDED_FOR"
] =
"127.0.0.101"
;
//伪装ip
12
$snoopy
->submit(
$action
,
$formvars
);
13
echo
$snoopy
->results;
14
?>
原来我们可以伪装session 伪装浏览器 ,伪装ip, haha 可以做很多事情了。例如 带验证码,验证ip 投票, 可以不停的投。
ps:这里伪装ip ,其实是伪装http头,所以一般的通过 REMOTE_ADDR 获取的ip是伪装不了,反而那些通过http头来获取ip的(可以防止代理的那种) 就可以自己来制造ip。
关于如何验证码 ,简单说下:首先用普通的浏览器, 查看页面 , 找到验证码所对应的sessionid,同时记下sessionid和验证码值,接下来就用snoopy去伪造 。
原理:由于是同一个sessionid 所以取得的验证码和第一次输入的是一样的。
有时我们可能需要伪造更多的东西,snoopy完全为我们想到了:
01
<?php
02
$snoopy
->proxy_host =
"http://www.nowamagic.net/librarys/veda/"
;
03
$snoopy
->proxy_port =
"8080"
;
//使用代理
04
$snoopy
->maxredirs = 2;
//重定向次数
05
$snoopy
->expandlinks = true;
//是否补全链接 在采集的时候经常用到
06
// 例如链接为 /images/taoav.gif 可改为它的全链接 <A href="http://www.4wei.cn/images/taoav.gif">http://www.4wei.cn/images/taoav.gif</A>
07
$snoopy
->maxframes = 5
//允许的最大框架数
08
//注意抓取框架的时候 $snoopy->results 返回的是一个数组
09
$snoopy
->error
//返回报错信息
10
?>
比较完整的示例:
01
/**
02
* You need the snoopy.class.php from
03
* http://snoopy.sourceforge.net/
04
*/
05
include
(
"snoopy.class.php"
);
06
07
$snoopy
=
new
Snoopy;
08
// need an proxy?:
09
//$snoopy->proxy_host = "my.proxy.host";
10
//$snoopy->proxy_port = "8080";
11
12
// set browser and referer:
13
$snoopy
->agent =
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
;
14
$snoopy
->referer =
"http://www.jonasjohn.de/"
;
15
16
// set some cookies:
17
$snoopy
->cookies[
"SessionID"
] =
'238472834723489'
;
18
$snoopy
->cookies[
"favoriteColor"
] =
"blue"
;
19
20
// set an raw-header:
21
$snoopy
->rawheaders[
"Pragma"
] =
"no-cache"
;
22
23
// set some internal variables:
24
$snoopy
->maxredirs = 2;
25
$snoopy
->offsiteok = false;
26
$snoopy
->expandlinks = false;
27
28
// set username and password (optional)
29
//$snoopy->user = "joe";
30
//$snoopy->pass = "bloe";
31
32
// fetch the text of the website www.google.com:
33
if
(
$snoopy
->fetchtext(
"http://www.google.com"
)){
34
// other methods: fetch, fetchform, fetchlinks, submittext and submitlinks
35
36
// response code:
37
print
"response code: "
.
$snoopy
->response_code.
"<br/>n"
;
38
39
// print the headers:
40
41
print
"<b>Headers:</b><br/>"
;
42
while
(list(
$key
,
$val
) = each(
$snoopy
->headers)){
43
print
$key
.
": "
.
$val
.
"<br/>n"
;
44
}
45
46
print
"<br/>n"
;
47
48
// print the texts of the website:
49
print htmlspecialchars(
$snoopy
->results).
"n"
;
50
}
51
else
{
52
print
"Snoopy: error while fetching document: "
.
$snoopy
->error.
"n"
;
53
}
用Snoopy类完成一个简单的图片采集:
01
<meta http-equiv=
'content-type'
content=
'text/html;charset=utf-8'
>
02
<?php
03
include
'Snoopy.class.php'
;
//加载Snoopy类
04
$snoopy
=
new
Snoopy();
//实例化一个对象
05
$sourceURL
=
"http://www.nowamagic.net/librarys/veda/"
; //要抓取的网页
06
$snoopy
->fetchlinks(
$sourceURL
);
//获得网页的链接
07
$a
=
$snoopy
->results;
//得到网页链接的结果
08
$re
=
"/d+.html$/"
;
//匹配的正则
09
//过滤获取指定的文件地址请求
10
foreach
(
$a
as
$tmp
) {
11
if
(preg_match(
$re
,
$tmp
)) {
12
$aa
=
$tmp
;
13
}
14
}
15
getImgURL(
$aa
);
16
function
getImgURL(
$siteName
)
17
{
18
$snoopy
=
new
Snoopy();
19
$snoopy
->fetch(
$siteName
);
20
$fileContent
=
$snoopy
->results;
//获取过滤后的页面的内容
21
//匹配图片的正则表达式
22
$reTag
=
"/<img[^s]+src="
(http:
//[^"]+).(jpg|png|gif|jpeg)"[^/]*/>/i";
23
if
(preg_match(
$reTag
,
$fileContent
)) {
24
//过滤图片
25
$ret
= preg_match_all(
$reTag
,
$fileContent
,
$matchResult
);
26
for
(
$i
= 0,
$len
=
count
(
$matchResult
[1]);
$i
<
$len
; ++
$i
)
27
{
28
saveImgURL(
$matchResult
[1][
$i
],
$matchResult
[2][
$i
]);
29
}
30
}
31
}
32
function
saveImgURL(
$name
,
$suffix
) {
33
$url
=
$name
.
"."
.
$suffix
;
34
echo
"请求的图片地址:"
.
$url
.
"<br/>"
;
35
$imgSavePath
=
"E:/123/images/"
;
//图片保存地址
36
$imgId
=mt_rand();
//产生一个随机的文件名
37
if
(
$suffix
==
"gif"
) {
38
//根据图片类型,放入不同的文件夹下面
39
$imgSavePath
.=
"emotion"
;
40
}
41
else
42
{
43
$imgSavePath
.=
"topic"
;
44
}
45
$imgSavePath
.= (
"/"
.
$imgId
.
"."
.
$suffix
);
//组装要保存的文件名
46
if
(
is_file
(
$imgSavePath
)) {
47
//判断文件名是否存在,存在则删除
48
unlink(
$imgSavePath
);
49
echo
"<p style='color:#f00;'>文件"
.
$imgSavePath
.
"已存在,将被删除</p>"
;
50
}
51
$imgFile
=
file_get_contents
(
$url
);
//读取网络文件
52
$flag
=
file_put_contents
(
$imgSavePath
,
$imgFile
);
//写入到本地
53
if
(
$flag
) {
54
echo
"<p>文件"
.
$imgSavePath
.
"保存成功</p>"
;
55
}
56
}
57
?>
- PHP抓取采集类snoopy介绍
- PHP抓取采集类snoopy介绍
- PHP采集类snoopy详细介绍(snoopy使用教程)
- PHP中使用snoopy采集类进行数据抓取
- PHP抓取类-Snoopy
- snoopy(强大的PHP采集类) 详细介绍
- snoopy(强大的PHP采集类) 详细介绍
- snoopy(强大的PHP采集类) 详细介绍
- snoopy(强大的PHP采集类) 详细介绍
- PHP采集类:Snoopy.class.php
- PHP采集类:Snoopy.class.php
- PHP采集类 Snoopy.class.php
- PHP采集类snoopy使用教程
- PHP采集利器:Snoopy
- PHP采集利器:Snoopy
- php+snoopy 数据采集
- 抓取网页链接的php类:snoopy
- PHP Snoopy网页抓取
- pdo事务回滚代码实现
- C++标准里 string和wstring
- fastdfs分布式文件系统之JAVA client工具类封装
- 网络编程(5)—— 基于Linux系统的UDP协议socket服务器和客户端
- 已解决:mysql无法远程访问10061错误,各种方式授权后也无效(ubuntu 16.04LTS mysql 5.7.13)
- PHP抓取采集类snoopy介绍
- 封装好的curl,get、post用法
- chrome五十大实用插件集合!
- Java入门(二):windows环境下Java配置Path classpath等环境变量
- 从一段代码读懂C/C++变量作用域
- Android存储数据SharedPreferences
- MySQL utf8mb4字符集:支持emoji表情符号
- The following processes: -cmd.exe -java.exe are locking the following directory:
- mr的Demo