使用 C# 从网页中抓取 JSON
Scrape JSON from webpage with C#
这里是 C# 和 运行 异步任务的新手。
我正在尝试从网站上抓取一些音乐专辑信息。该网页的搜索以明文形式生成了一个 JSON 对象,但我似乎无法访问任何 DOM 信息。这是我尝试过的(使用 HtmlAgilityPack):
using HtmlAgilityPack;
using System;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1 {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
public async Task<String> AlbumScraper(string albumname) {
HtmlWeb web = new HtmlWeb();
string albumurl = Uri.EscapeUriString("https://www.metal-archives.com/search/ajax-album-search/?field=title&query=" + albumname);
Console.Write(albumurl);
var albumdoc = await Task.Factory.StartNew(() => web.Load(albumurl));
string albumjson = "";
if (albumdoc.DocumentNode != null) {
albumjson = albumdoc.DocumentNode.InnerText;
}
return albumjson;
}
private async void Form1_Load(object sender, EventArgs e) {
string rawtext = await AlbumScraper("rust+in+peace");
Console.Write(rawtext);
}
}
}
如何获取生成的 JSON 文本?当我加载 "albumurl" URL...
时,我可以清楚地看到它
可以通过在线工具生成http://json2csharp.com/
然后将生成的 class 添加到您的代码
public class AlbumSearchResponse
{
public string error { get; set; }
public int iTotalRecords { get; set; }
public int iTotalDisplayRecords { get; set; }
public int sEcho { get; set; }
public List<List<string>> aaData { get; set; }
}
将您的回复文本转换为 class
var data = JsonConvert.DeserializeObject<AlbumSearchResponse>(response);
foreach (var item in data.aaData)
{
//do whatever your want with data
}
您还需要从 nuget 添加 newtonsoft json 包才能使 JsonConvert 正常工作
首先你不需要HtmlAgilityPack。
其次,尝试:
using Newtonsoft.Json.Linq;
string albumurl = Uri.EscapeUriString("https://www.metal-archives.com/search/ajax-album-search/?field=title&query=rust+in+peace");
string doc = "";
using (System.Net.WebClient client = new System.Net.WebClient()) // WebClient class inherits IDisposable
{
doc = client.DownloadString(albumurl);
}
然后你可以反序列化它 (@itikhomi)
AlbumSearchResponse data = JsonConvert.DeserializeObject<AlbumSearchResponse>(doc);
您也可以手动解析它
JObject json = JObject.Parse(doc);
string error= Convert.ToString(json["error"]);
. . .
string aaData= Convert.ToString(json["aaData"]);
JArray arr = JArray.Parse(aaData);
foreach(JToken token in arr)
{
string[] strarr = token.ToObject<string[]>();
}
Metal archive 的专辑列表是通过 API 提供的,但专辑的详细信息直接放在 DOM 中。有一个用于金属存档的 .NET 标准包装器库:MetalArchivesNET.
目前只能通过名称查找band/album/song,以后将可以通过url
查找内容
这里是 C# 和 运行 异步任务的新手。
我正在尝试从网站上抓取一些音乐专辑信息。该网页的搜索以明文形式生成了一个 JSON 对象,但我似乎无法访问任何 DOM 信息。这是我尝试过的(使用 HtmlAgilityPack):
using HtmlAgilityPack;
using System;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1 {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
public async Task<String> AlbumScraper(string albumname) {
HtmlWeb web = new HtmlWeb();
string albumurl = Uri.EscapeUriString("https://www.metal-archives.com/search/ajax-album-search/?field=title&query=" + albumname);
Console.Write(albumurl);
var albumdoc = await Task.Factory.StartNew(() => web.Load(albumurl));
string albumjson = "";
if (albumdoc.DocumentNode != null) {
albumjson = albumdoc.DocumentNode.InnerText;
}
return albumjson;
}
private async void Form1_Load(object sender, EventArgs e) {
string rawtext = await AlbumScraper("rust+in+peace");
Console.Write(rawtext);
}
}
}
如何获取生成的 JSON 文本?当我加载 "albumurl" URL...
时,我可以清楚地看到它可以通过在线工具生成http://json2csharp.com/ 然后将生成的 class 添加到您的代码
public class AlbumSearchResponse
{
public string error { get; set; }
public int iTotalRecords { get; set; }
public int iTotalDisplayRecords { get; set; }
public int sEcho { get; set; }
public List<List<string>> aaData { get; set; }
}
将您的回复文本转换为 class
var data = JsonConvert.DeserializeObject<AlbumSearchResponse>(response);
foreach (var item in data.aaData)
{
//do whatever your want with data
}
您还需要从 nuget 添加 newtonsoft json 包才能使 JsonConvert 正常工作
首先你不需要HtmlAgilityPack。
其次,尝试:
using Newtonsoft.Json.Linq;
string albumurl = Uri.EscapeUriString("https://www.metal-archives.com/search/ajax-album-search/?field=title&query=rust+in+peace");
string doc = "";
using (System.Net.WebClient client = new System.Net.WebClient()) // WebClient class inherits IDisposable
{
doc = client.DownloadString(albumurl);
}
然后你可以反序列化它 (@itikhomi)
AlbumSearchResponse data = JsonConvert.DeserializeObject<AlbumSearchResponse>(doc);
您也可以手动解析它
JObject json = JObject.Parse(doc);
string error= Convert.ToString(json["error"]);
. . .
string aaData= Convert.ToString(json["aaData"]);
JArray arr = JArray.Parse(aaData);
foreach(JToken token in arr)
{
string[] strarr = token.ToObject<string[]>();
}
Metal archive 的专辑列表是通过 API 提供的,但专辑的详细信息直接放在 DOM 中。有一个用于金属存档的 .NET 标准包装器库:MetalArchivesNET.
目前只能通过名称查找band/album/song,以后将可以通过url
查找内容