前段時間,女朋友如願以償的找到了銷售的工作,第一天正式上班還挺高興,第二天就開始愁眉苦臉了。就是因為他這銷售實在是太麻煩,以後每天要到一些B2B網站去找一些客戶資訊,每天要找幾百條,剛開始我還安慰的說,沒事,以後我幫你找,我接手這工作第一天還很老實,第一天用了不到一個小時的時間幫忙找了八十條,但到了第二天我也煩了,太枯燥了。瞪得眼珠子都疼,突然想想,我堂堂苦逼程式員,今天竟然做這種枯燥重複性的工作!對啊,咱是苦逼程式員啊。程式員怎麼能總做這些重複的工作呢。這種重複性的工作讓代碼來做就好了。說幹就幹,終於研究了兩天的時間寫了一個類似小爬蟲的工具來爬取這些B2B網站的資訊。雖然功能很簡單,技術含量也不高,但想想怎麼也是一個小工具,分享出來,也許大家以後會用到。OK,項目背景介紹完畢,下面開始分享程式的詳細資料。
首先寫一個獲得頁面源碼的方法:
// 通過url和postdata擷取傳回值。該函數為主要函數可以copy使用傳回值為一個Html頁面的資料。public static String GetResponseDataByID(String url, String postData) {String content = null;try {URL dataUrl = new URL(url);HttpURLConnection con = (HttpURLConnection) dataUrl.openConnection();// System.out.println(con.getResponseCode());// System.out.println(con.getContentLength());// con.setRequestMethod("POST");// con.setRequestProperty("Proxy-Connection", "Keep-Alive");// con.setDoOutput(true);// con.setDoInput(true);// OutputStream os = con.getOutputStream();// DataOutputStream dos = new DataOutputStream(os);// dos.write(postData.getBytes());// dos.flush();// dos.close();byte d[] = new byte[4];String line;InputStream is = con.getInputStream();StringBuffer stringBuffer = new StringBuffer();Reader reader = new InputStreamReader(is, "GBK");// 增加緩衝功能BufferedReader bufferedReader = new BufferedReader(reader);while ((line = bufferedReader.readLine()) != null) {stringBuffer.append(line + "\n");}if (bufferedReader != null) {bufferedReader.close();}content = stringBuffer.toString();} catch (Exception ex) {ex.printStackTrace();}return content;}
PS:這裡有必要說明一下我要爬取的B2B網站的有關內容,這些網站大都提供了一個搜尋功能,在搜尋方塊裡填寫上想要搜尋的公司關鍵字就可以獲得相關公司的一個列表。這裡本來是想寫一個可以提交POST請求然後獲得提交請求後頁面的源碼的方法,但是在寫完之後,有一部分B2B網站禁止以代理的形式提交POST的請求,所以只能改成自己手動填寫搜尋資訊,然後把搜尋到的資訊列表的地址傳過來,獲得該頁面的源碼。在本工具中postdata參數無用。為了以後可以擴充,所以沒有刪除。Ok,這個方法就可以獲得我們想要的一些公司列表了。
搜素到公司列表之後,每個公司都會對應一個url。下一步我們就要去遍曆這些公司的url。開啟對應公司的url後他是一個公司的介紹頁面,這裡面沒有我想要的資訊,要想得到我想要的資訊必須還得開啟一個“更多詳細資料”連結。所以下一步我們還需獲得當前頁面,然後得到這個連結。對了,這裡還寫了一個獲得一個html頁面連結的方法,上面獲得所有公司列表的連結也是用的這個方法。這裡運用到了一個開源包htmlparser。這個東西功能挺強大的,大家以後可以研究一下。請看獲得頁面連結的代碼,這裡我有好幾個地方用到,每次都有一個過濾,所以我還設定了一個標誌量來區分。
public static Set<String> getHref(String f, int flag) {Set<String> set = new HashSet<String>();try {Parser parser = new Parser(f);parser.setEncoding("UTF-8");NodeFilter filter = new NodeClassFilter(LinkTag.class);NodeList links = new NodeList();for (NodeIterator e = parser.elements(); e.hasMoreNodes();) {e.nextNode().collectInto(links, filter);}for (int i = 0; i < links.size(); i++) {LinkTag linktag = (LinkTag) links.elementAt(i);if (flag == 0&& linktag.getLink().length() > 12&& !(linktag.getLink().substring(0, 18).equals("http://www.product"))&& linktag.getLinkText().contains("濟南")) {set.add(linktag.getLink());} else if (flag == 1&& (linktag.getLinkText().equals("更多>>") || linktag.getLinkText().equals("更多>>"))) {set.add(linktag.getLink());} else if (flag == 2 && linktag.getLinkText().equals("下一頁"))set.add(linktag.getLink());}} catch (ParserException e) {// TODO Auto-generated catch blocke.printStackTrace();}// System.out.println(list);return set;}
OK,下一步就到了我們想要資訊的頁面了。這裡沒什麼技術含量。主要是用到的就是一個字串截取和替換
public static String getPart(String source, String type) {if (source == null)return null;if (source.indexOf(type) != -1) {source = source.substring(source.indexOf(type));source = source.substring(0, source.indexOf("</dl>"));source = source.replace("</dt><dd>", "");source = source.replace("</dd>", "");source = source.replace("/p", "");source = source.replace("\n", "");source = source + "\r\n";System.out.println(source);outFile(source);return source.trim();} elsereturn null;}
這樣獲得到相關資訊之後,我們就可以把他輸出到一個檔案裡面了。
private static void outFile(String source) {try {File file = new File("d:" + File.separator + "老婆資料.txt");Writer out = null;// 聲明字元輸出資料流out = new FileWriter(file, true);// 表示可以追加out.write(source);// 寫入資料out.close();} catch (Exception e) {e.printStackTrace();}}
為了更像一個小軟體,我還做了一個swing介面,現在不得不感歎啊,我的介面做的還是依然那麼的難看。代碼就不上了,很簡單,看一下介面吧。哈哈
開始地址即為你要從那頁開始的url,因為每天所需要的資訊都不一樣,所以你要記住你當天弄到第幾頁了。最好的方法就是一次把你搜尋的結果都擷取完,差不多有上萬條。資訊數量就是你想得到的資訊條數。
下面看一下爬取到的資訊吧:
好了,到此基本上一些詳細細節介紹完了,當然這個工具有很多不足的地方,最不足的地方就是每換一個B2B網站都需要修改代碼,因為每個網站的架構都不一樣,所以用不同的B2B網站都要修改代碼。只是小改一下就行。他的大體步驟還是都一樣的。由於時間倉促,也沒注意什麼編碼規範問題,僅僅是簡單實現功能而已。本文中僅提供了部分代碼,如若想得到整個項目源碼,請在下面留下您的郵箱。
PS:馮老師,我可沒佔用專升本的時間,這個小工具是在晚上從圖書館回來的時候寫的哈,真的沒佔用專升本時間,我發誓。哈哈,還是非常感謝,也很感動您老每次的督促。在此表示謝意。
孫老師,最近您老跑哪去了,開學之後一直沒見過你,您老是不是也愛玩躲貓貓啊。沒有基友的日子真的不好過啊。哈哈。老孫同志啊,有空聚聚哈。
李某某,好好工作,腳踏實地,只要努力,天道勤籌,相信老天不會負有心人的哦。加油,我永遠是你最堅實的後盾。不管以後再大的風浪,我們風雨同舟。有我的地方就有咱的小家。最後真心的感謝有你的這七年。相信以後的七十年我們會過得更幸福。
最後給天下所有的妹子說聲:找個程式猿就嫁了吧。