引言

基于Pyside2开发可视化程序界面,抓取高清图片的小工具。用户可以通过输入要查找图片的名称,和需要抓取多少页进行下载到本地上,每一页的图片数量是根据网站的提供来决定的,当前对版权保护日益严格,因此在此说明爬取的图像仅用于个人学习使用,禁止用作商用目的。

项目架构

        

程序运行起来,只有一个UI主进程,在初始化的时候创建一个子线程,用于和待开启的子进程(点击下载按钮后,就会开启一个子进程完成事务)交换进程间的数据 。只有在用户点击下载按钮后,子进程才会被创建和开启,子进程又开启一个子线程,解析网页数据并拿到所有的图片url,下载所有的图片保存到本地,整个进程随时都有可能被UI主进程结束。

  1. 打印消息队列

    1. 比如子进程中的子线程,如果有消息要打印到UI,消息先从该子线程传递到主线程(queue.Queue),然后主线程在while循环判断到该队列不为空时,就取出信息放到用于进程间通信的打印消息队列(multiprocessing.Queue);
    2. UI子线程while循环判断到打印消息队列不为空,就取出消息并发送signal信号,通知UI主线程响应对应的槽函数,把消息加载到UI。
  2. 下载进度队列
    1. 在下载图片过程中,更新下载的数量状态放到该队列;
    2. 先是主线程从queue.Queue中取出状态,放到multiprocessing.Queue;
    3. 然后UI子线程从多进程队列取出状态,发送signal信号,通知UI主线程响应对应的槽函数更新进度条的状态。
  3. 下载完成队列
    1. 在子线程中执行全部下载并保存图片到本地上后,把下载完成的提示消息放进主线程(queue.Queue);
    2. 然后主线程在while循环判断到该队列不为空时,就取出信息放到用于进程间通信的打印消息队列(multiprocessing.Queue);

查看网页源代码

目标网站:视觉中国旗下网站

打开浏览器进入网站,右击鼠标有个查看网页源代码的功能(Ctrl+U),我们眼前就会看到密密麻麻的的信息,这些信息也是我们要抓取图片的重要信息。

如果记得这样看起来不舒服,还有一个方法,回到进来网站后,右击鼠标的操作,点击检查功能,这样就很好的帮我们定位图片的位置,同样可以清晰看到图片格式长什么样子

开始解析网页的数据

当我们知道图片url格式后,现在就进行对网页上数据解析,把我们想要的图片url提取出来,最重要一点是,要明白知道什么数据是我们想要的,什么数据是不想要的。

设置请求头

        headers是解决requests请求反爬的方法之一,相当于我们进去这个网页的服务器本身,假装自己本身在爬取数据。对反爬虫网页,可以设置一些headers信息,模拟成浏览器取访问网站 。

self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, \like Gecko) Chrome/94.0.4606.61 Safari/537.36"}

网址格式

page:表示页数

keyword_trans_pinyin:表示汉字转拼音

url="https://www.vcg.com/creative-image/{0}/?page={1}".format(keyword_trans_pinyin,str(page))

为什么转成拼音?

首先,我们先进去网站搜下图片,看它的网址格式是怎么样

很清楚看见,图片名称是通过我们输入的关键字转成拼音拼接的,然而,我们也希望程序也是跟浏览器一样,所以我这里就用Python的xpinyin库来实现汉字转拼音效果。

from xpinyin import Pinyin
pinyin = Pinyin()
res = pinyin.get_pinyin('中国','')
print(res) # zhongguo

提取图片url

使用tree.xpath提取data-src数据,返回是一个列表,这里就不再对一一详细讲了,想了解更多直接上网搜。

tree.xpath('//div[@id="root"]//div[@class="gallery_inner"]//figure/a/img/@data-src')

下载图片并保存到本地

当我们已经拿到所有的图片url后,就会发现,图片url都没有https请求头

# 图片url
//alifei03.cfp.cn/creative/vcg/nowarter800/version21/VCG21gic20084438.jpg

没有请求头就无法下载图片,我就直接把https和图片url拼凑起来,返回一串新的图片url字符串通过输入到浏览器,访问有效。

最后,使用urllib.request.urlretrieve方法把所有的图片保存到本地上

urllib.request.urlretrieve(url, filename=None, reporthook=None, data=None)

传输说明:

url:外部或者本地url
               filename:指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);

reporthook:是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函数来显示当前的下载进度。

data:指post到服务器的数据。该方法返回一个包含两个元素的元组(filename,headers),filename表示保存到本地的路径,header表示服务器的响应头。

运行程序

前提准备:电脑有安装python3.9+,支持Windows/Linux

依赖库:pip install PySide2

运行脚本:python ui_main.py

抓取图片的效果图

具体代码

 链接:https://pan.baidu.com/s/1_7kjwmNQGPe52wcfEAvWjQ 
        提取码:linv

今天就先到这里啦,如果对你有帮助的,赶紧收藏下来吧!觉得代码哪里有问题或者有建议的,都可以打在评论上,我会留意的,互相学习,互相探讨,你我皆黑马。

