引言

爬虫是一门有趣的技术,它可以让我们感受到程序的魅力,可以极大地提高我们对编程的学习兴趣。接下来用C#爬取王者荣耀全英雄皮肤。

获取皮肤列表链接

json数据链接:https://pvp.qq.com/web201605/js/herolist.json
首先我们访问这个链接,就可以获取皮肤列表对应数据

json预览.png

比如我们要查看廉颇的所有皮肤,对应链接如下:

正义爆轰:http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/105/105-bigskin-1.jpg
地狱岩魂:http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/105/105-bigskin-2.jpg

至于链接怎么获取,规律是啥,这里不再一一讲述
请访问此处 20行Python代码爬取王者荣耀全英雄皮肤 查看

获取json数据

获取网页数据,并转码,代码如下

static string getpvpjson()
{
    WebClient wc = new WebClient();
    wc.Encoding = Encoding.UTF8;//编码转码
    //以字符串的形式返回数据
    string html = wc.DownloadString("http://pvp.qq.com/web201605/js/herolist.json");
    return html;
}

解析json数据

需要借到第三方库解析
Newtonsoft.Json是开源的C#处理json的第三方库
在GitHub(https://github.com/JamesNK/Newtonsoft.Json)可以找到源码和你所需要的动态库。
直接百度下载文件即可


解决步骤:

  1. 下载文件
  2. 引用类库:在VS中点击:项目——添加引用——找到刚才的Newtonsoft.Json.dll
  3. 开头添加 using Newtonsoft.Json

注意事项:

  • json获取数据没有值的话会报错

需要if判断下,代码46行,计算皮肤数量

int skin_num = jn.Length - jn.Replace("|", "").Length ;
skin_num = skin_num + 1;

如果“skin_num”=1的话,表示对应json无“skin_name”的数据

  • 皮肤名字获取就需要用到分割文本了

代码如下:

    string skinname = "恋之微风|万圣前夜|天鹅之梦|纯白花嫁|缤纷独角兽";
    char[] s = new char[] { '|' };
    string[] ad = skinname.Split(s);
    for (int i2 = 0; i2 < ad.Length; i2++)
    {
        Console.WriteLine(ad[i2]);
    }

输出结果
输出结果.png

  • 把json数据的"替换成'

不替换会报错,或者自己转义"

string jsonnr = getpvpjson().Replace("\"","\'");

相关json教程:

下载图片

请访问下面链接,这里更全
C# 下载网页图片 https://blog.csdn.net/linraise/article/details/50603439

完整代码

    using System;
    using System.Net;
    using System.Text;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Linq;
    /**
     *   作者:致远
     *
     *   主页:http:oddfar.com
     *   教程:http://oddfar.com/index.php/archives/41/
    
    */
    namespace pvp
    {
        class Program
        {
            static string getpvpjson()
            {
                WebClient wc = new WebClient();
                wc.Encoding = Encoding.UTF8;
                //以字符串的形式返回数据
                string html = wc.DownloadString("http://pvp.qq.com/web201605/js/herolist.json");
                return html;
            }
    
            
            static void Main(string[] args)
            {
                string ename, cname, skinname, title, purl, shuchu;
    
                string jsonnr = getpvpjson().Replace("\"","\'");
                string mulu = @"E:\C\pvp\";
    
    
                JArray userArry = (JArray)JsonConvert.DeserializeObject(jsonnr);
                //获取树形用户json字符串
                string userList = userArry.ToString();
                //解析用户json信息
                JArray jar = (JArray)JsonConvert.DeserializeObject(userList);
                Console.WriteLine("英雄数量:{0}\n",jar.Count);
                for (int i = 0; i < jar.Count; i++)
                {
    
                    JObject j = JObject.Parse(jar[i].ToString());
                    string jn = j.ToString();
                    int skin_num = jn.Length - jn.Replace("|", "").Length ;
                    skin_num = skin_num + 1;
                    ename = j["ename"].ToString();
                    cname = j["cname"].ToString();
                    title = j["title"].ToString();
                    if (skin_num == 1)
                    {
                        skinname = "null";
                         purl = "http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/" + ename + "/" + ename + "-bigskin-" + 1 + ".jpg";
                         shuchu = cname + "(" + title + ")" + "url:" + purl;
    
                        Console.WriteLine(shuchu+"(下载)");
                        string filepath = mulu + cname +"-"+ title + ".jpg";
                        WebClient mywebclient = new WebClient();
                        mywebclient.DownloadFile(purl, filepath);
    
                    }
                    else
                    {
                         skinname = j["skin_name"].ToString();
    
                        char[] s = new char[] { '|' };
                        string[] ad = skinname.Split(s);
                        for (int i2 = 0; i2 < ad.Length; i2++)
                        {
                            int i3 = i2 + 1;
                             purl = "http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/"+ ename + "/"+ ename + "-bigskin-"+i3+".jpg";
                             shuchu = cname +"("+ ad[i2] + ")"+ "url:"+ purl;
                            Console.WriteLine(shuchu + "(下载)");
                            string filepath = mulu + cname + "-" + ad[i2] + ".jpg";
                            WebClient mywebclient = new WebClient();
                            mywebclient.DownloadFile(purl, filepath);
                        }
    
                    }
                }
            }
        }
    
    
    }

注意把32行的文件目录改成自己想要下载到的目录
运行结果如图

运行结果
效果.png

结尾

最后,如果对文中程序有更好的建议,欢迎评论区留言。

最后修改:2021 年 01 月 12 日 08 : 25 PM
如果觉得我的文章对你有用,请随意赞赏