上一篇,完成了Windows下PHP多线程扩展pthreads的安装,下面就利用多线程进行图片的采集

一、实现前准备工作

1、打开搜狗图片网站

打开控制台,分析异步请求数据规律

2、搜狗图片存储数据表结构创建

打开搜狗异步请求链接,查看响应结果中的json数据


根据上图中图片详情创建搜狗图片数据表结构sql语句如下:

CREATE TABLE `sougou_pic` (`sougou_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '表主键id',`id` int(11) DEFAULT NULL COMMENT '搜过网站图片id',`did` int(10) DEFAULT NULL,`thumbUrl` varchar(255) DEFAULT NULL,`thumb_width` int(10) DEFAULT NULL,`thumb_height` int(10) DEFAULT NULL,`sthumbUrl` varchar(255) DEFAULT NULL,`sthumb_width` int(10) DEFAULT NULL,`sthumb_height` int(10) DEFAULT NULL,`bthumbUrl` varchar(255) DEFAULT NULL,`bthumb_width` int(10) DEFAULT NULL,`bthumb_height` int(10) DEFAULT NULL,`pic_url` varchar(255) DEFAULT NULL,`width` int(10) DEFAULT NULL,`height` int(10) DEFAULT NULL,`size` int(10) DEFAULT NULL,`ori_pic_url` varchar(255) DEFAULT NULL,`ext_url` varchar(255) DEFAULT NULL,`page_title` varchar(64) DEFAULT NULL,`page_url` varchar(255) DEFAULT NULL,`title` varchar(64) DEFAULT NULL,`tags` varchar(64) DEFAULT NULL,`group_mark` varchar(8) DEFAULT NULL,`group_index` int(10) DEFAULT NULL,`publish_time` int(10) DEFAULT NULL,`surr1` varchar(16) DEFAULT NULL,`surr2` varchar(16) DEFAULT NULL,`category` varchar(16) DEFAULT NULL,`weight` int(10) DEFAULT NULL,`deleted` int(10) DEFAULT NULL,`waplink` varchar(255) DEFAULT NULL,`weblink` varchar(255) DEFAULT NULL,`intime` int(10) DEFAULT NULL COMMENT '添加时间',`pfrom` varchar(255) DEFAULT '',PRIMARY KEY (`sougou_id`)
) ENGINE=InnoDB AUTO_INCREMENT=11088 DEFAULT CHARSET=utf8;

3、录入搜狗图片到数据库

采集代码这里省略,需要注意的是,采集过程中防止超时的存在(主要可能还是搜狗有做简单反爬虫处理),超时采集不到就延时5秒继续采集。

下面是录入完成后数据表一览

二、多线程方式下载数据库中已录入的搜狗图片

1、采用Yii2框架实现

  • Yii2框架控制台(console)下创建命令行可执行脚本文件SougouController.php,代码如下:

<?phpnamespace console\controllers;use yii;
use yii\console\Controller;
use common\models\SougouPic as M;
use common\component\SougouPthreads;
use yii\console\Exception;class SougouController extends Controller
{/*** 下载搜狗图片*/public function actionDownload(){try{$stime=microtime(true);$arrsSougouPic = M::myTables();//3500,6030,9636echo '图片总数量共: '.count($arrsSougouPic).PHP_EOL;//线程池$pool = array();foreach ($arrsSougouPic as $member){$sougou_id = $member['sougou_id'];while (true){if(count($pool) < 5){//要下载的原图$ori_pic_url = $member['ori_pic_url'];$pool[$sougou_id] = new SougouPthreads($member['sougou_id'], $member['size'], $member['title'], $ori_pic_url, $member['width'], $member['height']);$pool[$sougou_id]->start();break;}else{foreach ( $pool as $name => $worker){if(! $worker->isRunning()){unset($pool[$name]);}}}}}$arrsSougouPic = null;echo "Download completed!".PHP_EOL;$etime=microtime(true);//获取程序执行结束的时间$total=$etime-$stime;   //计算差值echo '共运行时间:'.$total.'秒'.PHP_EOL;} catch (Exception $e) {echo '【' , date('H:i:s') , '】', '【系统错误】', $e->getMessage(), "".PHP_EOL;}}}
  • 搜狗多线程类继承线程类,SougouPthreads.php代码如下

<?php
namespace common\component;use Yii;
use Thread;class SougouPthreads extends Thread
{public $running = false;public $sougou_id = '';public $title = '';public $size;public $ori_pic_url = '';public $width = '';public $height = '';protected $saveDir = '';protected $downloadFailedTxt;public function __construct($sougou_id, $size, $title, $ori_pic_url, $width, $height){$this->sougou_id = $sougou_id;$this->size = $size;$this->title = $title;$this->ori_pic_url = $ori_pic_url;$this->width = $width;$this->height = $height;$this->saveDir.='./static/sougouImages/'.date('Y-m-d').'/'.$this->width.'_'.$this->height.'/';$this->downloadFailedTxt = $this->saveDir.'1_downloadfailedlist.txt';if(!is_dir($this->saveDir)){mkdir($this->saveDir, 0777, true);chmod($this->saveDir, 0777);}}public function run(){//下载$return = $this->downloadImage();if (!$return) {echo $this->ori_pic_url.' Download failed'.PHP_EOL;}else{echo $this->ori_pic_url.' Download completed'.PHP_EOL;}}/*** 下载图片* @return bool*/public function downloadImage(){//图片后缀$basename = basename($this->ori_pic_url);$dot = strrpos($basename, '.');$imageExt = substr($basename, $dot);$imageTitle = substr($basename, 0, $dot);if(strlen($this->title)<2){//图片名称$imageName = $imageTitle.'_'.$this->sougou_id;}else{//图片名称$imageName = $this->title.'_'.$this->sougou_id;}$imageName = iconv('UTF-8', 'GBK', $imageName);//保存图片路径及名称$filename = $this->saveDir.$imageName.$imageExt;//判断文件是否已下载if(file_exists($filename)){file_put_contents($this->downloadFailedTxt, $this->ori_pic_url.' --文件已下载'.PHP_EOL, FILE_APPEND);return true;}//获取远程文件$imgContent = $this->myCurl($this->ori_pic_url);if(!$imgContent){return false;}//保存图片到本地$return=file_put_contents($filename, $imgContent);if(!file_exists($filename)){//记录下载失败的图片信息file_put_contents($this->downloadFailedTxt, $this->ori_pic_url.' --下载失败'.PHP_EOL, FILE_APPEND);return false;}//图片大小与录入时记录的图片大小不一致,说明图片下载失败if(filesize($filename) != $this->size){//下载图片不完整,删除unlink($filename);file_put_contents($this->downloadFailedTxt, $this->ori_pic_url.' --下载图片不完整'.PHP_EOL, FILE_APPEND);return false;}return true;}/*** @author RenZhicai <renzhicai.sz@mopon.cn>* 自定义curl请求* @param string $url* @return mixed*/public function myCurl($url=''){$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_TIMEOUT,60);   //只需要设置一个秒的数量就可以if(preg_match('/https:\/\//', $url)){curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //这个是重点。}curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1');$output = curl_exec($ch);if($output === false){//记录curl请求失败的详情$errorInfo = "cURL Error: ".curl_error($ch);file_put_contents('curl_error_'.date('Ymd').'.txt', $errorInfo, FILE_APPEND);}curl_close($ch);return $output;}
}

2、在Yii2项目根目录执行控制台脚本(console)

//将执行结果记录到文本文件中
php yii sougou/download > sougoudownloadinfo.txt

3、下载完后效果一览

自动按尺寸归类图片

【参考资料】

  • PHP Pthread多线程 操作

转载于:https://www.cnblogs.com/renzhicai/p/7863473.html

多线程方式采集搜狗高清壁纸的实现相关推荐

  1. PHP全自动采集在线高清壁纸网站源码

    PHP全自动采集在线高清壁纸网站源码,喜欢就下载吧.这个预览图压了画质 源码简介: PHP全自动采集在线高清壁纸网站源码,PHP全自动采集在线高清壁纸网站源码,一款开源壁纸源码,无需安装.集合360壁 ...

  2. Python爬虫实战 | 利用多线程爬取 LOL 高清壁纸

    来源:公众号[杰哥的IT之旅] 作者:阿拉斯加 ID:Jake_Internet 如需获取本文完整代码及 LOL 壁纸,请为本文右下角点赞并添加杰哥微信:Hc220088 获取. 一.背景介绍 随着移 ...

  3. 多线程下载王者荣耀高清壁纸(过程超详细)

    文章分为单线程和多线程两个部分,选择单线程一个一个下载速度会很慢,多线程下载可以明显提升速度.但先用单线程写出代码,再在此基础上改动成多线程,思路会更加清晰,对初学者也更加友好! 单线程下载王者荣耀壁 ...

  4. python爬虫系列(2):分析Ajax 爬取搜狗高清壁纸

    这次我们来分析一下Ajax(至于Ajax是什么意思请自行百度了,这里就不过多解释),爬取一些高清壁纸,等待下载到本地之后,然后我们再慢慢的筛选这些壁纸.那么这次的目标就是搜狗壁纸,啥1280*720的 ...

  5. 多线程下载王者农药高清壁纸

    ..其实我不喜欢玩王者的,,不过壁纸好看就算了脑部链接 踩点 毕竟企鹅baba的网站,不是那么好爬的..壁纸图片的url并不在网页源代码中,所以通过减缓网页加载速度来得到这些url 藏在了哪里...具 ...

  6. Python带你采集4K高清壁纸,超惊艳

    前言 在找壁纸的时候 无意间逛到一个网站,发现里面的 图都非常精美,吸引我的眼球 于是,我决定用python批量采集一下它 环境使用: Python 3.8 解释器 Pycharm 编辑器 模块 im ...

  7. 爬虫 | 王者荣耀高清壁纸-多线程

    # CY3761 | 2021-11-04 18:23 import json import os import queue import time import urllibimport reque ...

  8. python爬虫--王者荣耀高清壁纸下载(多线程)

    下面的代码是采用多线程的生产者消费者模式,下载速度比之前文章的普通下载快一点. 普通下载的链接:python爬虫–王者荣耀高清壁纸下载 代码在下载方面是没有问题的,可以直接运行,就是在收集打不开链接的 ...

  9. python多线程爬取王者荣耀高清壁纸过程

    多线程与爬虫 目标url json中查找url 访问url 读取json 查看json的list数组 全部图片 粗暴的单线程获取 多线程执行 目标url 查看http://pvp.qq.com/web ...

最新文章

  1. ansible playbook lookups组件
  2. 哈希表处理冲突的方法
  3. 2012-5-3 线程和进程的区别
  4. 天河二号超级计算机拿来玩游戏,“天河二号超级计算机”是我国独立自主研制的超级计算机系统,...
  5. python coding utf-8_【转】怎么在Python里使用UTF-8编码
  6. 从Git的下载到使用github详细教程
  7. 马云在《赢在中国》对创业者的经典点评
  8. SAP License:20个公司绝对不会告诉你的潜规则
  9. 求职互联网数据分析,如何准备行业知识?
  10. C++基础之函数的默认参数,什么是函数默认参数?
  11. android 屏幕录制方案,Android录制屏幕的实现方法
  12. Java fluent风格
  13. 10年专注单片机从业者告诉你如何自制一个属于自己的单片机开发板
  14. ubuntu系统工具记录
  15. 1079:计算分数加减表达式的值
  16. 怎样装系统(附图文教程)
  17. 如何快速实现在网页中调用文档扫描仪 (1)
  18. 永磁同步电机PMSM,异步电机仿真矢量控制
  19. 闲聊Android工程师的职业规划
  20. stata回归表格输出

热门文章

  1. nachos_communicator类的实现
  2. OpenGL实用开源库 汇总
  3. App截图录屏,iPhone用户可以开始瑟瑟发抖了
  4. 服务器客户端配置数据与protobuf数据转换流程操作
  5. 静静观看 莆田系,南方科技大学 钉在耻辱柱上。
  6. 福昕阅读器中书签里面页面跳转保持适合宽度样式
  7. Docker下Nacos持久化配置
  8. redis发布订阅模式详解
  9. 微信小程序的http请求wx.request(实测有效)
  10. 国内真正有技术开发能力的不足200人,区块链是否“只是一种传说”?