php抓取网页所有图片(php获取请求网页里面的所有链接())
优采云 发布时间: 2021-12-02 15:02php抓取网页所有图片(php获取请求网页里面的所有链接())
PHP的史努比用了两天了,很有用。要获取请求网页中的所有链接,可以直接使用 fetchlinks。获取所有的文本信息,使用fetchtext(内部仍然使用正则表达式进行处理),还有很多其他的功能,比如模拟提交表单。
指示:
先实例化一个对象,然后调用对应的方法获取爬取的网页信息
例子:
包括'史努比/史努比.class.php';
$史努比 = 新史努比();
$sourceURL = "";
$snoopy->fetchlinks($sourceURL);
$a = $snoopy->results;
不提供获取网页中所有图片地址的方法。它自己的一个需求是获取页面上文章列表中的所有图片地址。然后我自己写了一个,主要是因为常规比赛很重要。
//匹配图片的正则表达式
$reTag = "/
/一世”;
由于特殊需要,只需要抓取htp://开头的图片(外网的图片可能会做防盗链,我想先抓取本地的)
爬取指定网页,过滤掉所有预期的文章地址;
循环获取第一步中的文章地址,然后使用匹配图片的正则表达式进行匹配,获取页面中所有符合规则的图片地址;
根据图片后缀和ID保存图片(这里只有gif,jpg)——如果图片文件存在,先删除再保存。
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 = "/
/一世”;
如果(preg_match($reTag,$fileContent)){
$ret = preg_match_all($reTag, $fileContent, $matchResult);
for ($i = 0, $len = count($matchResult[1]); $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。需要修改文件时的常见做法:
一次性读取整个文件(或逐行读取),然后用临时文件保存最终的转换结果,然后替换原文件
逐行读取,使用fseek控制文件指针的位置,然后fwrite写入
文件较大时,方案1不建议一次性读取(逐行读取,然后写入临时文件再替换原文件效率不高),方案2是当替换的长度string 小于等于目标值没问题,但是超过限制就会有问题。它会“越界”并破坏下一行的数据(不能像JavaScript中的“选择”概念那样用新的内容代替)。
这是用于试验场景 2 的代码:
先读一行。这时候文件指针实际上指向了下一行的开始。使用 fseek 将文件指针移回上一行的开头,然后使用 fwrite 执行替换操作。因为是替换操作,如果长度不指定next,会影响下一行的数据,而我想要的是只对这一行进行操作,比如删除这一行或者只用一个替换整行1.上面的例子不符合要求,可能是我没找到合适的方法...
PHP的史努比用了两天了,很有用。获取请求页面中的所有链接,可以直接使用fetchlinks,获取所有文本信息,使用fetchtext(其内部...