绪论

网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。所以用python进行网络爬虫是简单且快捷的。

需求分析

本次的练习是为了爬取王者荣耀官网中高清壁纸。

图一:王者荣耀截图

如截图所示,每页的高清图片有20张,一共有21页。目的就是将这21页工400多张高清图片利用python批量下载。

爬虫流程:

在这里插入图片描述

网页分析

在抓取图片前是对这些图片进行分析,目的就是为了获取图片的URL。

在王者荣耀官网,按下F12调出元素属性,我的浏览器是FIREfox。如下图所示,可以看到一张壁纸有不同的尺寸.

在这里插入图片描述

这些url都大同小异:

[图片上传失败...(image-e8c67d-1582181461614)]

列出两种尺度的url如下:

http://shp.qpic.cn/ishow/2735011316/1578903461_84828260_30369_sProdImgNo_3.jpg/0

http://shp.qpic.cn/ishow/2735011316/1578903461_84828260_30369_sProdImgNo_2.jpg/0

由此乐意看出其不同尺度图像的区别只有ProdImgNo_2和ProdImgNo_3的区别。王者荣耀官网提供了7种不同的尺度。

[图片上传失败...(image-41b6b9-1582181461614)]。

根据以往的爬取经验,网站的图片url不会放在源代码中,而是放在某个数据文件中,或者在某个文件中包含了构成url文件的信息,需要自己将这些文件组合起来构成完整的图片url。

所以,下一步就是查询图片的信息所包含的文件。在firefox中有一个网络选项,点击就可以查看图片相关信息。

[图片上传失败...(image-c0b060-1582181461614)]

在消息头中包含着图像请求网址,例如:

http://shp.qpic.cn/ishow/2735011316/1578903461_84828260_30369_sProdImgNo_2.jpg/0

[图片上传失败...(image-f4c3b5-1582181461614)]

每一张图片最特殊的就是最后如图蓝色线划出来的,每一张图都不一样。也就是

/2735011316/1578903461_84828260_30369_sProdImgNo_2.jpg/0

这样的图片名回报存在某个文件中,所以接下来就是找到这个文件。复制这个文件的某个数字如1578903461在调试器中搜索。

[图片上传失败...(image-b60842-1582181461614)]

包含图像url的文件,但是不方便查看,所以换种方式查兰

[图片上传失败...(image-b0b639-1582181461614)]

在搜索结果页面中点左键获取源地址网址如下:

https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page=0&iOrder=0&iSortNumClose=1&jsoncallback=jQuery17102680533382681486_1582174063967&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=1582174064247

这个网址的结果是:

[图片上传失败...(image-8d815f-1582181461614)]

这个网页中等于一页的20张图片,并且包含了7种不同的尺寸。但是这不能直接用,因为官方对其图片网址进行了编码,所有的特殊符号都变成了十六进制。所以对这些图片进行解码才能图片链接解码的python代码如下:

import urllib.parse

url='http%3A%2F%2Fshp%2Eqpic%2Ecn%2Fishow%2F2735092412%2F1569299550%5F84828260%5F31469%5FsProdImgNo%5F4%2Ejpg%2F200'

image_none=urllib.parse.unquote(url,'utf-8')#解码

#结果:

>>>'http://shp.qpic.cn/ishow/2735092412/1569299550_84828260_31469_sProdImgNo_4.jpg/200'

仔细观察这一个图像的URL,在浏览器中打开得到的图像很小,别提什么高清了。

[图片上传失败...(image-c384c0-1582181461614)]

经过对网页源代码的分析:

在网页源代码可以看到这样一段代码:

[图片上传失败...(image-1ba483-1582181461615)]

所以需要使用0代替掉图像url尾部的200结果就是正常的高清图片了。

'http://shp.qpic.cn/ishow/2735092412/1569299550_84828260_31469_sProdImgNo_4.jpg/200'

替换为

'http://shp.qpic.cn/ishow/2735092412/1569299550_84828260_31469_sProdImgNo_4.jpg/0'

就此,通过上述步骤可获取了一页中20张壁纸的url。可以写一个简单的代码去爬取这一页的壁纸如下:

#导入库

import requests

from bs4 import BeautifulSoup as BS

