1. 程式人生 > >Java網頁資料抓取例項

Java網頁資料抓取例項

在很多行業中,要對行業資料進行分類彙總,及時分析行業資料,對於公司未來的發展,有很好的參照和橫向對比。所以,在實際工作,我們可能要遇到資料採集這個概念,資料採集的最終目的就是要獲得資料,提取有用的資料進行資料提取和資料分類彙總。

很多人在第一次瞭解資料採集的時候,可能無從下手,尤其是作為一個新手,更是感覺很是茫然,所以,在這裡分享一下自己的心得,希望和大家一起分享技術,如果有什麼不足,還請大家指正。寫出這篇目的,就是希望大家一起成長,我也相信技術之間沒有高低,只有互補,只有分享,才能使彼此更加成長

在網頁資料採集的時候,我們往往要經過這幾個大的步驟:

①通過URL地址讀取目標網頁②獲得網頁原始碼③通過網頁原始碼抽取我們要提取的目的資料④對資料進行格式轉換,獲得我們需要的資料。

這是一個示意圖,希望大家瞭解

瞭解了基本流程,下來,我以一個案例具體實現如何提取我們需要的資料,對於資料提取可以用正則表示式進行提取,也可以用httpclient+jsoup進行提取,此處,暫且不講解httpclient+jsou提取網頁資料的做法,以後會對httpclient+jsoup進行專門的講解,此處,先開始講解如何用正則表示式對資料進行提取。

我在這裡找到一個網站:http://www.ic.net.cn/userSite/publicQuote/quotes_list.php 我們要對裡面的資料進行提取操作,我們要提取的最終結果是產品的型號、數量、報價、供應商,首先,我們看到這個網站整個頁面預覽


其次我們看網頁原始碼結構:


上面原始碼可以很清楚的可以看到整個網頁原始碼結構,下來我們就對整個網頁資料進行提取

  1. import java.io.BufferedReader;  
  2. import java.io.InputStream;  
  3. import java.io.InputStreamReader;  
  4. import java.net.HttpURLConnection;  
  5. import java.net.URL;  
  6. import java.util.ArrayList;  
  7. import java.util.List;  
  8. import java.util.regex.Matcher;  
  9. import java.util.regex.Pattern;  
  10. publicclass HTMLPageParser {  
  11.     publicstaticvoid main(String[] args) throws Exception {  
  12.         //目的網頁URL地址
  13.         getURLInfo("http://www.ic.net.cn/userSite/publicQuote/quotes_list.php","utf-8");  
  14.     }  
  15.     publicstatic List<Product> getURLInfo(String urlInfo,String charset) throws Exception {  
  16.         //讀取目的網頁URL地址,獲取網頁原始碼
  17.         URL url = new URL(urlInfo);  
  18.         HttpURLConnection httpUrl = (HttpURLConnection)url.openConnection();  
  19.         InputStream is = httpUrl.getInputStream();  
  20.         BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));  
  21.         StringBuilder sb = new StringBuilder();  
  22.         String line;  
  23.         while ((line = br.readLine()) != null) {  
  24.             //這裡是對連結進行處理
  25.             line = line.replaceAll("</?a[^>]*>""");  
  26.             //這裡是對樣式進行處理
  27.             line = line.replaceAll("<(\\w+)[^>]*>""<$1>");  
  28.             sb.append(line);  
  29.         }  
  30.         is.close();  
  31.         br.close();  
  32.         //獲得網頁原始碼
  33.         return getDataStructure(sb.toString().trim());  
  34.     }  
  35.     static Pattern proInfo   
  36.            = Pattern.compile("<div>(.*?)</div>\\s*<div>(.*?)</div>\\s*<div>(.*?)</div>\\s*<div>(.*?)</div>\\s*<div>(.*?)</div>", Pattern.DOTALL);  
  37.     privatestatic List<Product> getDataStructure(String str) {  
  38.         //運用正則表示式對獲取的網頁原始碼進行資料匹配,提取我們所要的資料,在以後的過程中,我們可以採用httpclient+jsoup,
  39.         //現在暫時運用正則表示式對資料進行抽取提取
  40.         String[] info = str.split("</li>");  
  41.         List<Product> list = new ArrayList<Product>();  
  42.         for (String s : info) {  
  43.             Matcher m = proInfo.matcher(s);  
  44.             Product p = null;  
  45.             if (m.find()) {  
  46.                 p = new Product();  
  47.                 //設定產品型號
  48.                 String[] ss = m.group(1).trim().replace(" """).split(">");  
  49.                 p.setProStyle(ss[1]);  
  50.                 //設定產品數量
  51.                 p.setProAmount(m.group(2).trim().replace(" """));  
  52.                 //設定產品報價
  53.                 p.setProPrice(m.group(4).trim().replace(" """));  
  54.                 //設定產品供應商
  55.                 p.setProSupplier(m.group(5).trim().replace(" """));  
  56.                 list.add(p);  
  57.             }  
  58.         }  
  59.         //這裡對集合裡面不是我們要提取的資料進行移除
  60.         list.remove(0);  
  61.         for (int i = 0; i < list.size(); i++) {  
  62.             System.out.println("產品型號:"+list.get(i).getProStyle()+",產品數量:"+list.get(i).getProAmount()  
  63.                     +",產品報價:"+list.get(i).getProPrice()+",產品供應商:"+list.get(i).getProSupplier());  
  64.         }  
  65.         return list;  
  66.     }  
  67. }  
  68. class Product {  
  69.     private String proStyle;//產品型號
  70.     private String proAmount;//產品數量
  71.     private String proPrice;//產品報價
  72.     private String proSupplier;//產品供應商
  73.     public String getProStyle() {  
  74.         return proStyle;  
  75.     }  
  76.     publicvoid setProStyle(String proStyle) {  
  77.         this.proStyle = proStyle;  
  78.     }  
  79.     public String getProSupplier() {  
  80.         return proSupplier;  
  81.     }  
  82.     publicvoid setProSupplier(String proSupplier) {  
  83.         this.proSupplier = proSupplier;  
  84.     }  
  85.     public String getProAmount() {  
  86.         return proAmount;  
  87.     }  
  88.     publicvoid setProAmount(String proAmount) {  
  89.         this.proAmount = proAmount;  
  90.     }  
  91.     public String getProPrice() {  
  92.         return proPrice;  
  93.     }  
  94.     publicvoid setProPrice(String proPrice) {  
  95.         this.proPrice = proPrice;  
  96.     }  
  97.     public Product() {  
  98.     }  
  99.     @Override
  100.     public String toString() {  
  101.         return"Product [proAmount=" + proAmount + ", proPrice=" + proPrice  
  102.                 + ", proStyle=" + proStyle + ", proSupplier=" + proSupplier  
  103.                 + "]"