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

引言

         基于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

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
这是视觉中国官方(shijue.me)提供的扩展,可以让你浏览网站时方便分享或收藏喜欢的图片,扩展提供了鼠标右键单击分享、网页截图到视觉中国(shijue.me)上的快捷功能。 视觉中国图片分享工具 这是视觉中国官方(shijue.me)提供的扩展,可以让你浏览网站时方便分享或收藏喜欢的图片,扩展提供了鼠标右键单击分享、网页截图到视觉中国(shijue.me)上的快捷功能。 “shijue.me 视觉中国”是中国最具活力的视觉图片分享社区及创意设计产品社会化电商平台。依托独特的创意生态理论,为原创者和消费者提供一个互动沟通的社区,发现原创、发现美丽,收获并分享美好的创意体验。 秉承了优质的创意资源和纯正的社区血脉,全新的“shijue.me 视觉中国”愿意和您一起,用创意和想象力,重新发现一个美丽的新世界! 这里是一个关于灵感和创意的好玩的全栖互动社区,你可以在里: 分享好看的图片找到品味同好、发表原创的作品获得更多成名的机会、编辑精彩的内容和大家分享你的奇闻乐事;上传你的奇思妙想,便可以在这里找到从前期到最终、从灵感到最终的盈利的所有通经,我们帮你将它变成商品,并通过为你铺设好的渠道实现盈利;你可以买到充满创意的原创产品,并可以和它的设计师进行互动;你还可以在这里找到很多趣味相投的朋友,组合线下聚会活动;这里更是一个显现企业和品牌形象的地方。总之只要是和视觉、创意有关的想法,都可以在这里找到归属! == cvshare - 1.0.5 released 2012/11/04 - 修复标签分享,重复的bug. == cvshare - 1.0.4 released 2012/10/22 - 修复截图分享,URL编码bug - 新增截图分享后,查看按钮功能 == cvshare - 1.0.0 released 2012/10/20 - 鼠标右键分享功能 - 网页标签分享功能 - 多(组)图分享功能 - 网页可视区域、区域选择、整个网页截图分享功能 支持语言:English,中文 (简体)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值