基于urllib抓取视觉中国旗下网站的高清图片相关推荐

  1. 一键爬取王者荣耀全皮肤高清图片【方法一】

    文章目录 前言 一.爬虫是什么? 二.使用步骤 1.引入库 2.访问的URL 3.爬取思路 三.皮肤URL(需要手动找出) 完整代码 四.效果展示 总结 前言 相信很多小伙伴们都喜欢玩王者荣耀这款MO ...

  2. scrapy图片爬取(爬取站长素材中的高清图片)

    - ImagesPipeline:-只需要将img的src的属性值进行解析,提交到管道,管道就会对图片的src进行请求发送获取图片的二次请求 -需求:爬取站长素材中的高清图片-使用流程:-数据解析(图 ...

  3. python爬取王者皮肤_Python爬取王者荣耀英雄皮肤高清图片

    前言 临下班前,看到群里有人在讨论用王者农药的一些皮肤作为电脑的壁纸,什么高清的,什么像素稍低的,网上查了一手,也有,但像素都不一样,所以,我就想着,自己去官网直接爬他的高清皮肤就好了,然后就有了这边 ...

  4. 收藏这几个免版权高清图片搜索网站,找高清图片素材更方便

    对于一些做设计或者自媒体的同学,有时候需要查找一些高清图片素材,网上直接搜索下载使用会存在一些版权的问题.而到免版权高清图片素材网站查找图片就可以自由地使用,不同担心版权问题.免版权高清图片网站比较多 ...

  5. 壁纸网站的高清图片,完美符合视觉控的你!

    一张符合心意的壁纸,特别是高质量的高清壁纸,能在哪里找到呢? 简单舒服的壁纸下载网站,高图网 www.gaopic.com 以搜索功能为主.如果你喜欢狗狗,就搜索 dog,在其中找到你喜欢的内容,并且 ...

  6. 一键爬取王者荣耀全皮肤高清图片【方法二】

    爬取王者荣耀官网皮肤[爬虫] 上次我们讲了爬虫的定义以及爬取王者荣耀皮肤的思路. 今天我们换一种方式来爬取同样的内容.大体上思路和方法一相同. 方法一传送门:方法一 方法二 # 网址:https:// ...

  7. python数据分析实例:python抓取课工厂网站数据和分析

    在线教育网站学习,是很多人利于闲余时间进行充电的一种选择.本篇文章利用python抓取在线教育网站课工场课程页面的数据,进行简要分析. 通过使用requests库对课工场课程列表页进行抓取. 通过Be ...

  8. CasperJS基于PhantomJS抓取页面

    CasperJS基于PhantomJS抓取页面 Casperjs是基于Phantomjs的,而Phantom JS是一个服务器端的 JavaScript API 的 WebKit. CasperJS是 ...

  9. Python爬虫抓取某音乐网站MP3(下载歌曲、存入Sqlite)

    Python爬虫抓取某音乐网站MP3(下载歌曲.存入Sqlite) 最近右胳膊受伤,打了石膏在家休息.为了实现之前的想法,就用左手打字.写代码,查资料完成了这个资源小爬虫.网页爬虫, 最主要的是协议分 ...

最新文章

  1. 学多少返多少 | 人工智能核心课零门槛就业涨薪培养计划
  2. 那些 Linux 下好用的 小工具 收集
  3. mycat读写分离部署步骤
  4. Java LinkedList void add(int index,Object o)方法,带示例
  5. 合并石子(信息学奥赛一本通-T1274)
  6. chrome linux添加图标,分享|在 Linux 下体验谷歌 Material风格的GTK和图标主题Paper
  7. ffmpeg 2.6.3在Windows系统MinGW的编译
  8. 简易封装手机浏览器touch事件
  9. Linux版本跟Hadoop版本,Hadoop本地库与系统版本不一致引起的错误解决方法
  10. 如何查看Hive版本
  11. 接触到的加密算法MD5、SHA1(转)
  12. 学写网站(二)前端配置之glup
  13. 高等数学学习笔记——第十八讲——函数连续的概念
  14. CSS简易导航列表样式
  15. 课程表里的表表机器人_酷Q机器人课程表查询插件 QianSW.Com系列插件
  16. Office办公软件测试题
  17. Windows Server 2012R2 虚拟专用网络技术
  18. 政治正确的睡前故事(4则)【搬运】【破事水】
  19. 2022.03全国青少年软件编程(图形化)等级考试试卷(四级)
  20. 关于ADC输入前级的抗混叠滤波器问题以及驱动负载电容的电阻值选择建议

热门文章

  1. iPhone 第四代今天发布啦
  2. MySQL安装版安装与配置图解
  3. 艾美捷魔力红组织蛋白酶B活性分析试剂盒研究手册
  4. Cadence OrCAD capture SCH package
  5. python安装wxpython框架错误
  6. 技术共享之常见的6中种方法检测手机是否是虚拟机
  7. C语言 不完全类型
  8. 设备英文有多少种叫法?
  9. 详述微信域名链接防封短链接是怎么生成的,怎样防止域名被微信拦截
  10. PostgreSQL 图式搜索(graph search)实践 - 百亿级图谱,毫秒响应