import re

import urllib.request

import urllib.parse

import os

import json

import csv

from datetime import datetime

import time

#下载链接

r=requests.get('https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page=1&iOrder=0&iSortNumClose=1&jsoncallback=&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=').text

#网页解析出一张图片的url,这里我只下载尺寸为1920×120的图片。

image_ur=set()

image_list=re.compile('(http(%\w*)*)').findall(r)

for i in image_list:

image_none=urllib.parse.unquote(i[0],'utf-8')

image_none=re.sub('sProdImgNo_[0-9]','sProdImgNo_7',image_none)

image_ur.add(re.sub('200','0',image_none))

#保存图像

num=100

for i in image_ur:

with open('F://wz/'+str(num)+'.jpg','wb') as f:

r=requests.get(i)

if r.status_code==200:

f.write(r.content)

print('{}finish'.format(num))

num+=1

[图片上传失败...(image-380b9d-1582181461615)]

所以只要有一个图像源网址就能下载一页的壁纸

https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page=0&iOrder=0&iSortNumClose=1&jsoncallback=jQuery17102680533382681486_1582174063967&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=1582174064247

但是20页每次都得重新去获取,明显称不上自动,更别说20页还是有点麻烦。接下来的工作就是考虑如何生成源网址。

经过通过对多页源网址比较,并分析相关的js代码,找出的规律如下:

page_3=https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page=3&iOrder=0&iSortNumClose=1&jsoncallback=jQuery17109236554684578916_1581341758935&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=1581342827129

page_8=https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page=8&iOrder=0&iSortNumClose=1&jsoncallback=jQuery17109236554684578916_1581341758931&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=1581341852604

page_9=https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page=9&iOrder=0&iSortNumClose=1&jsoncallback=jQuery17109236554684578916_1581341758932&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=1581341854233

有变化的参数有三个page、jsoncallback以及最后的。经过分析,page是对应每一页的序号。下划线是一个时间戳,jsoncallbac是一个随机产生数字。经过测试删掉_和jsoncallback参数依旧能正常访问源网址。所以只需亚搜修改page的值就能获得对应的页源网址如下:

https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page=1&iOrder=0&iSortNumClose=1&jsoncallback=&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_='

jsoncallback和_的值留空白就行。由此就能构建了完整的图像url。

使用正则表达式除了源网址获得url

获得了url后需要下载网页并对其进行分析。因为一个源网址中包含7种尺寸的图像,我只需要最大的即1920×1200.

再次之前需要安装一些python库:

requests库用于请求网址,并下载图片,相关库的用法请参考这里

上述的一页图片下载代码中:

#r是源网址使用requests模块下载

r=requests.get('https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page=1&iOrder=0&iSortNumClose=1&jsoncallback=&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=').text

#提取出每一张图片的url

image_ur=set()#用于去重

image_list=re.compile('(http(%\w*)*)').findall(r)#用正则表达式提取出每一张图片。

for i in image_list:#遍历每一条url将所有的尺寸替换为sProdImgNo_7即1920×1200并去重

image_none=urllib.parse.unquote(i[0],'utf-8')

image_none=re.sub('sProdImgNo_[0-9]','sProdImgNo_7',image_none)

image_ur.add(re.sub('200','0',image_none))#将200用0替代。

如果不明白正则表达式的用法见此

保存图像

获得图像url后要下载并保存。因为requests.get().content是获得二进制模式,所以可以下载后直接保存为jpg格式,如果有好的方式也请多指教。

#保存图像

num=100

for i in image_ur:

with open('F://wz/'+str(num)+'.jpg','wb') as f:

r=requests.get(i)

if r.status_code==200:

f.write(r.content)

print('{}finish'.format(num))

num+=1

print('完成{}的下载'.format(i))

以上就完成了所有的王者荣耀高清壁纸的下载。完整的批量下载代码见此

代码

