PHP Snoopy类-抓取采集

Author Avatar
Amos
发表:2018-01-13 22:55:08
修改:2022-05-11 01:05:21

Snoopy其实就是一个PHP类-抓取采集类,它能完成获取网页内容和发送表单的任务。
要求:PHP4以上本身是php一个类,无需扩支持,不支持curl的服务器可以使用。

官网(下载):http://snoopy.sourceforge.net/

主要功能

抓取网页的内容(fetch)
抓取网页的文本内容 (去除HTML标签) (fetchtext)
抓取网页的链接,表单 (fetchlinks fetchform)
支持代理主机
支持基本的用户名/密码验证
支持设置 user_agent, referer(来路), cookies 和 header content(头文件)
支持浏览器重定向,并能控制重定向深度
能把网页中的链接扩展成高质量的url(默认)
提交数据并且获取返回值
支持跟踪HTML框架
支持重定向的时候传递cookies

接口或方法

fetch($URI)
抓取网页的内容,$URI 是要抓取网页的网址,抓取过来结果存储到 $this->results。如果你抓取的是框架,这每个 frame 都会被抓取,结果会保存到一个数组中。

fetchtext($URI)
和 fetch() 是差不多的,只是它的结果是文本,除去 HTML 标签和其他无关信息。

fetchform($URI)
只返回抓取的网页上 form 元素。

fetchlinks($URI)
只返回抓取的网页上的链接,默认返回的链接都是含有域名的链接。

submit($URI,$formvars)
提交一个表单到指定的 $URI。$formvars 是要传递的 form 变量数组。

submittext($URI,$formvars)
这个方法和 submit() 基本一致,但是它返回的是文本,除去了 html 标签和其他无关数据。

submitlinks($URI)
返回的是链接。

Snoopy采集类属性(Snoopy.class.php)

$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

示例:模拟提交表单返回表的数据

<?php
        include "snoopy.class.php";
        $snoopy = new Snoopy;
        //表单提交模拟  
        $formvars["txtStudentNo"] = "学号";   
        $formvars["txtStudentName"] = "姓名";
        $formvars["__EVENTTARGET"] = "";
        $formvars["__EVENTARGUMENT"] = "";
        $formvars["__VIEWSTATE"] = "/wEPDwULLTEyODE2MTMzNjUPZBYCAgMPZBYGAhYPEGRkFgBkAhgPPCsAEQBkAhoPPCsAEQEBEBYAFgAWAGQYAgUHZ3ZTY29yZQ9nZAUIZ3ZDcmVkaXQPZ2Q0vZ9kcrUU+TZE61Bo6Cj1/MAPlBQAKHwTNWddmQ6OlA==";
        $formvars["__EVENTVALIDATION"] = "/wEWBgLlvo2iCALOj4fxBwL9p/noCwLdkpmPAQKLk6mvAgKXt+TzAXM3720UDhWcPUtOLX8Il0quPlehyyQNYIBW67NbdoWi";
        $formvars["btnOK"] = "确定";
        //抓取地址
        $action = "学院成绩查询网址";   


        $snoopy->cookies["PHPSESSID"] = 'fc106b1918bd522cc863f36890e6fff7'; //伪装sessionid   
        $snoopy->agent = "(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)"; //伪装浏览器   
        $snoopy->referer = "学院成绩查询网址"; //伪装来源页地址 http_referer   
        $snoopy->rawheaders["Pragma"] = "no-cache"; //cache 的http头信息   
        $snoopy->rawheaders["X_FORWARDED_FOR"] = "127.0.0.1"; //伪装ip   
        $snoopy->submit($action,$formvars);   
        $data=$snoopy->results;   
        //单独取出数据
        preg_match_all('#<td>(.+?)</td>#',$data,$m);
         // print_r($m);//打印出所有
    ?>
    <?
    if(isset($m[0][1]))
    {
    ?>
    <table width="50%" border="1" cellspacing="0" cellpadding="0">
        <?
        for($i=0;$i<32;$i++)
        {
        ?>
        <tr>
            <?=$m[0][13+12*$i]?>
            <?=$m[0][16+12*$i]?>
            <?=$m[0][17+12*$i]?>
        </tr>
        <?
        }
        ?>
    </table>
    <?
    }
    else
        echo "该成绩查询只适用本校学生";
    ?>

转载请遵循 协议许可
本文所有内容严禁任何形式的盗用
本文作者:Amos Amos
本文链接:https://amoshk.top/php_snoopy/

评论
✒️ 支持 Markdown 格式
🖼️ 头像与邮箱绑定 Gravatar 服务
📬 邮箱会回复提醒(也许会在垃圾箱内)