網絡爬蟲(又被稱為網頁蜘蛛,網絡機器人,在FOAF社區中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動的抓取萬維網信息的程序或者腳本。
今天我們就以JAVA抓取網站一個頁面上的全部全部郵箱為例來做具體說明,人一直很懶,不在做GUI了,大家看看明白原理就行。
——————————————————————————————————————————————————
百度上隨便找一個網頁,又想多的最好,這次以 點擊打開鏈接 這個貼吧網頁為例進行說明
從圖片和網頁可見上面有許多郵箱,我粗略看了看十幾頁大概有幾百個吧,如果你是樓主你肯定很難辦,你要是一個一個發吧太多了工作量太大了,一個一個郵箱的復制真的會累死人的。可是,如果你不發,肯定會被吧友鄙視。
怎麼辦呢?當然,如果有一個工具能過自動識別網頁上的郵箱並將它們取出來那該多好啊……
他就是網頁爬蟲,可是按照一定的規則抓取網頁數據,(像什麼百度,谷歌 做SEO 大多是網頁數據的抓取與分析)並將這些數據保存起來,方便數據的處理和使用。
廢話太多,上教程‘。
—————————————————————————————————————————————————
思路分析:
1.要想獲取網頁的數據必須取得與網頁的鏈接
2.要想獲得網頁上的郵箱地址必須由獲得郵箱地址相應的規則
3.要想把數據去除必須由取得數據相關類的操作
4.要想保存數據必須實現保存數據的操作
—————————————————————————————————————————————————
package tool; import java.io.BufferedReader; import java.io.File; import java.io.FileWriter; import java.io.InputStreamReader; import java.io.Writer; import java.net.URL; import java.net.URLConnection; import java.sql.Time; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Demo { public static void main(String[] args) throws Exception {// 本程序內部異常過多為了簡便,不一Try,直接拋給虛擬機 Long StartTime = System.currentTimeMillis(); System.out.println("-- 歡迎使用飛揚簡易網頁爬蟲程序 --"); System.out.println(""); System.out.println("--請輸入正確的網址如http://www.baidu.com--"); Scanner input = new Scanner(System.in);// 實例化鍵盤輸入類 String webaddress = input.next();// 創建輸入對象 File file = new File("D:" + File.separator + "test.txt");// 實例化文件類對象 // 並指明輸出地址和輸出文件名 Writer outWriter = new FileWriter(file);// 實例化outWriter類 URL url = new URL(webaddress);// 實例化URL類。 URLConnection conn = url.openConnection();// 取得鏈接 BufferedReader buff = new BufferedReader(new InputStreamReader( conn.getInputStream()));// 取得網頁數據 String line = null; int i=0; String regex = "\\w+@\\w+(\\.\\w+)+";// 聲明正則,提取網頁前提 Pattern p = Pattern.compile(regex);// 為patttern實例化 outWriter.write("該網頁中所包含的的郵箱如下所示:\r\n"); while ((line = buff.readLine()) != null) { Matcher m = p.matcher(line);// 進行匹配 while (m.find()) { i++; outWriter.write(m.group() + ";\r\n");// 將匹配的字符輸入到目標文件 } } Long StopTime = System.currentTimeMillis(); String UseTime=(StopTime-StartTime)+""; outWriter.write("--------------------------------------------------------\r\n"); outWriter.write("本次爬取頁面地址:"+webaddress+"\r\n"); outWriter.write("爬取用時:"+UseTime+"毫秒\r\n"); outWriter.write("本次共得到郵箱:"+i+"條\r\n"); outWriter.write("****謝謝您的使用****\r\n"); outWriter.write("--------------------------------------------------------"); outWriter.close();// 關閉文件輸出操作 System.out.println(" —————————————————————\t"); System.out.println("|頁面爬取成功,請到D盤根目錄下查看test文檔|\t"); System.out.println("| |"); System.out.println("|如需重新爬取,請再次執行程序,謝謝您的使用|\t"); System.out.println(" —————————————————————\t"); } }
輸入爬去取頁面的地址。
<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20140306/20140306140911255.jpg" alt="\">
打開D盤目錄找到test.xt文件.
文件內的郵箱默認加上了“;”方便大家發送操作
當然,爬取本地文件內的數據就更簡單了
不再過多解釋直接上代碼。
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Demo0 { public static void main(String[] args)throws Exception { BufferedReader buff=new BufferedReader(new FileReader("D:"+File.separator+"test.txt")); String line=null; String regex="\\w+@\\w+(\\.\\w+)+"; Pattern p=Pattern.compile(regex); while ((line=buff.readLine())!= null) { Matcher m=p.matcher(line); while (m.find()) { System.out.println(m.group()+";"); } } } }