激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - c#爬蟲爬取京東的商品信息

c#爬蟲爬取京東的商品信息

2022-03-05 17:16alone_alone C#

這篇文章主要給大家介紹了關于利用c#爬蟲爬取京東商品信息的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們隨著小編來一起學習學習吧

前言

在一個小項目中,需要用到京東的所有商品ID,因此就用c#寫了個簡單的爬蟲。

在解析HTML中沒有使用正則表達式,而是借助開源項目HtmlAgilityPack解析HTML。

下面話不多說了,來一起看看詳細的介紹吧

一、下載網頁HTML

首先我們寫一個公共方法用來下載網頁的HTML。

在寫下載HTML方法之前,我們需要去查看京東網頁請求頭的相關信息,在發送請求時需要用到。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public static string DownloadHtml(string url, Encoding encode)
{
 string html = string.Empty;
 try
 {
 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
 request.Timeout = 30 * 1000;
 request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36";
 request.ContentType = "text/html; charset=utf-8";
 using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
 {
  if (response.StatusCode == HttpStatusCode.OK)
  {
  try
  {
   StreamReader sr = new StreamReader(response.GetResponseStream(), encode);
   html = sr.ReadToEnd();//讀取數據
   sr.Close();
  }
  catch (Exception ex)
  {
   html = null;
  }
  }
 }
 }
 catch (System.Net.WebException ex)
 {
  html = null;
 }
 catch (Exception ex)
 {
 html = null;
 }
 return html;
}

如上代碼所示,我們使用WebRequest來獲取網頁信息,在發送請求之前,需要先設置和京東頁面一樣的請求頭。

以上設置的信息比較簡單,但能夠正常發送請求,我們也可以模擬瀏覽器設置cookie等等信息,

二、解析HTML

獲取所有商品的信息分為兩個步驟

    (1)根據商品分類頁面獲取所有商品分類的URL

    (2)根據商品分類URL獲取每個商品

 1、獲取商品分類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
try
{
 string html = HttpHelper.DownloadUrl(@"http://www.jd.com/allSort.aspx");
 HtmlDocument doc = new HtmlDocument();
 doc.LoadHtml(html);
 string goodClass= @"//*[@class='items']/dl/dd";
 HtmlNodeCollection noneNodeList = doc.DocumentNode.SelectNodes(goodClass);
 foreach (var node in noneNodeList)
 {
 HtmlDocument docChild = new HtmlDocument();
 docChild.LoadHtml(node.OuterHtml);
 string urlPath = "/dd/a";
 HtmlNodeCollection list = docChild.DocumentNode.SelectNodes(urlPath);
 foreach (var l in list)
 {
  HtmlDocument docChild1 = new HtmlDocument();
  docChild1.LoadHtml(l.OuterHtml);
  var sortUrl = l.Attributes["href"].Value;
  if (!string.IsNullOrWhiteSpace(sortUrl) && sortUrl.Contains("cat="))
  {
  InsertSort("https:" + sortUrl);
  }
 }
 }
}
catch (Exception ex)
{
 Console.WriteLine(ex.Message);
}

上面的代碼中使用到了HtmlAgilityPack來解析HTML信息,這是.NET的開源項目,開源在nuget包中下載。

      (1)下載http://www.jd.com/allSort.aspx的html頁,然后加載到HtmlDocument

      (2)選擇節點,獲取每個大類的節點集合

      (3)根據每個大類的節點,獲取每個小類的節點信息,然后獲取到分類地址

節點中也包含了其它很多信息,可以根據自己的需求去獲取對應的信息

2、獲取具體商品信息

(1)首先根據商品分類加載分類信息,獲取到當前分類每個頁面的鏈接

下載HTML之后,選擇節點,可以將HTML格式化之后查看每個頁面的url地址和拼接規則,然后借助HtmlAgilityPack

來篩選需要的節點,將每個頁面的url分離出來

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
try
{
 string html = HttpHelper.DownloadUrl(@"https://list.jd.com/list.html?cat=1620,11158,11964");
 HtmlDocument productDoc = new HtmlDocument();
 productDoc.LoadHtml(html);
 HtmlNode pageNode = productDoc.DocumentNode.SelectSingleNode(@"//*[@id='J_topPage']/span/i");
 if (pageNode != null)
 {
  int pageNum = Convert.ToInt32(pageNode.InnerText);
  for (int i = 1; i < pageNum + 1; i++)
  {
   string pageUrl = string.Format("{0}&page={1}", category.Url, i).Replace("&page=1&", string.Format("&page={0}&", i));
   try
   {
    List<ProductInfo> proDuctInfo = GetPageProduct(pageUrl);
   }
   catch (Exception ex)
   {
    Console.WriteLine(ex.Message);
   }
  }
 }
 
}
catch (Exception ex)
{
 Console.WriteLine(ex.Message);
}

(2)根據每個頁面的鏈接,獲取當前頁面的商品信息

下載每個頁面的所有商品信息,需要獲取的商品信息在頁面中都能找到

