李金峰 郭冰 李金隆
摘要:ScapySharp由于有一個瀏覽器包裝類和使用類似jQuery的Css選擇器和Linq語法,使得它使用簡單,更容易地被用以進行Html文檔解析。本文介紹了一種基于ScrapySharp的孔夫子舊書網(wǎng)的圖書價格信息抓取器及其實現(xiàn)的思路和關鍵技術。
關鍵詞:ScapySharp;孔夫子舊書網(wǎng);圖書價格;信息抓取
一、引言
采集電商網(wǎng)的商品價格信息,對于網(wǎng)店賣家進行同類商品的定價決策有重要的參考意義。筆者使用ScrapySharp實現(xiàn)了對孔夫子舊書網(wǎng)上的圖書的價格信息進行抓取的軟件,該軟件功能可以用在電商系統(tǒng)后臺等軟件系統(tǒng),為賣家的商品定價決策提供支持。
二、軟件功能描述
賣家在孔夫子舊書網(wǎng)上架舊書商品的時候,需要確定舊書商品的價格,而價格的確定又需要參考同行的圖書商品的定價。這種情況,一般的做法是通過圖書的ISBN號在孔夫子舊書網(wǎng)上搜索圖書的商品信息,然后查看各賣家對該書的定價,在參考同行定價的基礎上,確定本店的定價。通過ISBN號在孔夫子舊書網(wǎng)上查詢圖書價格信息的方法如圖1所示。這種查詢圖書定價信息的做法的最大缺點是,人力成本高,信息獲取的效率低。
為了節(jié)約人力成本,提高查詢網(wǎng)店圖書價格信息的效率,筆者實現(xiàn)了一種基于ScrapySharp的孔夫子舊書網(wǎng)價格信息抓取器,用戶只需要輸入圖書的ISBN號,就可以查找到孔夫子網(wǎng)上的該書的所有定價信息,并把定價信息顯示在用戶界面。
三、軟件功能的實現(xiàn)
1、軟件功能實現(xiàn)的思路
孔夫子舊書網(wǎng)的書籍價格信息抓取器的實現(xiàn)思路是,通過Url定位到圖書查詢的網(wǎng)頁,然后對網(wǎng)頁的內容進行抓取,最后從網(wǎng)頁內容中把圖書的價格信息提取出來。軟件功能實現(xiàn)的思路(價格信息獲取的流程)如圖2所示。
2、以ISBN查詢圖書信息的Url分析
以ISBN為“9787560544588”的圖書為例,該圖書的中文書名為:概率、變量與過程(第4版);英文書名為:Probability,Random Variables and Stochastic Processes.在孔夫子舊書網(wǎng)的商品搜索框中輸入“9787560544588”后,頁面呈現(xiàn)搜索結果——《概率、變量與過程(第4版)》的商品信息列表,如圖1所示。此時,瀏覽器地址欄中顯示的網(wǎng)址為:http://search.kongfz.com/product/zk39k37k38k37k35k36k30k35k34k34k35k38k38/。
再通過其它圖書的ISBN搜索實驗發(fā)現(xiàn),搜索結果地址的結構分為三部分,第一部分為服務器(控制器)地址,即:http://search.kongfz.com/product/。第二部分為經(jīng)過字符串混淆處理的ISBN號,即例子中的網(wǎng)址的“zk39k37k38k37k35k36k30k35k34k34k35k38k38”部分,該部分的結構為:“zk3”+ISBN號第1位+“k3”+ISBN號第2位++“k3”+ISBN號第3位+“k3”+ISBN號第4位+“k3”+ISBN號第5位+“k3”+ISBN號第6位+“k3”+ISBN號第7位+“k3”+ISBN號第8位++“k3”+ISBN號第9位+“k3”+ISBN號第10位+“k3”+ISBN號第11位+“k3”+ISBN號第12位+“k3”+ISBN號第13位。第三部分為搜索結果的分頁頁碼,由“w+數(shù)字”構成,數(shù)字1表示搜索結果的第一頁,2表示第二頁,以此類推。本例子中,網(wǎng)址可以寫成完整結構(包含服務器(控制器)地址、ISBN號信息和搜索結果分頁頁碼三部分)的網(wǎng)址,即:
http://search.kongfz.com/product/zk39k37k38k37k35k36k30k35k34k34k35k38k38w1/
通過實驗發(fā)現(xiàn),當輸入的分頁頁碼數(shù)大于實際搜索結果的分頁頁碼時,返回的網(wǎng)頁中的title標簽中的內容為“搜索零結果”,即:
據(jù)此,可以準確判斷搜索結果的分頁頁碼數(shù)。
3、ScrapySharp和Htlm文檔解析
通過網(wǎng)頁搜索實驗發(fā)現(xiàn),圖書價格信息在Html文檔中的標簽節(jié)點為:
遍歷文檔中的class為“red”的p標簽可以獲取當前頁中的所有圖書價格信息。
ScrapySharp為.Net開發(fā)者解析Html文檔提供了極大的便利,主要優(yōu)點有:ScapySharp有一個瀏覽器包裝類(處理Reference,Cookie等),此外,它使用類似jQuery的Css選擇器和Linq語法。通過ISBN號獲取孔夫子舊書網(wǎng)中的圖書價格信息的核心代碼如下:
public List
{
try
{
//價格信息集合
List
//搜索結果分頁
int page = 1;
//讀取所有分頁的html文檔信息
while(true)
{
//使用WebClient處理從web站點檢索的數(shù)據(jù)
WebClient client = new WebClient();
//獲取搜索內容為isbn(圖書ISBN號)的搜索結果網(wǎng)址
string address = GetSearchUrl(isbn);
//獲取流
Stream st = client.OpenRead(address + “w” + page);
//分頁頁碼加1
page++;
//創(chuàng)建StreamReader 對象
StreamReader sr = new StreamReader(st,Encoding.UTF8);
//獲取html文檔內容
string content = sr.ReadToEnd();
//創(chuàng)建HtmlDocument對象
var htmlDocument = new HtmlDocument();
//載入html文檔內容到HtmlDocument對象中
htmlDocument.LoadHtml(content);
//獲取html文檔的標簽節(jié)點
var html = htmlDocument.DocumentNode;
//如果輸入的分頁頁碼超出實際搜索結果的分頁頁碼的范偉,則退出循環(huán)
if(html.CssSelect(“title”).FirstOrDefault().InnerHtml.Equals(“搜索零結果”))
{
break;
}
//獲取class為red的p標簽節(jié)點(即價格信息標簽節(jié)點)
var prices = html.CssSelect(“p.red”);
//將價格信息保存到自定義的集合中
foreach(var htmlNode in prices)
{
priceStrList.Add(htmlNode.InnerHtml);
}
}
return priceStrList;
}
catch(Exception ex)
{
throw ex;
}
}
4、效果測試
在.Net控制臺項目中對上述代碼進行測試,測試實例為抓取ISBN號為“9787302423287”的圖書的價格信息。測試程序的代碼如下:
//實例化孔夫子圖書價格抓取輔助類的對象
KongfuziPriceHelper helper = new KongfuziPriceHelper();
//調用GetKongfuziPriceByIsbn方法抓取圖書的價格信息
List
//價格記錄數(shù)
int count = 0;
//在控制臺中輸出所有價格
foreach(var item in priceStrList)
{
count++;
Console.WriteLine(item);
}
//在控制臺中輸出價格記錄數(shù)
Console.WriteLine(“總計:” + count + “條記錄”);
運行測試程序,控制臺輸出結果如圖3所示。
孔夫子舊書網(wǎng)上對ISBN號為“9787302423287”的圖書進行搜索的結果如圖4所示。
由于搜索結果的顯示頁面過長,只截取頁面局部,可以看到搜索結果的圖書記錄為78條,與測試結果一致?;赟crapySharp的孔夫子舊書網(wǎng)的圖書價格信息抓取器實現(xiàn)了預期的功能。
四、總結
ScrapySharp使用簡單,使得.Net開發(fā)者更容易地解析Html文檔,靈活地采集網(wǎng)頁信息。應用此技術可以方便、高效地實現(xiàn)孔夫子舊書網(wǎng)的圖書價格信息抓取器。測試結果表明,該軟件的功能達到了預期效果。
參考文獻:
[1]于娟,劉強.主題網(wǎng)絡爬蟲研究綜述[J].計算機工程與科學,2015(02):231-237.
[2]孫立偉,何國輝,吳禮發(fā).網(wǎng)絡爬蟲技術的研究[J].電腦知識與技術,2010(15):4112-4115.
[3]喬峰.基于模板化網(wǎng)絡爬蟲技術的Web網(wǎng)頁信息抽取[M].電子科技大學,2015.
[4]肖劍.垂直搜索中一種高效穩(wěn)定的數(shù)據(jù)抓取方法的研究與實現(xiàn)[M].南京大學,2014.