>我的摄影师朋友恳请我从Internet查找和下载图像的图像。最终,我降落在一个免费的网页上,其中有很多免费,但存在一个问题:并不存在将所有图像一起下载的链接。
>我不想经历单独下载图像的压力,所以我写了此PHP课程以查找,下载和zip在网站上找到的所有图像。
>>类使用Symfony的Domcrawler组件来搜索网页上找到的所有图像链接以及创建zip文件的自定义zip函数。借助David Walsh的ZIP功能。
编码类
下面的是类属性及其角色的列表。
2。$ URL:存储网页URL。
3。$ html:存储要刮擦的网页的HTML文档代码。
4。$文件名:存储zip文件的名称。
5。$状态:保存操作的状态。即,如果是成功或失败。
>
>让我们开始建立课程。
创建包含上述五个属性的类Zipimages。
创建一个接受URL作为参数的__ -construct魔法方法。
<span><span><?php </span></span><span><span>class ZipImages { </span></span><span> <span>private $folder; </span></span><span> <span>private $url; </span></span><span> <span>private $html; </span></span><span> <span>private $fileName; </span></span><span> <span>private $status;</span></span>
<span>public function __construct($url) { </span> <span>$this->url = $url; </span> <span>$this->html = file_get_contents($this->url); </span> <span>$this->setFolder(); </span><span>}</span>
默认情况下,文件夹名称设置为图像,但是该方法提供了一个选项,可以通过简单地将文件夹名称作为其参数来更改文件夹的名称。
<span><span><?php </span></span><span><span>class ZipImages { </span></span><span> <span>private $folder; </span></span><span> <span>private $url; </span></span><span> <span>private $html; </span></span><span> <span>private $fileName; </span></span><span> <span>private $status;</span></span>
> setFileName提供了一个选项,可以将eftault名称设置为zipimages更改zip文件的名称:
<span>public function __construct($url) { </span> <span>$this->url = $url; </span> <span>$this->html = file_get_contents($this->url); </span> <span>$this->setFolder(); </span><span>}</span>
<span>public function setFolder($folder="image") { </span> <span>// if folder doesn't exist, attempt to create one and store the folder name in property $folder </span> <span>if(!file_exists($folder)) { </span> <span>mkdir($folder); </span> <span>} </span> <span>$this->folder = $folder; </span><span>}</span>
最后,我们在创建zip文件后删除创建的文件夹。
<span>public function setFileName($name = "zipImages") { </span> <span>$this->fileName = $name; </span><span>}</span>
获得操作的状态。即,如果成功或发生错误。
><span>public function domCrawler() { </span> <span>//instantiate the symfony DomCrawler Component </span> <span>$crawler = new Crawler($this->html); </span> <span>// create an array of all scrapped image links </span> <span>$result = $crawler </span> <span>->filterXpath('//img') </span> <span>->extract(array('src')); </span> <span>// download and save the image to the folder </span> <span>foreach ($result as $image) { </span> <span>$path = $this->folder."/".basename($image); </span> <span>$file = file_get_contents($image); </span> <span>$insert = file_put_contents($path, $file); </span> <span>if (!$insert) { </span> <span>throw new <span>\Exception</span>('Failed to write image'); </span> <span>} </span> <span>} </span><span>}</span>
处理上述所有方法。
<span>public function createZip() { </span> <span>$folderFiles = scandir($this->folder); </span> <span>if (!$folderFiles) { </span> <span>throw new <span>\Exception</span>('Failed to scan folder'); </span> <span>} </span> <span>$fileArray = array(); </span> <span>foreach($folderFiles as $file){ </span> <span>if (($file != ".") && ($file != "..")) { </span> <span>$fileArray[] = $this->folder."/".$file; </span> <span>} </span> <span>} </span> <span>if (create_zip($fileArray, $this->fileName.'.zip')) { </span> <span>$this->status = <span><span><<<HTML</span> </span></span><span>File successfully archived. <a href="<span><span>$this->fileName</span>.zip">Download it now</a> </span></span><span><span>HTML<span>;</span></span> </span> <span>} else { </span> <span>$this->status = "An error occurred"; </span> <span>} </span><span>}</span>
您可以从GitHub下载完整的课程。
<span>public function deleteCreatedFolder() { </span> <span>$dp = opendir($this->folder) or die ('ERROR: Cannot open directory'); </span> <span>while ($file = readdir($dp)) { </span> <span>if ($file != '.' && $file != '..') { </span> <span>if (is_file("<span><span>$this->folder</span>/<span>$file</span>"</span>)) { </span> <span>unlink("<span><span>$this->folder</span>/<span>$file</span>"</span>); </span> <span>} </span> <span>} </span> <span>} </span> <span>rmdir($this->folder) or die ('could not delete folder'); </span><span>}</span>
为了使课程工作,需要包括domcrawler组件和create_zip函数。您可以在此处下载此功能的代码。
>运行$ php composer.phar安装以下载库并生成供应商/autoLoad.php autoLoader文件。
>
使用类<span>public function getStatus() { </span> <span>echo $this->status; </span><span>}</span>
确保通过自动加载或明确包含所有必需的文件。
<span>public function process() { </span> <span>$this->domCrawler(); </span> <span>$this->createZip(); </span> <span>$this->deleteCreatedFolder(); </span> <span>$this->getStatus(); </span><span>}</span>
在本文中,我们学会了如何创建一个简单的PHP图像刮刀,该剪贴画将自动将下载的图像压缩到ZIP档案中。如果您有其他解决方案或改进建议,请将其留在下面的评论中,欢迎所有反馈!!
>
>使用Symfony的Domcrawler组件刮擦图像,您首先需要创建一个新的crawler类的实例,然后将HTML内容加载到其中。然后,您可以使用过滤器方法选择图像元素并提取其SRC属性。这是一个基本示例:
$ crawler = new Crawler($ html);
> $ crawler-> filter-> filter('img') - > every(function(crawler $ node) node-> attr('src');
});
$ node-> attr('src','new-image.jpg');
});在使用Symfony's时如何处理错误和异常Domcrawler组件?
使用Symfony的Domcrawler组件时,可以使用Try-Catch块来处理错误和异常。例如,如果过滤器方法找不到任何匹配元素,它将抛出无效的exception。您可以捕获此异常并适当处理。
我可以使用Symfony的Domcrawler组件来刮擦需要身份验证的网站吗?但是,这需要其他步骤,例如以登录凭据发送发布请求并存储会话cookie。使用Symfony的Domcrawler组件提供的ATTAD方法的值。例如,要提取图像元素的SRC属性,您可以执行以下操作:
不幸的是,Symfony的Domcrawler组件无法直接刮擦Ajax ajax的内容,因为它没有执行JavaScript。但是,您可以将Guzzle和Goutte之类的工具与Domcrawler组件结合使用来发送HTTP请求并处理AJAX负载的内容。
以上是与Symfony的图像刮擦的详细内容。更多信息请关注PHP中文网其他相关文章!