• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP采集类Snoopy抓取图片实例_php实例

php 搞代码 4年前 (2022-01-26) 41次浏览 已收录 0个评论

用了两天php的Snoopy这个类,发现很好用。获取请求网页里面的所有链接,直接使用fetchlinks就可以,获取所有文本信息使用fetchtext(其内部还是使用正则表达式在进行处理),还有其它较多的功能,如模拟提交表单等。

使用方法:

先下载Snoopy类,下载地址:http://sourceforge.net/projects/snoopy/
先实例化一个对象,然后调用相应的方法即可获取抓取的网页信息

<br />include 'snoopy/Snoopy.class.php';<br />    <br />$snoopy = new Snoopy();<br />    <br />$sourceURL = "http://www.gaodaima.com";<br />$snoopy->fetchlinks($sourceURL);<br />    <br />$a = $snoopy->results;<br />

它并没有提供获取网页中所有图片地址的方法,自己有个需求是要获取一个页面中所有文章列表中图片地址。然后自己就写了一个,主要还是正则那里匹配重要。

<br />//匹配图片的正则表达式<br /> $reTag = "//i";<br />

因为需求比较特殊,只需要抓取写死htp://开头的图片(外站的图片可能使得了防盗链,想先抓取到本地)

1.抓取指定网页,并筛选出预期的所有文章地址;

2.循环抓取第一步中的文章地址,然后使用匹配图片的正则表达式进行匹配,获取页面中所有符合规则的图片地址;

3.根据图片后缀和ID(这里只有gif、jpg)保存图片—如果此图片文件存在,先将其删除再保存。

<br /><meta http-equiv='content-type' content='text/html;charset=utf-8'><br /><?php<br />    include 'snoopy/Snoopy.class.php';<br />    <br />    $snoopy = new Snoopy();<br />    <br />    $sourceURL = "http://xxxxx";<br />    $snoopy->fetchlinks($sourceURL);<br />    <br />    $a = $snoopy->results;<br />    $re = "/d+.html$/";<br />    <br />    //过滤获取指定的文件地址请求<br />    foreach ($a as $tmp) {<br />        if (preg_match($re, $tmp)) {<br />            getImgURL($tmp);<br />        }<br />    }<br />    <br />    function getImgURL($siteName) {<br />        $snoopy = new Snoopy();<br />        $snoopy->fetch($siteName);<br />        <br />        $fileContent = $snoopy->results;<br />        <br />        //匹配图片的正则表达式<br />        $reTag = "//i";<br />        <br />        if (preg_match($reTag, $fileContent)) {<br />            $ret = preg_match_all($reTag, $fileContent, $matchResult);<br />            <br />            for ($i = 0, <div style="color:transparent">!本文来源gaodai.ma#com搞#代!码(网</div><em>搞gaodaima代码</em>$len = count($matchResult[1]); $i < $len; ++$i) {<br />                saveImgURL($matchResult[1][$i], $matchResult[2][$i]);<br />            }<br />        }<br />    }<br />    <br />    function saveImgURL($name, $suffix) {<br />        $url = $name.".".$suffix;<br />        <br />        echo "请求的图片地址:".$url."<br />";<br />        <br />        $imgSavePath = "E:/xxx/style/images/";<br />        $imgId = preg_replace("/^.+/(d+)$/", "\1", $name);<br />        if ($suffix == "gif") {<br />            $imgSavePath .= "emotion";<br />        } else {<br />            $imgSavePath .= "topic";<br />        }<br />        $imgSavePath .= ("/".$imgId.".".$suffix);<br />        <br />        if (is_file($imgSavePath)) {<br />            unlink($imgSavePath);<br />            echo "<p style='color:#f00'>文件".$imgSavePath."已存在,将被删除</p>";<br />        }<br />        <br />        $imgFile = file_get_contents($url);<br />        $flag = file_put_contents($imgSavePath, $imgFile);<br />        <br />        if ($flag) {<br />            echo "<p>文件".$imgSavePath."保存成功</p>";<br />        }<br />    }<br />?><br />

在使用php抓取网页:内容、图片、链接的时候,我觉得最重要的还是正则(根据抓取的内容和指定的规则获取想要的数据),思路其实都比较简单,用到的方法也并不多,也就那几个(而且抓取内容还是直接调用别人写好的类中的方法就可以了)

但之前想过的是php似乎并没有实现如下的方法,比如一个文件中有N行(N很大),需要将其中符合规则的行内容进行替换,如第3行是aaa需要转成bbbbb。一般的需要修改文件时的常见做法:

1.一次读取整个文件(或是逐行读取),然后使用临时文件进行保存最终转换后的结果,再替换原始文件

2.逐行读取,使用fseek控制文件指针的位置,然后fwrite写入

方案1在文件较大时,一次读取不可取(逐行读取,然后写入临时文件再替换原始文件效率感觉也不高),方案2则在被替换的字符串长度小于等于目标值时没问题,但超过了则会有问题,它会“越界”,将下一行的数据也打乱了(不能像JavaScript中有“选区”的概念,使用新的内容进行替换)。

下面是使用方案2做试验的代码:

<br /><?php<br />$mode = "r+";<br />$filename = "d:/file.txt";<br />$fp = fopen($filename, $mode);<br />if ($fp) {<br /> $i = 1;<br /> while (!feof($fp)) {<br />    $str = fgets($fp);<br />    echo $str;<br />    if ($i == 1) {<br />      $len = strlen($str);<br />      fseek($fp, -$len, SEEK_CUR);//指针向前移动<br />      fwrite($fp, "123");<br />    }<br />    i++;<br />  }<br />  fclose($fp);<br />}<br />?><br />

先读取一行,此时文件指针其实是指到下一行开头,使用fseek将文件指针回移到上一行起始位置,然后使用fwrite进行替换操作,正因为是替换操作,在不指定长度的情况下,它把影响到下一行的数据,而我想要的是只想针对这一行进行操作,例如删除这一行或是整行只替换为一个1,上面的例子达不到要求,或许是我还没有找到合适的方法…


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP采集类Snoopy抓取图片实例_php实例

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址