使用 C# HTMLAGILITYPACK 从网站抓取动态数据
Scrape Dynamic Data from Website Using C# HTMLAGILITYPACK
我正在使用 HTMLAGILITY Pack 抓取数据,但页面加载不正确。
我需要我的代码应该等到页面完全加载。
在表单中使用浏览器有一些变通方法,但我不需要在表单中使用它。
这是我需要废弃的 Link 下面是我的代码。
HtmlWeb web = new HtmlWeb();
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
HtmlAgilityPack.HtmlDocument doc = web.Load(website);
var goldTypes = doc.DocumentNode.SelectNodes("//h2[@class='gold-box-title']").ToList();
var goldPrices = doc.DocumentNode.SelectNodes("//span[@class='gold-box-price--sale'").ToList();
for (int i = 0; i < 2; i++)
{
string goldPrice = goldPrices[i].InnerText;
string goldType = goldTypes[i].InnerText;
}
你是对的,在 "buyable-gold" 元素的“:buyable”属性中,所有数据都以结构化 json 的形式提供。
我做了一个快速测试,这应该是你想要的。这将为您提供包含所需数据的结构化对象列表。
HtmlWeb web = new HtmlWeb();
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
HtmlAgilityPack.HtmlDocument doc = web.Load("https://www.ezrsgold.com/buy-runescape-gold");
var buyGoldNodes = doc.DocumentNode.SelectNodes("//buyable-gold");
var buyableJsonList = buyGoldNodes.Select(x => HttpUtility.HtmlDecode(x.Attributes[":buyable"].Value)).ToList();
var buyables = buyableJsons.Select(x => JsonConvert.DeserializeObject<Buyable>(x)).ToList();
然后您的 Buyable class 看起来像这样。
public class Buyable
{
public int id { get; set; }
public string sku { get; set; }
public int game_id { get; set; }
public string title { get; set; }
public int min_qty { get; set; }
public int max_qty { get; set; }
public string base_price { get; set; }
public string sale_price { get; set; }
public Bulk_Price[] bulk_price { get; set; }
public string delivery_time { get; set; }
public string description { get; set; }
public object sort_order { get; set; }
public string created_at { get; set; }
public string updated_at { get; set; }
public string price { get; set; }
public bool on_sale { get; set; }
public int discount_from { get; set; }
}
public class Bulk_Price
{
public string qty { get; set; }
public string price { get; set; }
}
我正在使用 HTMLAGILITY Pack 抓取数据,但页面加载不正确。
我需要我的代码应该等到页面完全加载。
在表单中使用浏览器有一些变通方法,但我不需要在表单中使用它。
这是我需要废弃的 Link 下面是我的代码。
HtmlWeb web = new HtmlWeb();
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
HtmlAgilityPack.HtmlDocument doc = web.Load(website);
var goldTypes = doc.DocumentNode.SelectNodes("//h2[@class='gold-box-title']").ToList();
var goldPrices = doc.DocumentNode.SelectNodes("//span[@class='gold-box-price--sale'").ToList();
for (int i = 0; i < 2; i++)
{
string goldPrice = goldPrices[i].InnerText;
string goldType = goldTypes[i].InnerText;
}
你是对的,在 "buyable-gold" 元素的“:buyable”属性中,所有数据都以结构化 json 的形式提供。
我做了一个快速测试,这应该是你想要的。这将为您提供包含所需数据的结构化对象列表。
HtmlWeb web = new HtmlWeb();
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
HtmlAgilityPack.HtmlDocument doc = web.Load("https://www.ezrsgold.com/buy-runescape-gold");
var buyGoldNodes = doc.DocumentNode.SelectNodes("//buyable-gold");
var buyableJsonList = buyGoldNodes.Select(x => HttpUtility.HtmlDecode(x.Attributes[":buyable"].Value)).ToList();
var buyables = buyableJsons.Select(x => JsonConvert.DeserializeObject<Buyable>(x)).ToList();
然后您的 Buyable class 看起来像这样。
public class Buyable
{
public int id { get; set; }
public string sku { get; set; }
public int game_id { get; set; }
public string title { get; set; }
public int min_qty { get; set; }
public int max_qty { get; set; }
public string base_price { get; set; }
public string sale_price { get; set; }
public Bulk_Price[] bulk_price { get; set; }
public string delivery_time { get; set; }
public string description { get; set; }
public object sort_order { get; set; }
public string created_at { get; set; }
public string updated_at { get; set; }
public string price { get; set; }
public bool on_sale { get; set; }
public int discount_from { get; set; }
}
public class Bulk_Price
{
public string qty { get; set; }
public string price { get; set; }
}