C#爬虫小程序-爬取王者荣耀全英雄皮肤

引言

爬虫是一门有趣的技术,它可以让我们感受到程序的魅力,可以极大地提高我们对编程的学习兴趣。接下来用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

结尾

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

版权属于:奇远博客
本文地址:http://oddfar.com/index.php/archives/41/
若无注明,转载请保留文章出处及声明。
Last modification:April 6th, 2020 at 04:58 pm
穷死我了,赏几两碎银子吧

Leave a Comment