发表于 2018-9-19 20:44

申请会员ID:DawnSun

1、申 请 I D:DawnSun
2、个人邮箱:DawnSunlight@163.com
3、原创技术文章:三十多行代码爬取英雄联盟全皮肤图片(附源码和资源)

需要用到的工具:python3或3以上版本解释器、python第三方包:requests、re、json
相信很多人喜欢爬虫,当绕过网站层层的反爬技术,将需要的东西抓取下来的时候,那种喜悦是不可比拟的
而第一次爬取成功肯定也是van分激♂动的。。。。

本次只讲解爬取皮肤图片的过程,安装python解释器、安装第三方包等简易过程不再讲解,对于不懂python的同学,我以后可以写一个图形化界面封装
我们都知道http协议是一次请求,一次响应的过程。所以,想要爬取需要的资源,就要找到相对应的URL
一、寻找图片的URL
1、我们打开英雄联盟游戏资料的官方网站http://lol.qq.com/web201310/info-heros.shtml就可以找到全部的英雄资料
2、一般情况下,前端开发人员为了便于维护网站资源,一般都会将同类资源设置成有规律的URL、英雄联盟也没有例外,
这里我们只找皮肤的URL
3、我们首先看一下狐狸皮肤的URL,可以看到非常有规律性,big以前字符全部一致,后边的001、002、003也看得懂,
中间有一个三位数字不知道是什么东西,好像是一个ID一样的东西,至于是不是,我们暂且不管,可以再查看一个英雄看看有没有这部分
如果都有的话,自己拼接一个URL就可以爬到了呢,嘿嘿嘿。。。。



4、我们再打开金克斯皮肤的URL,可以看到金克斯同志也有同样的部分,所以我们现在要做的就是寻找缺失的这部分ID


二、寻找英雄ID
1、我们首先打开网站的源码看一下,看看能不能试着找出点什么,但是打开之后,发现连皮肤的URL都不见了,
所以我们可以断定,这是动态的网页,所以我们需要回到网站的上一层寻找响应的资源,
2、打开F12检查网络资源,刷新一下,我们可以看到一个champion.js的文件,再看响应的内容,就是我们需要找的英雄ID


3、我们点开Headers,复制URL请求地址



4、开启一个新网页,打开刚才的URL,找到了全部英雄的ID和名字,现在我们要做的就是将URL拼接到一起,
循环一下就有了全部的URL,思路已经很清晰了


三、代码部分
1、我在代码中加了详细的备注,相信有python基础的同志们都可以看得懂,这里只阐述里面用到的主要的方法,和大致的思路
response = request.get(url, params, kwargs)
作用:获取需要网页对象
参数:    url:需要获取的url
本次爬取只用到url,headers=UserAgent两个参数
UserAgent:伪装成浏览器的一种手段
函数返回值response:获取到的对象

response.text:将获取到的网页对象转为字符串
response.content:将获取到的对象转为二进制格式,便于下一步操作
response.status_code:请求状态码

re.findall(pattern, string, flags)
作用:在某一段字符串中根据正则表达式的规则,查找所有符合条件的内容
参数:本次用到pattern:正则表达式, string:目标字符串
返回值:以序列的形式返回匹配到的字符串
本次匹配英雄信息用了一个非(投)常(机)厉(取)害(巧)的正则表达式
var LOLherojs={};LOLherojs.champion={"keys":([\s\S]*?),"data":

下面是完整代码
import requests
import re
import json

def GetHeroId():
    #json的url
    js_url = 'http://lol.qq.com/biz/hero/champion.js'
    #获取返回数据对象
    js_res = requests.get(js_url)
    #转为字符串
    js_res = js_res.text
    #正则表达式
    req = 'var LOLherojs={};LOLherojs.champion={"keys":([\s\S]*?),"data":'
    #全局筛选
    list_js = re.findall(req, js_res)
    # print(type(list_js))
    #将取得的数据转为python字典,便于下一步取值
    dict_js = json.loads(list_js)
    return dict_js
re.f

# getLOLImages()
#UA伪装
head = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}

def GetImage_url():
    #对取到的字典进行循环
    for key, value in GetHeroId().items():
      #循环嵌套,假设每个英雄都有20个皮肤
      for i in range(0,21):
#--------------------------------------------------------------
            '''利用原URL+英雄ID+字符串的方法拼接出皮肤图片的URL'''
            num = str(i)
            id_ = key
            if len(num) == 1:
                num = '00' + str(i)
            elif len(num) == 2:
                num = '0' + str(i)
            name_id = id_ + num
            url = 'http://ossweb-img.qq.com/images/lol/web201310/skin/big' + name_id + '.jpg'
#------------------------------------------------------------------
            #获取皮肤图片的URL对象
            response = requests.get(url, headers=head)
            #打印提示
            print('正在获取%s_%s'%(value, name_id), '..........')
            #判断请求状态是否为200
            if response.status_code == 200:
                #打开文件,利用'英雄名称_ID'(避免文件名重复),以二进制写的方式打开文件
                f = open('LOLimages/%s_%s.jpg'%(value, name_id), 'wb')
                #将图片的二进制写进文件
                f.write(response.content)
                #打印提示
                print('获取%s_%s'%(value, name_id), '成功')
                f.close()


GetImage_url()


2、大致思路:向champion.js发送请求,获取所有json字符串,利用正则表达式,获取英雄信息,转为字典格式
然后拼接完整的URL,为每一个英雄假定为20个皮肤,发送请求,根据请求状态是否为200来判定有多少皮肤
获得皮肤图片二进制代码,写入文件。养成好习惯,不要忘了关闭文件f.close()

最后附上资源链接链接: https://pan.baidu.com/s/1iOjClHgCmPYkys0phWXFzg提取码:1wnx

求进组织!求上进!

Hmily 发表于 2018-9-20 17:26

过程有些简单,再提供一些含金量比较高的技术文章吧。

JieW_L 发表于 2018-9-20 22:15

这个扒到的和客户端里面的应该不一样吧,我记得,客户端原画有的有几兆

发表于 2018-9-21 09:52

看来要祭出我的12306抢票爬虫了{:301_1000:}
页: [1]
查看完整版本: 申请会员ID:DawnSun