php的Snoopy类案例讲解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
php的Snoopy类案例讲解
php的Snoopy类
获取请求⽹页⾥⾯的所有链接,直接使⽤fetchlinks就可以,获取所有⽂本信息使⽤fetchtext(其内部还是使⽤正则表达式在进⾏处理),还有其它较多的功能,如模拟提交表单等。
使⽤⽅法:
2、先实例化⼀个对象,然后调⽤相应的⽅法即可获取抓取的⽹页信息
⽰例:
include 'snoopy/Snoopy.class.php';
$snoopy = new Snoopy();
$sourceURL = "http://xxxxxxxxx";
$snoopy->fetchlinks($sourceURL);
$a = $snoopy->results;
它并没有提供获取⽹页中所有图⽚地址的⽅法,⾃⼰有个需求是要获取⼀个页⾯中所有⽂章列表中图⽚地址。然后⾃⼰就写了⼀个,主要还是正则那⾥匹配重要。
//匹配图⽚的正则表达式
$reTag = "/<img[^s]+src=\"(http:\/\/[^\"]+).(jpg|png|gif|jpeg)\"[^\/]*\/>/i";
因为需求⽐较特殊,只需要抓取写死htp://开头的图⽚(外站的图⽚可能使得了防盗链,想先抓取到本地)
实现思路:
1、抓取指定⽹页,并筛选出预期的所有⽂章地址;
2、循环抓取第⼀步中的⽂章地址,然后使⽤匹配图⽚的正则表达式进⾏匹配,获取页⾯中所有符合规则的图⽚地址;
3、根据图⽚后缀和ID(这⾥只有gif、jpg)保存图⽚---如果此图⽚⽂件存在,先将其删除再保存
<meta http-equiv='content-type' content='text/html;charset=utf-8'>
<?php
include 'snoopy/Snoopy.class.php';
$snoopy = new Snoopy();
$sourceURL = "http://xxxxx";
$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 = "/<img[^s]+src=\"(http:\/\/[^\"]+).(jpg|png|gif|jpeg)\"[^\/]*\/>/i";
if (preg_match($reTag, $fileContent)) {
$ret = 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 "<p style='color:#f00;'>⽂件".$imgSavePath."已存在,将被删除</p>";
}
$imgFile = file_get_contents($url);
$flag = file_put_contents($imgSavePath, $imgFile);
if ($flag) {
echo "<p>⽂件".$imgSavePath."保存成功</p>";
}
}
>
在使⽤php抓取⽹页:内容、图⽚、链接的时候,我觉得最重要的还是正则(根据抓取的内容和指定的规则获取想要的数据),思路其实都⽐较简单,⽤到的⽅法也并不多,也就那⼏个(⽽且抓取内容还是直接调⽤别⼈写好的类中的⽅法就可以了)
但之前想过的是php似乎并没有实现如下的⽅法,⽐如⼀个⽂件中有N⾏(N很⼤),需要将其中符合规则的⾏内容进⾏替换,如第3⾏是aaa需要转成bbbbb。⼀般的需要修改⽂件时的常见做法:
1、⼀次读取整个⽂件(或是逐⾏读取),然后使⽤临时⽂件进⾏保存最终转换后的结果,再替换原始⽂件
2、逐⾏读取,使⽤fseek控制⽂件指针的位置,然后fwrite写⼊
⽅案1在⽂件较⼤时,⼀次读取不可取(逐⾏读取,然后写⼊临时⽂件再替换原始⽂件效率感觉也不⾼),⽅案2则在被替换的字符串长度⼩于等于⽬标值时没问题,但超过了则会有问题,它会“越界”,将下⼀⾏的数据也打乱了(不能像JavaScript中有“选区”的概念,使⽤新的内容进⾏替换)
下⾯是使⽤⽅案2做试验的代码:
<?php
$mode = "r+";
$filename = "d:/file.txt";
$fp = fopen($filename, $mode);
if ($fp) {
$i = 1;
while (!feof($fp)) {
$str = fgets($fp);
echo $str;
if ($i == 1) {
$len = strlen($str);
fseek($fp, -$len, SEEK_CUR);//指针向前移动
fwrite($fp, "123");
}
$i++;
}
fclose($fp);
}
>
先读取⼀⾏,此时⽂件指针其实是指到下⼀⾏开头,使⽤fseek将⽂件指针回移到上⼀⾏起始位置,然后使⽤fwrite进⾏替换操作,正因为是替换操作,在不指定长度的情况下,它把影响到下⼀⾏的数据,⽽我想要的是只想针对这⼀⾏进⾏操作,例如删除这⼀⾏或是整⾏只替换为⼀个1,上⾯的例⼦达不到要求,或许是我还没有找到合适的⽅法… 你有好的⽅法吗?
到此这篇关于php的Snoopy类案例讲解的⽂章就介绍到这了,更多相关php的Snoopy内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!