版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、東商城商品價格獲取方法在我看來,現(xiàn)在電子商務(wù)市場做得最紅火的兩個網(wǎng)站,當(dāng)屬于淘寶和京東了,淘寶對我們來說又太雜了,而京東往往是我們最關(guān)注的電子商務(wù)網(wǎng)站!在易淘事件過后,京東國美等網(wǎng)購商城的價格往往成為人們非常關(guān)注的問題,為了防止易淘的扒取數(shù)據(jù),他們的價格都做成了圖片的格式。在此之前我已經(jīng)寫過了一個 簡單圖片識別的技術(shù)博客,其中我提出了一種獲取京東商城價格的方法,今天我針對京東商城的價格專門做了研究,找到了三種方式來解決這個問題。第一,上次的圖片識別的方法第二,利用Cookie的方法第三,通過京東手機商城的頁面獲取具體的見程序源代碼就可以了using System;using Syst
2、em.Collections.Generic;using System.Text;using System.Drawing;using System.Net;using System.Web;using HtmlAgilityPack;using System.Text.RegularExpressions;using System.IO;namespace Pmars class JingDong /得到京東頁面的編碼格式 static Encoding encoding = Encoding.GetEncoding("gb2312"); /如果知道某件商品的ID,我們?nèi)?/p>
3、何得到這件商品的價格 public static double GetPrice(string id) double price = 0; /第一種方式 /詳細(xì)查看以前發(fā)過的圖片識別的博客,利用識別京東價格圖片的方法去獲得商品的價格 price = GetPriceByImage(id); /第二種方式 /雖然京東的價格被做成了圖片的模式,但是,在購物車或者在結(jié)算的時候的價格不是圖片的 /這樣我們就可以想辦法得到那里的價格就可以了 /實驗證明,在獲得購物車或者結(jié)算時的頁面需要cookie /那么,我們可以去下載另一個頁面,之后記錄cookie就可以解決問題了 /這里,定義一個類去繼承WebCl
4、ient,用來記錄前后的cookie price = GetPriceByCookie(id); /第三種方式 /雖然京東在價格上做了很多的手腳,但是我們可以變相的采用其他的方式來處理 /比如,我們發(fā)現(xiàn),京東有手機商城,這樣,我們在手機商場上做了查看 /發(fā)現(xiàn),手機商城根本就不用Cookie,而是直接下載頁面就可以得到數(shù)據(jù) /好吧,看下面的程序就可以了 price = GetPriceByMobile(id); return price; private static double GetPriceByImage(string id) /京東的商品的Id是獨一無二的,也就是說,每個Id標(biāo)示了一件
5、商品的內(nèi)容頁 /得到京東商品的下載頁面 string downUrl = " /下載京東的商品內(nèi)容頁面,主要是為了下載圖片 byte bytes = new WebClient().DownloadData(downUrl); /通過編碼得到頁面的內(nèi)容string,用HttpUtility.HtmlDecode解碼 string content = HttpUtility.HtmlDecode(encoding.GetString(bytes); /利用HtmlAgilityPack來加載分析Html頁面內(nèi)容 HtmlDocument htmlDoc = new HtmlDocume
6、nt(); htmlDoc.LoadHtml(content); /得到需要下載的價格圖片節(jié)點 var imgNode = htmlDoc.DocumentNode.SelectSingleNode("/strongclass='price'/img"); /得到需要下載的圖片地址,需要用當(dāng)前的頁面地址去拼接一下,否則有可能是部分地址 string imgUrl = new Uri(new Uri(downUrl),imgNode.Attributes"src".Value).AbsoluteUri; /下載圖片,放到Images文件夾下
7、 /生成圖片的地址,"Images/" + 生成一個Guid以保證他們的名字都是不同的 + 圖片的格式 string imgPath = "Images/" + Guid.NewGuid().ToString().Replace("-", "") + imgUrl.Substring(imgUrl.LastIndexOf('.'); /下載圖片 new WebClient().DownloadFile(imgUrl, imgPath); /分析圖片,得到商品的價格 JingdongImage jdI
8、mage = new JingdongImage(); string priceStr = jdImage.GetPicNum(imgPath); /定義一個匹配double的正則,從價格字符串中得到價格 /更簡單的方法就是priceStr = priceStr.SubString(1);/去掉第一個¥字符 Regex doublePattern = new Regex("d+(.d+)?", RegexOptions.Compiled); string dbPrice = doublePattern.Match(priceStr).Value; double price
9、= 0; if(double.TryParse(dbPrice,out price) return price; return 0; private static double GetPriceByCookie(string id) /京東的商品的Id是獨一無二的,也就是說,每個Id標(biāo)示了一件商品的內(nèi)容頁 /得到京東商品的加入購物車的鏈接,用程序來模仿人來將商品加入到購物車?yán)锩嫒?/加入購物車的鏈接 string goUrl = " + id + "&pcount=1&ptype=1" /定義一個CookieWebClient類來達(dá)到記錄Cooki
10、e的效果 CookieWebClient client = new CookieWebClient(); /去下載一個頁面來記錄Cookie client.DownloadData(goUrl); /得到結(jié)算頁面的頁面的Url string shopUrl = " /下載得到結(jié)算頁面的數(shù)據(jù) byte bytes = client.DownloadData(shopUrl); string content = HttpUtility.HtmlDecode(encoding.GetString(bytes); /利用HtmlAgilityPack來加載分析Html頁面內(nèi)容 HtmlDoc
11、ument htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(content); /得到商品價格的節(jié)點 var priceNode = htmlDoc.DocumentNode.SelectSingleNode("/spanclass='price'id='cartBottom_price'"); if (priceNode = null)/節(jié)點查找失敗 return 0; /得到商品的價格string,去掉第一個字符¥ string priceStr = priceNode.InnerText.S
12、ubstring(1); double price = 0; if (double.TryParse(priceStr, out price) return price; return 0; private static double GetPriceByMobile(string id) /京東的商品的Id是獨一無二的,也就是說,每個Id標(biāo)示了一件商品的內(nèi)容頁 /得到京東商品的下載頁面 string downUrl = " + id; /下載京東的商品內(nèi)容頁面,主要是為了下載圖片 byte bytes = new WebClient().DownloadData(downUrl);
13、 /注意手機商城里面的Encoding是UTF8的 /通過編碼得到頁面的內(nèi)容string,用HttpUtility.HtmlDecode解碼 string content = HttpUtility.HtmlDecode(Encoding.UTF8.GetString(bytes); /利用HtmlAgilityPack來加載分析Html頁面內(nèi)容 HtmlDocument htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(content); /得到價格節(jié)點 var priceNode = htmlDoc.DocumentNode.SelectSing
14、leNode("/divclass='p-price'/strongclass='flk31'3"); if (priceNode = null)/節(jié)點查找失敗 return 0; /得到商品的價格string,去掉第一個字符¥ string priceStr = priceNode.InnerText; double price = 0; if (double.TryParse(priceStr, out price) return price; return 0; class CookieWebClient : WebClient pri
15、vate CookieContainer m_container = new CookieContainer(); protected override WebRequest GetWebRequest(Uri address) WebRequest request = base.GetWebRequest(address); if (request is HttpWebRequest) (request as HttpWebRequest).CookieContainer = m_container; return request; class MyImage /需要進(jìn)行分析的圖片 priv
16、ate Bitmap bmpobj; /需要繼承并且重寫的數(shù)字比對串,在子類里面需要用到這個去比對數(shù)字 public Dictionary<string, char> numDic = new Dictionary<string, char>(); /得到圖片中某一點的灰度數(shù)值 private int GetGrayNumColor(System.Drawing.Color posClr) return (posClr.R * 19595 + posClr.G * 38469 + posClr.B * 7472) >> 16; /進(jìn)行灰度處理 private
17、 void GrayByPixels() for (int i = 0; i < bmpobj.Height; i+) for (int j = 0; j < bmpobj.Width; j+) int tmpValue = GetGrayNumColor(bmpobj.GetPixel(j, i); bmpobj.SetPixel(j, i, Color.FromArgb(tmpValue, tmpValue, tmpValue); /得到一個圖片的01代碼序列 private string GetSingleBmpCode(Bitmap singlepic, int dgGra
18、yValue) Color piexl; string code = "" for (int posy = 0; posy < singlepic.Height; posy+) for (int posx = 0; posx < singlepic.Width; posx+) piexl = singlepic.GetPixel(posx, posy); if (piexl.R < dgGrayValue) / Color.Black ) code = code + "1" else code = code + "0"
19、; return code; /從一個圖片里面得到幾個分開的數(shù)字小圖片 private Bitmap GetPicValidByValue(int dgGrayValue) List<Bitmap> PicList = new List<Bitmap>(); Rectangle cloneRect; int posx1 = bmpobj.Width, posy1 = bmpobj.Height, posx2 = 0, posy2 = 0; bool cut = false; int last = -1, lastx = 0; for (int j = 0; j <
20、 bmpobj.Width; j+) /找有效區(qū) cut = false; for (int i = 0; i < bmpobj.Height; i+) int pixelValue = bmpobj.GetPixel(j, i).R; if (pixelValue < dgGrayValue) /根據(jù)灰度值 if (posx1 > j) posx1 = j; if (posy1 > i) posy1 = i; if (posx2 < j) posx2 = j; if (posy2 < i) posy2 = i; cut = true; ; if (cut)
21、 continue; if (last + 1 = j) last+; continue; cloneRect = new Rectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1); lastx = j; last = j; posx1 = bmpobj.Width; posy1 = bmpobj.Height; posx2 = 0; posy2 = 0; PicList.Add(bmpobj.Clone(cloneRect, bmpobj.PixelFormat);/復(fù)制小塊圖 ; return PicList.ToArray
22、(); /得到一個圖片的數(shù)字串 private string GetPicNumber() GrayByPixels(); /灰度處理 Bitmap pics = GetPicValidByValue(128); /得到有效值 StringBuilder sb = new StringBuilder(); char c; for (int i = 0; i < pics.Length; +i) string code = GetSingleBmpCode(picsi, 128); /得到代碼串 if (numDic.TryGetValue(code, out c) sb.Append(c
23、); return sb.ToString(); /外部調(diào)用,得到一個圖片的數(shù)字串 public string GetPicNum(Bitmap pic) bmpobj = new Bitmap(pic); /轉(zhuǎn)換為Format32bppRgb return GetPicNumber(); /外部調(diào)用,得到一個圖片的數(shù)字串(重載) public string GetPicNum(string fileName) bmpobj = new Bitmap(fileName); return GetPicNumber(); /輸出在一幅圖里面找到的數(shù)字,測試或者找到數(shù)字比對串時用 private v
24、oid TestNumber() GrayByPixels(); /灰度處理 Bitmap pics = GetPicValidByValue(128); /得到有效值 for (int i = 0; i < pics.Length; +i) string code = GetSingleBmpCode(picsi, 128); /得到代碼串 Console.WriteLine(i); Console.WriteLine(code); /外部調(diào)用,輸出在一幅圖里面找到的數(shù)字,測試或者找到數(shù)字比對串時用 public void TestNum(Bitmap pic) bmpobj = ne
25、w Bitmap(pic); /轉(zhuǎn)換為Format32bppRgb TestNumber(); /外部調(diào)用,輸出在一幅圖里面找到的數(shù)字,測試或者找到數(shù)字比對串時用(重載) public void TestNum(string fileName) bmpobj = new Bitmap(fileName); TestNumber(); class JingdongImage : MyImage public JingdongImage() numDic.Add("11110000111101100000011000110000110000011001100000001111000000
26、0011110000000001100000000001100000001111111100000001100000000001100000000001100000000001100000000011110000", '¥'); numDic.Add("001111100011000110110000011110000011110000011110000011110000011110000011110000011011000110001111100", '0'); numDic.Add("00110011110000110
27、0001100001100001100001100001100001100001100111111", '1'); numDic.Add("011111100110000110110000011000000011000000110000001100000011000000110000001100000011000000111111111", '2'); numDic.Add("011111100110000110110000011000000011000000110000111100000000110000000011110000011110000110011111100&qu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年跨境電商平臺入駐及貨款墊付合作協(xié)議3篇
- 2025版科技創(chuàng)新反擔(dān)保合同與研發(fā)設(shè)備抵押協(xié)議3篇
- 醫(yī)院與保險公司合同管理
- 畜牧業(yè)發(fā)展承諾書網(wǎng)上填報
- 廢舊輪胎處理合同
- 藝術(shù)空間租賃協(xié)議
- 消防安全評估防水施工合同
- 古玩市場物業(yè)員工招聘合同
- 個人工作室客戶意見箱管理方案
- 森林防火維護(hù)爆炸品庫房管理方案
- 跟蹤審計服務(wù) 投標(biāo)方案(技術(shù)方案)
- 管道基坑開挖施工方案
- 廣東省汕頭市金平區(qū)2023-2024學(xué)年七年級上學(xué)期期末語文試題
- 計算機組成原理(商洛學(xué)院)智慧樹知到期末考試答案2024年
- (2024年)電工安全培訓(xùn)(新編)課件
- 2024年度新型紡織纖維
- 2024年廣東珠海水務(wù)環(huán)境控股集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 培訓(xùn)機構(gòu)五年發(fā)展規(guī)劃方案
- 《銷售主管競聘》課件
- 青少年型青光眼個案護(hù)理
- 小學(xué)數(shù)學(xué)六年級解方程練習(xí)300題及答案
評論
0/150
提交評論