Java網頁資料抓取例項
阿新 • • 發佈:2019-02-03
在很多行業中,要對行業資料進行分類彙總,及時分析行業資料,對於公司未來的發展,有很好的參照和橫向對比。所以,在實際工作,我們可能要遇到資料採集這個概念,資料採集的最終目的就是要獲得資料,提取有用的資料進行資料提取和資料分類彙總。
很多人在第一次瞭解資料採集的時候,可能無從下手,尤其是作為一個新手,更是感覺很是茫然,所以,在這裡分享一下自己的心得,希望和大家一起分享技術,如果有什麼不足,還請大家指正。寫出這篇目的,就是希望大家一起成長,我也相信技術之間沒有高低,只有互補,只有分享,才能使彼此更加成長。
在網頁資料採集的時候,我們往往要經過這幾個大的步驟:
①通過URL地址讀取目標網頁②獲得網頁原始碼③通過網頁原始碼抽取我們要提取的目的資料④對資料進行格式轉換,獲得我們需要的資料。
這是一個示意圖,希望大家瞭解
瞭解了基本流程,下來,我以一個案例具體實現如何提取我們需要的資料,對於資料提取可以用正則表示式進行提取,也可以用httpclient+jsoup進行提取,此處,暫且不講解httpclient+jsou提取網頁資料的做法,以後會對httpclient+jsoup進行專門的講解,此處,先開始講解如何用正則表示式對資料進行提取。
我在這裡找到一個網站:http://www.ic.net.cn/userSite/publicQuote/quotes_list.php 我們要對裡面的資料進行提取操作,我們要提取的最終結果是產品的型號、數量、報價、供應商,首先,我們看到這個網站整個頁面預覽
其次我們看網頁原始碼結構:
上面原始碼可以很清楚的可以看到整個網頁原始碼結構,下來我們就對整個網頁資料進行提取
- import java.io.BufferedReader;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.util.ArrayList;
- import java.util.List;
-
import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- publicclass HTMLPageParser {
- publicstaticvoid main(String[] args) throws Exception {
- //目的網頁URL地址
- getURLInfo("http://www.ic.net.cn/userSite/publicQuote/quotes_list.php","utf-8");
- }
- publicstatic List<Product> getURLInfo(String urlInfo,String charset) throws Exception {
- //讀取目的網頁URL地址,獲取網頁原始碼
- URL url = new URL(urlInfo);
- HttpURLConnection httpUrl = (HttpURLConnection)url.openConnection();
- InputStream is = httpUrl.getInputStream();
- BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));
- StringBuilder sb = new StringBuilder();
- String line;
- while ((line = br.readLine()) != null) {
- //這裡是對連結進行處理
- line = line.replaceAll("</?a[^>]*>", "");
- //這裡是對樣式進行處理
- line = line.replaceAll("<(\\w+)[^>]*>", "<$1>");
- sb.append(line);
- }
- is.close();
- br.close();
- //獲得網頁原始碼
- return getDataStructure(sb.toString().trim());
- }
- static Pattern proInfo
- = Pattern.compile("<div>(.*?)</div>\\s*<div>(.*?)</div>\\s*<div>(.*?)</div>\\s*<div>(.*?)</div>\\s*<div>(.*?)</div>", Pattern.DOTALL);
- privatestatic List<Product> getDataStructure(String str) {
- //運用正則表示式對獲取的網頁原始碼進行資料匹配,提取我們所要的資料,在以後的過程中,我們可以採用httpclient+jsoup,
- //現在暫時運用正則表示式對資料進行抽取提取
- String[] info = str.split("</li>");
- List<Product> list = new ArrayList<Product>();
- for (String s : info) {
- Matcher m = proInfo.matcher(s);
- Product p = null;
- if (m.find()) {
- p = new Product();
- //設定產品型號
- String[] ss = m.group(1).trim().replace(" ", "").split(">");
- p.setProStyle(ss[1]);
- //設定產品數量
- p.setProAmount(m.group(2).trim().replace(" ", ""));
- //設定產品報價
- p.setProPrice(m.group(4).trim().replace(" ", ""));
- //設定產品供應商
- p.setProSupplier(m.group(5).trim().replace(" ", ""));
- list.add(p);
- }
- }
- //這裡對集合裡面不是我們要提取的資料進行移除
- list.remove(0);
- for (int i = 0; i < list.size(); i++) {
- System.out.println("產品型號:"+list.get(i).getProStyle()+",產品數量:"+list.get(i).getProAmount()
- +",產品報價:"+list.get(i).getProPrice()+",產品供應商:"+list.get(i).getProSupplier());
- }
- return list;
- }
- }
- class Product {
- private String proStyle;//產品型號
- private String proAmount;//產品數量
- private String proPrice;//產品報價
- private String proSupplier;//產品供應商
- public String getProStyle() {
- return proStyle;
- }
- publicvoid setProStyle(String proStyle) {
- this.proStyle = proStyle;
- }
- public String getProSupplier() {
- return proSupplier;
- }
- publicvoid setProSupplier(String proSupplier) {
- this.proSupplier = proSupplier;
- }
- public String getProAmount() {
- return proAmount;
- }
- publicvoid setProAmount(String proAmount) {
- this.proAmount = proAmount;
- }
- public String getProPrice() {
- return proPrice;
- }
- publicvoid setProPrice(String proPrice) {
- this.proPrice = proPrice;
- }
- public Product() {
- }
- @Override
- public String toString() {
- return"Product [proAmount=" + proAmount + ", proPrice=" + proPrice
- + ", proStyle=" + proStyle + ", proSupplier=" + proSupplier
-
+ "]"