引言
爬虫是一门有趣的技术,它可以让我们感受到程序的魅力,可以极大地提高我们对编程的学习兴趣。接下来用C#爬取王者荣耀全英雄皮肤。
获取皮肤列表链接
json数据链接:https://pvp.qq.com/web201605/js/herolist.json
首先我们访问这个链接,就可以获取皮肤列表对应数据
比如我们要查看廉颇的所有皮肤,对应链接如下:
正义爆轰: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)可以找到源码和你所需要的动态库。
直接百度下载文件即可
解决步骤:
- 下载文件
- 引用类库:在VS中点击:项目——添加引用——找到刚才的Newtonsoft.Json.dll
- 开头添加 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]);
}
- 把json数据的"替换成'
不替换会报错,或者自己转义"
string jsonnr = getpvpjson().Replace("\"","\'");
相关json教程:
- 全网最简单的C# json数据解析 无敌菜鸟教程 十分钟搞定json数据解析
https://blog.csdn.net/weixin_39874268/article/details/77302255 - c#解析json字符串处理(最清晰易懂的方法
https://blog.csdn.net/sajiazaici/article/details/77647625
下载图片
请访问下面链接,这里更全
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行的文件目录改成自己想要下载到的目录
运行结果如图
结尾
最后,如果对文中程序有更好的建议,欢迎评论区留言。
怎么收藏这篇文章?