自己開發的公眾號,可以領取淘寶內部優惠券
來到新公司后第一個任務就是讓我給編輯部的人抓文章,文章抓取工具公司已經開發了一個,我也就直接拿來用了,結果用的很不習慣,操作太繁瑣里面的代碼邏輯也是比較混亂。所以我就大刀闊斧對它進行了一番修改。我主要還是希望能使這個工具盡量的通用一些,雖說各個網站都不一樣,但抓了幾天后還是發現有些共同的東西的。通過設置各個元素的xpath表達式,基本可以解決大部分的網站抓取。
1.抽取出文章列表的標題鏈接 ,一般的標題鏈接都是放在ul或者是div里面的a標簽,而這些ul和div往往都會設置一個class屬性,於是文章的xpath一般可以設置://div[@class='title']
2.列表頁都是會有分頁的,通過設置起始頁和末頁的大小,進行一個循環即可
3.根據上面的文章鏈接獲取內容的鏈接后,就可以發出一個http請求獲取正文部分,正文部分如果是文本還是比較好解決,最多的要求就是去掉每個網站的廣告。運氣好些你會碰到一些仁慈點的網站,廣告所在的元素會有一些明顯的特征,如加了id或是class屬性,這樣就可以設置要過濾的節點來進行過濾
4.暫時還在想...............
最后要講講文章正文部分不單單是文本呢,有圖片的,甚至還有下載資料(如rar,zip壓縮包)的 怎么辦。起初工具里是可以支持下載圖片的,而且我發現它使用的是WebClient 實現文件下載的。如果下載地址是絕對定位的形式可以下載。如果圖片是根據參數動態生成的就麻煩了,會報Uri格式錯誤。
最后下載的實現大概這樣:
2 FileStream fs = new FileStream(filePath + fileName, FileMode.Create);
3
4 // 1kb下載
5 // byte[] _buffer=new byte[1024];
6 // int count = stream.Read(_buffer, 0, _buffer.Length);
7 // while (count > 0)
8 // {
9 // fs.Write(_buffer, 0, _buffer.Length);
10 // count = stream.Read(_buffer, 0, _buffer.Length);
11 // }
12
13 // fs.Flush();
14 // fs.Close();
15 // stream.Close();
16
17 // 逐字節下載
18 int size;
19 while ((size = stream.ReadByte()) != - 1)
20 {
21 fs.WriteByte(Convert.ToByte(size));
22 }
23 stream.Close();
24 fs.Flush();
25 fs.Close();
現在下載是一個字節一個字節來從Stream中讀取,感覺比較慢些。自己也試了1kb來讀取可是發現讀取的文章圖片是這樣的:
不僅圖片有問題,下載的rar這些文件也是打不開的。如果一個字節一個字節則一切都OK: