php网页抓取图片(几个非常帮的摄影网站-抓取图片的流程及流程)
优采云 发布时间: 2021-09-25 00:20php网页抓取图片(几个非常帮的摄影网站-抓取图片的流程及流程)
今天在浏览简书的时候,发现了几位非常乐于助人的摄影师网站。上面的图片很美,于是萌生了把它们都屏蔽到当地的念头。并且之前也有过爬虫相关的项目,所以总结了一下自己的心得体会,供大家参考。
抓图过程介绍常用的抓图方式有很多,比如:使用curl方法、fiel_get_content方法、readfile方法、fopen方法。. . . . . 可谓五花八门!但它们的原理大致相似:
1 获取图片所在页面的url地址;
2 获取到目标页面的内容后,有规律地匹配标签的相关信息;
3 获取img的src属性信息后,获取图片的内容;
4 在本地创建一个文件,将步骤3中得到的内容写入文件;
经过以上4步,你喜欢的图片就保存在本地了。下面再详细看一下(从代码的角度),这里我只尝试了两种方法(curl和file_get_content)。
二、使用file_get_content方法抓取图片(get方法)
1 首先定义两个函数(getResources() 和downloadImg())获取页面内容和下载图片到本地函数!代码如下:
获取资源($url)
downloadImg($imgPath)2的主程序如下:
//定义本地目录(存放图片)
定义(“IMG_PATH”,“/home/www/test/img/”);
//获取页面内容
$url = "目标路径";
//这个函数把获取到的内容放到一个字符串中
$str = getResources($url);
//匹配img标签中src属性的信息;这里换成了data-original属性,因为页面使用了延迟加载机制
preg_match_all("|]+data-original=['\" ]?([^'\"?]+)['\" >]|U",$str,$array,PREG_SET_ORDER);
//因为上一步我们选择了PREG_SET_ORDER排序,所以$value[1]就是我们要下载图片的路径
$k = 0;
foreach ($array 作为 $key => $value)
{
$res = downloadImg($value[1]);
if($res) $k++;
}
echo "成功捕获的图片数量为:$k"; 程序结束,这里有以下几点需要注意:
1) preg_match_all() 函数的第四个参数是可选的。它们是:PREG_PATTERN_ORDER(默认),
PREG_SET_ORDER、PREG_OFFSET_CAPTURE,这三种方法在我看来是三种不同的排序,只会影响你的匹配结果的表现。如果不传递第四个参数,则默认为 PREG_PATTERN_ORDER,在这种情况下,使用 PREG_SET_ORDER。对此,php手册中有非常详细的介绍。我建议您在这一步查看手册以加深您的印象。
2) 在正则表达式中,我们匹配标签中data-original属性中的值。我们来谈谈这个正则表达式。首先匹配标签信息,然后通过子匹配匹配数据原创属性。值在。值得注意的是,这里有很多摄影类(图片类)。网站 为了更好的展示效果,大部分都会使用延迟加载设置。如果还是按照前面的方式匹配src属性,只能得到label的默认显示图片,显然不是我们需要的,所以匹配data-original属性(存储真实图片路径);
3) 如果请求的页面过大,程序运行时间过长,请在程序开头添加如下代码:
set_time_limit(120); //修改程序执行时间为120s(自己看)
其次,使用 curl 方法捕获图像(post 模式)。上面我们使用file_get_content()函数的get方法来捕获。这里我们改为 curl post 方法。(每种方法有两种方式)
1 定义一个函数,使用curl方法抓图
curlResources($url)
2 在主程序中,将 $str = getResources($url) 改为 $str = curlResources($url)。
三种方法和两种方法执行效率对比 1 file_get_contents 会为每个请求重新做DNS查询,不会缓存DNS信息。但是 CURL 会自动缓存 DNS 信息。请求同域名下的网页或图片,只需要进行一次DNS查询。这大大减少了 DNS 查询的数量。所以CURL的性能要比file_get_contents好很多。
2 file_get_contents 请求HTTP时,使用http_fopen_wrapper,不keeplive(保持链接状态)。但是卷曲可以。这样,在多次请求多个链接时,curl 的效率会更高。
3 相比file_get_content,curl方法请求更加多样化,比如FTP协议、SSL协议...等资源都可以请求。
总结1 php手册的重要性,有时候你不妨看看手册,不管你看多少资料,对一些功能都有详细的介绍。在开始之前,我不记得 preg_match_all() 会有第四个参数。
2 严格对待代码结构,不能马虎。结构合理,清晰明了,复用率高。
3 真正的知识来自实践,你可以用更多的双手记住它。与其反复打字(请允许我用这个词),不如反复看一遍,这样我们才能记住这个过程的原理。
4 展开,抓取页面包括其子页面的图片,原理是一样的,无非就是在标签的href中找到url进行遍历,然后分别抓取图片...我赢了这里不详述。. 以上是我在拍照过程中的体会。我希望它会对大家有所帮助。如有不对之处,欢迎大家批评指正!