首先需要确保服务器已经安装了CURL扩展。接下来按照以下步骤进行PHP通过CURL实现定时任务的图片抓取功能:
第一步:设置获取的数据URL
首先,需要确定要从哪个URL获取数据。如果目标URL需要进行验证授权才能访问数据,则在此步骤中需要确定相应的验证授权方式,并获取授权信息。
例如,从以下URL获取一张图片:https://www.example.com/image.jpg
第二步:设置CURL选项
接下来,需要设置CURL选项来配置CURL扩展与目标URL交互。例如,设置CURL选项:
// 初始化CURL
$curl = curl_init();
// 设定URL
curl_setopt($curl, CURLOPT_URL, 'https://www.example.com/image.jpg');
// 设定目标文件
$outputFile = '/path/to/save/image.jpg';
$fp = fopen($outputFile, 'w');
curl_setopt($curl, CURLOPT_FILE, $fp);
// 设定超时
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
// 执行CURL
curl_exec($curl);
// 关闭文件句柄和CURL资源
fclose($fp);
curl_close($curl);
此例中,设定CURL选项的代码中,我们使用了curl_setopt()函数来设置CURL扩展的各种选项,比如设置URL、目标文件路径、超时时限等。
代码会将图片保存到指定目录下,由于文件有可能被多次访问(多次执行定时任务),需要为图片文件名添加时间戳或者其他标识符避免图片被覆盖。
第三步:设置定时任务
将以上代码封装到一个PHP文件中,然后可以使用Linux系统的crontab命令或者是Windows系统的任务计划程序来定时调用此文件,并完成图片抓取操作。
例如,将定时任务设置为每天的早晨4点钟执行:
0 4 * * * /usr/bin/php /path/to/file/image_grab.php
此例中,0 4 * * *
表示每天的4点执行,/usr/bin/php /path/to/file/image_grab.php
表示要执行的PHP文件的路径和文件名。
示例说明:
以上过程是一个基本的通过CURL实现定时任务的图片抓取的流程,可以根据具体的需求调整代码和设置。
以爬取百度图片为例,可以参考以下示例说明:
示例1:爬取百度图片榜单图片
首先需要找到终端用户访问的链接,以百度图片的热门“猫咪”的榜单图片为例,可以找到以下链接:https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111111&sf=1&fmq=1592006711200_R&pv=&ic=0&nc=1&z=0&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=猫咪
然后需要分析页面内容,以确定从哪些元素中获取特定的图片链接,可以使用浏览器自带的开发工具分析。
本例中,选择获取每张图片的“data-objurl”属性,使用以下代码爬取:
$url = 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111111&sf=1&fmq=1592006711200_R&pv=&ic=0&nc=1&z=0&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=猫咪';
$outputPath = '/path/to/images/';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
$html = curl_exec($curl);
curl_close($curl);
preg_match_all('/"data-objurl":"(.*?)"/', $html, $matches);
foreach ($matches[1] as $imageUrl) {
$imageData = file_get_contents($imageUrl);
$imageFileName = basename($imageUrl);
file_put_contents($outputPath . $imageFileName, $imageData);
}
示例2:爬取CDN资源
有些资源可能分布在多个CDN,需要循环获取这些资源。
本例中,以pinterest中国站点为例,可以爬取热门推荐图片:https://www.pinterest.cn/
获取方式为在浏览器中查看资源加载情况,分析页面cdn资源发现该站的图片均在以下cdn中:i.pinimg.com、s-media-cache-ak0.pinimg.com、i.pximg.net、64.media.tumblr.com、pinimg.com、source.unsplash.com
将这些域名存储到数组中:
$cdnDomains = [
'i.pinimg.com',
's-media-cache-ak0.pinimg.com',
'i.pximg.net',
'64.media.tumblr.com',
'pinimg.com',
'source.unsplash.com'
];
用以下示例代码实现循环从CDN中获取图片:
$outputPath = '/path/to/images/';
foreach ($cdnDomains as $domain) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://{$domain}/explore/");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
$html = curl_exec($curl);
curl_close($curl);
preg_match_all('/<img.*?src="(.*?)"/', $html, $matches);
foreach ($matches[1] as $imageUrl) {
$imageData = file_get_contents($imageUrl);
$imageFileName = basename($imageUrl);
file_put_contents($outputPath . $domain. "_" . $imageFileName, $imageData);
}
}
以上是一个简单的示例,可以根据需要进行扩展更改,例如:
- 增加异常处理,处理CURL扩展执行时出现的异常错误;
- 增加代理IP,解决反爬虫限制;
- 配置请求头,模拟用户请求;
- 通过数据库记录图片信息,避免获取重复图片等。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP通过CURL实现定时任务的图片抓取功能示例 - Python技术站