php,,
``,在这段代码中,首先引入了Snoopy类,然后创建了一个Snoopy对象。调用fetch方法获取指定URL的内容。通过getHTML方法获取并打印网页的HTML内容。Snoopy 类
Snoopy是一个强大的PHP采集类,适用于需要抓取网页内容的场景,它支持多种功能,如抓取网页内容、文本内容、链接和表单等,它还支持代理主机、基本的用户名/密码验证、设置UserAgent、Referer、Cookies和头文件信息等。
主要特点
1、抓取网页的内容(fetch):通过指定URL地址来抓取网页内容,并将结果存储在$this>results
中。
2、抓取网页的文本内容(fetchtext):类似于fetch()
方法,但会去除HTML标签和其他无关数据,只返回网页中的纯文字内容。
3、抓取网页的链接和表单(fetchlinks 和 fetchform):分别用于抓取网页中的链接和表单内容,并自动补全相对链接为完整URL。
4、支持代理主机:可以设置代理主机和端口,以便通过代理服务器进行网络请求。
5、基本的身份验证:支持通过用户名和密码进行基本的身份验证。
6、自定义请求头:允许设置UserAgent、Referer、Cookies以及其他头文件信息。
7、重定向控制:支持浏览器重定向,并能控制重定向深度。
8、提交数据:可以通过submit()
方法向指定的URL发送表单数据,并获取返回值。
使用实例代码
示例1:获取指定URL的内容
include "Snoopy.class.php"; $snoopy = new Snoopy; $snoopy>fetch("http://www.example.com"); // 获取所有内容 echo $snoopy>results; // 显示结果
示例2:抓取网页文本内容
include "Snoopy.class.php"; $snoopy = new Snoopy; if ($snoopy>fetchtext("http://www.example.com")) { echo htmlspecialchars($snoopy>results); // 显示抓取到的文本内容 } else { echo "error fetching document: " . $snoopy>error; }
示例3:获取网页中的链接
include "Snoopy.class.php"; $snoopy = new Snoopy; $snoopy>fetchlinks("http://www.example.com"); // 获取所有链接 $links = $snoopy>results; foreach ($links as $link) { echo $link . "<br>"; // 输出每个链接 }
示例4:提交表单数据
include "Snoopy.class.php"; $snoopy = new Snoopy; $formvars["username"] = "admin"; $formvars["pwd"] = "admin"; $action = "http://www.example.com/login"; // 表单提交地址 if ($snoopy>submit($action, $formvars)) { echo htmlspecialchars($snoopy>results); // 显示登录后的内容 } else { echo "error submitting form: " . $snoopy>error; }
示例5:下载图片
include "Snoopy.class.php"; $snoopy = new Snoopy; $sourceURL = "http://www.example.com"; $snoopy>fetchlinks($sourceURL); // 获取所有链接 $a = $snoopy>results; $re = "/\d+.html$/"; // 过滤获取指定的文件地址请求 foreach ($a as $tmp) { if (preg_match($re, $tmp)) { getImgURL($tmp); } } function getImgURL($siteName) { $snoopy = new Snoopy(); $snoopy>fetch($siteName); $fileContent = $snoopy>results; $reTag = "//i"; // 匹配图片的正则表达式 if (preg_match_all($reTag, $fileContent, $matchResult)) { for ($i = 0, $len = count($matchResult[1]); $i < $len; $i++) { saveImgURL($matchResult[1][$i], $matchResult[2][$i]); } } } function saveImgURL($name, $suffix) { $url = $name . "." . $suffix; echo "请求的图片地址:" . $url . "<br>"; $imgSavePath = "E:/xxx/style/images/"; $imgId = preg_replace("/^.+/(\d+)$/", "\1", $name); if ($suffix == "gif") { $imgSavePath .= "emotion"; } else { $imgSavePath .= "topic"; } $imgSavePath .= ("/" . $imgId . "." . $suffix); if (is_file($imgSavePath)) { unlink($imgSavePath); echo "文件" . $imgSavePath . "已存在,将被删除<br>"; } $imgFile = file_get_contents($url); $flag = file_put_contents($imgSavePath, $imgFile); if ($flag) { echo "文件" . $imgSavePath . "保存成功<br>"; } }
FAQs
问题1:Snoopy类如何设置代理?
答:你可以通过设置Snoopy对象的proxy_host
和proxy_port
属性来配置代理。
include "Snoopy.class.php"; $snoopy = new Snoopy; $snoopy>proxy_host = "http://proxy.example.com"; $snoopy>proxy_port = "8080";
问题2:如何限制Snoopy的重定向次数?
答:你可以通过设置Snoopy对象的maxredirs
属性来限制最大重定向次数,要禁止重定向,可以将maxredirs
设置为0:
include "Snoopy.class.php"; $snoopy = new Snoopy; $snoopy>maxredirs = 0; // 禁止重定向