標籤:
網路爬蟲-使用java語言抓取網路資料
前提:熟悉java文法(能看懂就行)
- 準備階段:從網頁中擷取html代碼
- 實戰階段:將對應的html代碼使用java語言解析出來,最後儲存到plist檔案
上一片文章已經介紹我們可以使用兩個方式來抓取網路資料實現網路爬蟲,並且大致介紹了一下怎麼使用Regex去實現資料的抓取
由於筆者曾經學過一段時間java和android相關的技術,今天就講講怎麼使用java去抓取網路資料,關於Python有機會等筆者好好研究一下再來分享,但其實會一種就可以,除非你的需求非常強大或者是在想裝逼。
一:準備階段--》擷取html代碼
1:開啟你對應想要擷取資料的網頁,使用firefox開啟(因為他有一個內建的神器叫:firebug,關於firebug這裡就多說了,反正對於網頁開發來說她就是神器),這裡我們使用的是dota首頁英雄的介紹。
首先來看看我們需要的資料
2:由於在網頁開發中也是分模組開發的,所以一定的地區在html中對應對應的html代碼模組,所以我們選取介面中一個小的模組作為練習。
找到對應的模組,點擊右鍵在firebug中查看元素
(確保已安裝firebug,沒有安裝的去Firefox工具列中工具標籤裡面的一個附加組件搜尋並下載安裝就可以)
這個時候網頁的下面就會顯示對應模組的html代碼,我們需要找到我們想要擷取的資料對應的html模組代碼,點擊右鍵拷貝我們需要的html。
3:在介面簡一個html檔案將拷貝好的html代碼粘貼到檔案中,然後就需要哪麼一丟丟的html相關知識了,就是補充html中的資料,使他成為完整的html檔案
這裡注意一下編碼方式:開發中常用的都是utf-8的格式
二:實戰階段--》抓取html(網頁資料)
然後我們就要正式開工了,後面才是重點,前面那都是傻瓜是的操作(後面的才做中需要有那麼一丟丟的java或者android開發的基礎,當然不會耶沒有關係,筆者會完整的介紹流程)
1:代開Eclipse
建立一個java項目,並且點擊項目中的src建立一個class專門用來實現資料的解析
2:建立好項目之後就要用到我們的一個java的jar包,專門用來抓取網路資料的包:關於包的下載後面筆者會給出下載連結
將下載好的jar包匯入到java工程項目中。
然後我們需要將他添加到build路徑(這裡是一個常識,java中的jar包沒有添加到build路徑是不能使用的,添加之後對應的咖啡表徵圖會變成奶瓶)
成功之後的顯示
下面開始使用java正式抓取並解析html(網頁)資料
根據下面的圖片在java工程項目中書寫html資料解析的代碼:(注意裡面的步驟)
java核心代碼:
1 try { 2 3 //檔案路徑 4 5 String path = " /Users/icocos/Desktop/iCocos.html"; 6 7 8 9 //載入網頁10 11 Document doc = Jsoup.parse(new File(path), "UTF-8");12 13 14 15 //解析網頁16 17 Elements lis = doc.select("li");18 19 20 21 //遍曆數組22 23 for(int i = 0; i < eles.size(); i++) {24 25 //根據i擷取對應的元素26 27 Element li = lis.get(i);28 29 30 31 //取圖片32 33 Element img = li.select("img").get(0);34 35 // System.out.println(img.attr("src"));36 37 38 39 //擷取圖片名40 41 String imgName = img.attr("src");42 43 44 45 Element p = li.select("p").get(0);46 47 String personName = p.text();48 49 50 51 //列印資料52 53 System.out.println(imgName + "," + personName);54 55 56 57 }58 59 } catch {60 61 //錯誤(異常)處理62 63 e.printStackTrace();64 65 }
此時點擊Run運行之後,Eclipse就會根據你的代碼輸出對應的資訊
但是這個時候我並不能直接使用資料所以需要在java代碼中做一些相應的修改,使得輸出的資料可以直接拷貝並且讀到plist中,其實就是數組或者字典資料
我們知道在ios開發中從plist檔案中讀取資料時最常見的,當然你也可以使用其他方式,但是沒有比這更簡單了。
下面我給java代碼做一些調整
1:在for迴圈之前輸入這一行代碼,實現資料拼接並且資料
- System.out.println("NSArray *apps = @[");
2:接著就需要在for迴圈結束之後輸入預知對應的拼接數組結尾標誌
3:在for迴圈內部的最後面我們需要在每次迴圈的時候都要使用上面的代碼進行拼接並且使用逗號做相應的分割
- System.out.println("@{@\"name\":@\"" + personName + "\", @\"icon\":@\""+ imgName + "\"},");
最後完整的java擷取並且解析html資料如下;
1 public class iCocos { 2 3 public static void main (String[] args) { 4 5 try { 6 7 //檔案路徑 8 9 String path = " /Users/icocos/Desktop/iCocos.html";10 11 //載入網頁12 Document doc = Jsoup.parse(new File(path), "UTF-8");13 14 //解析網頁15 Elements lis = doc.select("li");16 17 System.out.println("NSArray *apps = @[");18 19 20 //遍曆數組21 22 for(int i = 0; i < eles.size(); i++) {23 24 //根據i擷取對應的元素25 26 Element li = lis.get(i);27 28 29 //取圖片30 31 Element img = li.select("img").get(0);32 33 // System.out.println(img.attr("src"));34 35 //擷取圖片名36 37 String imgName = img.attr("src");38 39 Element p = li.select("p").get(0);40 41 String personName = p.text();42 43 //列印資料44 // System.out.println(imgName + "," + personName);45 46 System.out.println("@{@\"name\":@\"" + personName + "\", @\"icon\":@\""+ imgName + "\"},");47 }48 System.out.println("]");49 50 } catch {51 52 //錯誤(異常)處理53 e.printStackTrace();54 55 }56 57 }58 59 }
這個時候回列印輸出下面的代碼,
下面我們就需要在xcode中做事情了,做什麼事呢,就是將輸出的以NSArray開頭的所有資料在Xcode中轉換為plist的資料,當然你也可以不轉換,做少部分的修改之後直接使用JSON解析技術去解析,但是那樣不是最好的辦法。
在Xcode中建立一個項目工程,在ViewDidLoad中粘貼拷貝過來的代碼,這個時候是不是看起來非常熟悉,對了,她就是我嗎開發中常用到的數組資料。
下面我就使用迴圈遍曆去講NSArray數組資料寫到plist檔案中。
1 - (void)viewDidLoad 2 3 { 4 5 [super viewDidLoad]; 6 7 8 9 NSArray *apps = @[10 11 @{@"name":@"敵法師", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/dfss.jpg"},12 13 @{@"name":@"火槍", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/arjj.jpg"},14 15 @{@"name":@"德魯伊", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/dlyy.jpg"},16 17 @{@"name":@"月騎", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/yzqs.jpg"},18 19 @{@"name":@"變體精靈", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/btjl.jpg"},20 21 @{@"name":@"娜迦海妖", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/njhy.gif"},22 23 @{@"name":@"猴子", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/hycm.jpg"},24 25 @{@"name":@"白虎", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/yzjs.jpg"},26 27 @{@"name":@"隱形刺客", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/yxck.jpg"},28 29 @{@"name":@"巨魔", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/jmzj.jpg"},30 31 @{@"name":@"直升機", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/arzs.jpg"},32 33 @{@"name":@"賞金獵人", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/Naka.gif"},34 35 @{@"name":@"骷髏射手", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/KLSS.gif"},36 37 @{@"name":@"育母蜘蛛", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/YMZZ.gif"},38 39 @{@"name":@"血魔", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/XM.gif"},40 41 @{@"name":@"黑暗遊俠", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/Nbrn.gif"},42 43 @{@"name":@"虛空假面", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/EC45.gif"},44 45 @{@"name":@"蛇髮女妖", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/H00V.gif"},46 47 @{@"name":@"地蔔師", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/H00I.gif"},48 49 @{@"name":@"地穴刺客", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/DXCK.gif"},50 51 @{@"name":@"螞蟻", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/DXBZ.gif"},52 53 @{@"name":@"幻影刺客", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/HYCK.gif"},54 55 @{@"name":@"閃電幽魂", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/E002.gif"},56 57 @{@"name":@"影魔", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/YM01.gif"},58 59 @{@"name":@"小魚人", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/yryx.gif"},60 61 @{@"name":@"幽鬼", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/YG1.gif"},62 63 @{@"name":@"聖堂刺客", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/E01Y.gif"},64 65 @{@"name":@"靈魂守衛", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/LHSW.gif"},66 67 @{@"name":@"熊戰士", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/Huth.gif"},68 69 @{@"name":@"劇毒術士", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/JDSS.gif"},70 71 @{@"name":@"冥界亞龍", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/MJYL.gif"},72 73 @{@"name":@"複仇之魂", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/Hvwd.jpg"},74 75 @{@"name":@"劍聖", @"icon":@"http://dotadb.uuu9.com/UploadFiles/Dota/Hero/jsjs.jpg"}76 77 ];78 79 80 81 [newApps writeToFile:@"/Users/icocos/Desktop/apps.plist" atomically:YES];
這個時候我嗎的左面就有了這個plist檔案,開啟之後你會看到
最後的步驟就是圖片的下載,
//簡單寫入
1 // for (NSDictionary *dict in apps) { 2 3 // NSString *icon = dict[@"icon"]; 4 5 // 6 7 // // 建立網狀圖片的URL路徑 8 9 // NSURL *url = [NSURL URLWithString:icon];10 11 // 12 13 // // 下載圖片的位元據14 15 // NSData *data = [NSData dataWithContentsOfURL:url];16 17 // 18 19 // // 截取檔案名稱20 21 // NSString *filename = [icon lastPathComponent];22 23 // 24 25 // // 檔案路徑26 27 // NSString *iconPath = [NSString stringWithFormat:@"/Users/icocos/Desktop/Icons/%@", filename];28 29 // 30 31 // [data writeToFile:iconPath atomically:YES];32 33 // }
//由於plist中圖片名使用的都是對應連結的最後一個名字,所以我們不能使用上面的方法,還需要做一些處理,才能真正使用
1 NSMutableArray *newApps = [NSMutableArray array]; 2 3 for (NSDictionary *dict in apps) { 4 5 NSMutableDictionary *newDict = [NSMutableDictionary dictionary]; 6 7 newDict[@"name"] = dict[@"name"]; 8 9 newDict[@"icon"] = [dict[@"icon"] lastPathComponent];10 11 [newApps addObject:newDict];12 13 }14 15 16 17 [newApps writeToFile:@"/Users/icocos/Desktop/apps.plist" atomically:YES];18 19 20 21 }
圖片下載完成之後你會回看到對應的檔案夾中快速的出現了好多的圖片
此時我們就得到了一份和網頁想相對應比較完整的plist資料,後面我們要做的就是將我們的plist資料顯示到介面,後面我就不介紹了,詳細請看:plist檔案讀取
最後總結一下,如果以後遇到了關於需要抓取網路資料實現網路爬蟲的功能的時候,我們基本上想到的第一種方法就是使用java語言,當然公司一般不會有這樣的要求,公司一般都是使用自己伺服器的api來實現,特殊情況除外。
當然你也可以使用Regex或者Python,關於Regex相對來說還是比較難的,主要是細節比較多。而Python本人還沒有研究過,有機會嘗試一下,如果您還有什麼好的方法歡迎筆者聯絡,相互學習與討論。
我們基本上可以按照上面的思路去實現,只需要做少部分的修改,這裡大致說一下
- 1:準備階段根據你需要的資料會有不同的html產生
- 2:產生不同的html之後你html內部的結構就會做響應的變化,這個時候你就要去把java那段核心代碼搞懂來就沒問題了,最重要的還是這裡。
- 3:根據對應的NSArray資料寫入到plist檔案中,這裡是iOS開發中常用的技術我就不多說。
iOS—網路實用技術OC篇&網路爬蟲-使用java語言抓取網路資料