php 抓取网页生成图片(几个(从代码角度)的信息;这里换成data-original属性)
优采云 发布时间: 2021-12-31 09:24php 抓取网页生成图片(几个(从代码角度)的信息;这里换成data-original属性)
今天在浏览简书的时候,发现了几位非常有帮助的摄影师网站。上面的图片很美,萌生了把它们都屏蔽到当地的念头。并且之前也有过爬虫相关的项目,所以总结了一下自己的心得体会,供大家参考。
拍摄图片的过程介绍
抓取图片的方法有很多种,比如:使用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)
下载Img($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属性,只能得到
标签默认显示图片,显然这不是我们需要的,所以匹配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进行遍历,然后分别抓取图片...我不会在这里重复它们。.
以上是我在拍照过程中的体会。我希望它能对大家有所帮助。如有不对之处,欢迎批评指正!