php网页抓取图片(PHP采集类Snoopy抓取图片实例(一)(组图))
优采云 发布时间: 2021-12-22 06:02php网页抓取图片(PHP采集类Snoopy抓取图片实例(一)(组图))
PHP采集类似史努比的抓图示例
PHP的史努比用了两天了,很有用。要获取请求网页中的所有链接,可以直接使用 fetchlinks。获取所有的文本信息,使用fetchtext(内部仍然使用正则表达式进行处理),还有很多其他的功能,比如模拟提交表单。
指示:
首先下载史努比类,下载地址:
先实例化一个对象,然后调用对应的方法获取爬取的网页信息
包括'史努比/史努比.class.php';
$史努比 = 新史努比();
$sourceURL = "";
$snoopy->fetchlinks($sourceURL);
$a = $snoopy->results;
不提供获取网页中所有图片地址的方法。它自己的一个需求是获取页面上文章列表中的所有图片地址。然后我自己写了一个,主要是因为常规比赛很重要。
//匹配图片的正则表达式
$reTag = "//i";
由于特殊需要,只需要抓取htp://开头的图片(外网的图片可能会做防盗链,我想先抓取本地的)
1. 抓取指定网页,过滤掉所有预期的文章地址;
2.循环抓取第一步中文章的地址,然后使用匹配图片的正则表达式进行匹配,得到页面中所有符合规则的图片地址;
3. 根据图片后缀和ID保存图片(这里只有gif,jpg)---如果图片文件存在,先删除再保存。
包括'史努比/史努比.class.php';
$史努比 = 新史努比();
$sourceURL = "";
$snoopy->fetchlinks($sourceURL);
$a = $snoopy->results;
$re = "/d+.html$/";
//过滤获取指定文件地址请求
foreach ($a as $tmp) {
如果(preg_match($re,$tmp)){
getImgURL($tmp);
}
}
函数 getImgURL($siteName) {
$史努比 = 新史努比();
$snoopy->fetch($siteName);
$fileContent = $snoopy->results;
//匹配图片的正则表达式
$reTag = "//i";
如果(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]);
}
}
}
函数 saveImgURL($name, $suffix) {
$url = $name.".".$suffix;
echo "请求的图片地址:".$url。"
”;
$imgSavePath = "E:/xxx/style/images/";
$imgId = preg_replace("/^.+/(d+)$/", "\1", $name);
if ($suffix == "gif") {
$imgSavePath .= "情感";
} 别的 {
$imgSavePath .= "主题";
}
$imgSavePath .= ("/".$imgId.".".$suffix);
如果(is_file($imgSavePath)){
取消链接($imgSavePath);
回声"
文件“.$imgSavePath”。已经存在,将被删除
”;
}
$imgFile = file_get_contents($url);
$flag = file_put_contents($imgSavePath, $imgFile);
如果($标志){
回声"
文件“.$imgSavePath”。已成功保存
”;
}
}
用php爬网页时:内容、图片、链接,我觉得最重要的是有规律的(根据爬取的内容和指定的规则获取想要的数据),思路其实比较简单,用到的方法是也不是很多,只有那几个(而且可以直接调用别人写的类中的方法来抓取内容)
但是我之前想到的是,PHP似乎没有实现以下方法。比如一个文件有N行(N大),需要替换符合规则的行内容。比如第三行是aaa,需要转成bbbbb。需要修改文件时的常见做法:
1. 一次读取整个文件(或逐行读取),然后用一个临时文件保存最终的转换结果,然后替换原文件
2. 逐行读取,使用fseek控制文件指针位置,然后fwrite写入
文件较大时,方案1不建议一次性读取(逐行读取,然后写入临时文件再替换原文件效率不高),方案2是当替换的长度string 小于等于目标值没问题,但是超过限制就会有问题。它会“越界”并破坏下一行的数据(不能像JavaScript中的“选择”概念那样用新的内容代替)。
这是用于试验场景 2 的代码:
$mode = "r+";
$filename = "d:/file.txt";
$fp = fopen($filename, $mode);
如果($ fp){
$i = 1;
而 (!feof($fp)) {
$str = fgets($fp);
回声 $str;
如果 ($i == 1) {
$len = strlen($str);
fseek($fp, -$len, SEEK_CUR);//指针向前移动
fwrite($fp, "123");
}
我++;
}
fclose($fp);
}
先读一行。这时候文件指针实际上指向了下一行的开始。使用 fseek 将文件指针移回上一行的开头,然后使用 fwrite 执行替换操作。因为是替换操作,如果不指定长度next,会影响下一行的数据,而我想要的是只对这一行进行操作,比如删除这一行或者只用一个替换整行1.上面的例子不符合要求,可能是我没有找到合适的方法...相关阅读:
C#使用WinRar命令实现压缩和解压操作
如何使用jquery.form.js上传图片
PHP+jquery+ajax实现即时聊天功能示例
JS中artdialog弹窗控件的提交表单思路详解
Oracle SQL中实现indexOf和lastIndexOf函数的思路和代码
PHP输出URL快捷方式示例代码
Android开发学习路线的七个阶段
PHP使用cookie实现自动登录的方法
AngularJS 手动表单验证
通过实例深入学习OGNL表达式在Java的Struts框架中的使用
Windows 10 U 盘版亚马逊开启预购,8 月 16 日开始发货
js实现带缓冲效果的类似QQ面板的折叠菜单代码
AngularJS 基本 ng-if 指令用法
Java设计模式之备忘录模式(Memento Pattern)介绍