python手机壁纸超清_Python爬虫-王者荣耀高清壁纸下载相关推荐

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

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

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

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

  3. python爬虫王者荣耀高清皮肤大图背景故事通用爬虫

    wzry-spider python通用爬虫-通用爬虫爬取静态网页,面向小白 基本上纯python语法切片索引,少用到第三方爬虫网络库 这是一只小巧方便,强大的爬虫,由python编写 主要实现了: ...

  4. 爬虫 | 王者荣耀高清壁纸-单线程

    # CY3761 | 2021-11-04 11:45# 把请求事务等封装成函数 一步步进行 import json import os import time import urllib.parse ...

  5. python爬虫王者荣耀高清壁纸

    # run.py import re, os, time, json, requests from urllib.parse import unquote import concurrent.futu ...

  6. python爬虫练习高清壁纸【王者荣耀高清壁纸】python爬虫

    python爬虫练习高清壁纸[王者荣耀高清壁纸] 仅做练习使用,各位小伙伴不用乱来!!! 现成的代码,直接拿走研究,已经精简了自行美化 页面自己去分析分析 ,学习效果更佳. import reques ...

  7. python爬取王者_python 爬取王者荣耀高清壁纸

    一.前言 打过王者的童鞋一般都会喜欢里边设计出来的英雄吧,特别想把王者荣耀的英雄的高清图片当成电脑桌面 预览一下桌面吧: 是不是看着这样的桌面也很带感,_ (学会这个技术,你可以爬取其他网站的类似图片 ...

  8. python 爬取王者荣耀高清壁纸

    代码地址如下: http://www.demodashi.com/demo/13104.html 一.前言 打过王者的童鞋一般都会喜欢里边设计出来的英雄吧,特别想把王者荣耀的英雄的高清图片当成电脑桌面 ...

  9. 爬取王者荣耀高清皮肤

    爬虫中使用多线程爬虫是一种很常见的方式,可以提高爬取的效率,特别是生产者消费者模型也经常可以见到,今天刚好学习了这种模式,爬取下王者荣耀的高清壁纸,作为练习 import requests from ...

最新文章

  1. 澳洲 计算机 本科学费,澳大利亚墨尔本大学一年学费和生活费清单
  2. 【☀️~爆肝万字总结递归~❤️玩转算法系列之我如何才能掌握递归解题的能力❤️~十大经典问题助你突破极限~建议收藏☀️】
  3. [deviceone开发]-do_QRCode的简单示例
  4. mysql dba管理_Mysql DBA 高级运维学习之路-mysql数据库常用管理应用
  5. oracle to pgsql,PostgresToOracle
  6. FastJSON的依赖
  7. 【linux】linux命令如何查看文件、文件夹的属性,包括大小、修改时间、谁修改的...
  8. 推荐曹济的FPA培训课程
  9. 【项目管理】敏捷和Scrum
  10. springboot公共模块打包_SpringBoot多模块项目打包方法(jar和war)
  11. 《Hierarchical Attention Network for Document Classification》—— 用于文本分类的层次注意力网络
  12. (2)树莓派挂载外部硬盘
  13. 1.3计算机硬件的主要指标
  14. blender怎么移动骨骼_宝宝偏头怎么办?千万别错过这个矫正“黄金期”!
  15. oracle一对多个值,Oracle一张表中实现对一个字段不同值和总值的统计(多个count)...
  16. Modelsim调用用do脚本自动化仿真
  17. EIQ分析法_配送中心
  18. 以教务管理的成绩单查询为例,SSM整合开发过程详解(spring、springmvc、mybatis)
  19. 商店英雄显示无法连接服务器,商店英雄攻略 新手常见问题FAQ汇总[视频][多图]...
  20. 手把手教你使用wordPress+阿里云虚拟主机搭建个人博客

热门文章

  1. 微信公众号接口类(PHP版本)
  2. Swiperjs插件轮播滑动卡顿优化
  3. MacBook Pro USB口可以识别U盘却不能识别手机?
  4. 推荐免费的文本编辑工具
  5. STM32片内FLASH烧写错误导致ST-LINK烧录不进程序的问题解决过程
  6. 项目设计Andriod部分-做一个学习类App-1
  7. CET6 2017.12.2
  8. 离散数学复习:命题逻辑的推理理论
  9. stm32f407zg跟ze的区别_STM32各系列比较:F1-F2-F4.pdf
  10. sougou linux 无法切换中英文,Ubuntu 16.04安装GoLand后不能切换到搜狗输入法