首先我們獲取到每個商品的節點集合,獲取到一個商品的節點信息之后,分析html數據,

找到我們需要的商品的信息所在的位置,然后將需要的信息分離出來。

下面的代碼中我獲取到的商品的id和title還有價格。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
List<ProductInfo> productInfoList = new List<ProductInfo>();
try
{
 string html = HttpHelper.DownloadUrl(url);
 HtmlDocument doc = new HtmlDocument();
 doc.LoadHtml(html);
 HtmlNodeCollection productNodeList = doc.DocumentNode.SelectNodes("//*[@id='plist']/ul/li");
 if (productNodeList == null || productNodeList.Count == 0)
 {
  return productInfoList;
 }
 foreach (var node in productNodeList)
 {
  HtmlDocument docChild = new HtmlDocument();
  docChild.LoadHtml(node.OuterHtml);
  ProductInfo productInfo = new ProductInfo()
  {
   CategoryId = category.Id
  };
 
  HtmlNode urlNode = docChild.DocumentNode.SelectSingleNode("//*[@class='p-name']/a");
  if (urlNode == null)
  {
   continue;
  }
  string newUrl= urlNode.Attributes["href"].Value;
  newUrl = !newUrl.StartsWith("http:")?"http:" + newUrl: newUrl;
  string sId = Path.GetFileName(newUrl).Replace(".html", "");
  productInfo.ProductId = long.Parse(sId);
  HtmlNode titleNode = docChild.DocumentNode.SelectSingleNode("//*[@class='p-name']/a/em");
  if (titleNode == null)
  {
   continue;
  }
  productInfo.Title = titleNode.InnerText;
  
  HtmlNode priceNode = docChild.DocumentNode.SelectSingleNode("//*[@class='p-price']/strong/i");
  if (priceNode == null)
  {
   continue;
  }
  else
  {
 
  }
  productInfoList.Add(productInfo);
  
 }
 //批量獲取價格
 GetGoodsPrice(productInfoList);
}
catch (Exception ex)
{
}
return productInfoList;

商品的圖片地址和價格信息的獲取需要仔細分析html中的數據,然后找到規律,比如價格在每個節點中就不能單獨獲取。

以下為批量獲取價格的代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
try
   {
    StringBuilder sb = new StringBuilder();
    sb.AppendFormat("http://p.3.cn/prices/mgets?callback=jQuery1069298&type=1&area=1_72_4137_0&skuIds={0}&pdbp=0&pdtk=&pdpin=&pduid=1945966343&_=1469022843655", string.Join("%2C", productInfoList.Select(c => string.Format("J_{0}", c.ProductId))));
    string html = HttpHelper.DownloadUrl(sb.ToString());
    if (string.IsNullOrWhiteSpace(html))
    {
     return productInfoList;
    }
    html = html.Substring(html.IndexOf("(") + 1);
    html = html.Substring(0, html.LastIndexOf(")"));
    List<CommodityPrice> priceList = JsonConvert.DeserializeObject<List<CommodityPrice>>(html);
    productInfoList.ForEach(c => c.Price = priceList.FirstOrDefault(p => p.id.Equals(string.Format("J_{0}", c.ProductId))).p);
   }
   catch (Exception ex)
   {
    Console.WriteLine(ex.Message);
   }
   return productInfoList;

以上就是一個簡單的爬取京東商品信息的爬蟲,也可以根據自己的需求去解析更多的數據出來。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:http://www.cnblogs.com/xxue/p/9977801.html

延伸 · 閱讀

精彩推薦
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
主站蜘蛛池模板: 一级做a爱片久久毛片a高清 | 深夜毛片免费看 | 欧美一级片 在线播放 | 免费观看又色又爽又黄的崩锅 | 青热久思思 | 国产一级伦理片 | 久久噜噜噜精品国产亚洲综合 | 久久免费视频8 | 精品国产一区二区亚洲人成毛片 | 久草免费新视频 | 午夜丰满少妇高清毛片1000部 | 香蕉成人在线视频 | 136福利视频 | av免费入口| 久久久日韩精品一区二区三区 | 久久久久中文字幕 | 日韩精品一区二区三区中文 | 青草伊人网 | 亚洲成a人在线 | chinese hd xxxx tube| 成人一级片毛片 | 亚洲欧美日韩精品久久亚洲区色播 | 高清在线国产 | 日韩欧美高清一区 | 欧美日韩免费一区二区三区 | 99精品国产小情侣高潮露脸在线 | 国产激情精品一区二区三区 | 成人国产精品齐天大性 | 成人毛片一区二区三区 | 国产精品视频一区二区三区四区国 | 色播视频在线播放 | 亚洲国产美女视频 | 亚洲成人中文字幕在线 | 毛片118极品美女写真 | 法国性xxx精品hd专区 | 成年免费看 | 午夜激情视频网站 | 欧美77| 亚洲第一成网站 | 青青久在线视频 | 蜜桃视频在线免费观看 |