概要:

     使用java实现爬虫,并且把数据保存到excel表中格式化保存;目标网站如下,爬取该网站的农产品价格!!!!

java 如何获取一个网页上的文本 java获取网页表格数据_爬虫

一、知识准备

jsoup:

jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

jsoup官网:http://jsoup.org

目前最新版本:jsoup-1.10.2.jar

的主要功能如下:

从一个 URL,文件或字符串中解析 HTML;

2. 使用 DOM 或 CSS 选择器来查找、取出数据;

3. 可操作 HTML 元素、属性、文本;

POI:

POI全称 Poor Obfuscation Implementation,利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能。官网:http://poi.apache.org,POI支持office的所有版本。

二、maven工程的依赖jar准备

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.dark</groupId>
	<artifactId>reptile</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<dependencies>
	
	  <!--   jsoup和httpclient -->
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpclient</artifactId>
			<version>4.5.3</version>
		</dependency>
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpmime</artifactId>
			<version>4.5.3</version>
		</dependency>


		<dependency>
			<groupId>org.jsoup</groupId>
			<artifactId>jsoup</artifactId>
			<version>1.10.2</version>
		</dependency>


   
       <!--   poi的依赖包 -->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.16</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml-schemas</artifactId>
			<version>3.16</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-excelant</artifactId>
			<version>3.16</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-examples</artifactId>
			<version>3.16</version>
		</dependency>
	</dependencies>

</project>

三、代码实现

3.1、创建product对象实现,数据的接收和过渡;

package com.dark.pojo;
/**  作者:darkjazz 
*    日期:2018年3月22日 下午7:32:03
*/
public class Product {
     private String productName;
     private String lowerPrice;
     private String averagePrice;
     private String maxPrice;
     //规格
     private String specs;
     //单位
     private String unit;
     //发布日期
     private String date;

	@Override
	public String toString() {
		return "Product [productName=" + productName + ", lowerPrice=" + lowerPrice + ", averagePrice=" + averagePrice
				+ ", maxPrice=" + maxPrice + ", specs=" + specs + ", unit=" + unit + ", date=" + date + "]";
	}

	public String getProductName() {
		return productName;
	}

	public void setProductName(String productName) {
		this.productName = productName;
	}

	public String getLowerPrice() {
		return lowerPrice;
	}

	public void setLowerPrice(String lowerPrice) {
		this.lowerPrice = lowerPrice;
	}

	public String getAveragePrice() {
		return averagePrice;
	}

	public void setAveragePrice(String averagePrice) {
		this.averagePrice = averagePrice;
	}

	public String getMaxPrice() {
		return maxPrice;
	}

	public void setMaxPrice(String maxPrice) {
		this.maxPrice = maxPrice;
	}

	public String getSpecs() {
		return specs;
	}

	public void setSpecs(String specs) {
		this.specs = specs;
	}

	public String getUnit() {
		return unit;
	}

	public void setUnit(String unit) {
		this.unit = unit;
	}

	public String getDate() {
		return date;
	}

	public void setDate(String date) {
		this.date = date;
	}
	
}

3.2、使用poi的excel操作的方法,把下一步爬取到的数据保存到本地硬盘的excel表中

package com.dark.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.dark.pojo.Product;

/**  作者:darkjazz
*    日期:2018年3月22日 下午8:00:33
*/
public class POItoExcel {
     public static void main(String[] args) {
		
	}
	public static void toExcel(List<Product> list) throws FileNotFoundException, IOException{
		 
        //新建文档   
        XSSFWorkbook workBook=new XSSFWorkbook();
        
        //创建表
        XSSFSheet sheet=workBook.createSheet();
        
           //合并标的标题
      		CellRangeAddress cra=new CellRangeAddress(0,1, 0, 6);
      		sheet.addMergedRegion(cra);
      		//显示的文本为左上角的内容
      		Row row2=sheet.createRow(0);
      		Cell cell=row2.createCell(0);
      		cell.setCellValue("商品价格表");
      		//设置单元格的格式
      		CellStyle cs=workBook.createCellStyle();
      		cs.setAlignment(HorizontalAlignment.CENTER);
      		cs.setVerticalAlignment(VerticalAlignment.CENTER);
      		cs.setFillBackgroundColor((short) 59);
      	        cell.setCellStyle(cs);
      		//表头
      		Row row=sheet.createRow(2);
      		
      		Cell cell11=row.createCell(0);
      		cell11.setCellValue("品名");
      		Cell cell22=row.createCell(1);
      		cell22.setCellValue("最低价");
      		Cell cell33=row.createCell(2);
      		cell33.setCellValue("平均价");
      		Cell cell44=row.createCell(3);
      		cell44.setCellValue("最高价");
      		Cell cell55=row.createCell(4);
      		cell55.setCellValue("规格");
      		Cell cell66=row.createCell(5);
      		cell66.setCellValue("单位");
      		Cell cell77=row.createCell(6);
      		cell77.setCellValue("发布日期");
      	    //表中的数据

        for(int i=0;i<list.size();i++){
        //创建行
        XSSFRow row4=sheet.createRow(i+3);
  
        //创建单元格
        XSSFCell cell1=row4.createCell(0);
        XSSFCell cell2=row4.createCell(1);
        XSSFCell cell3=row4.createCell(2);
        XSSFCell cell4=row4.createCell(3);
        XSSFCell cell5=row4.createCell(4);
        XSSFCell cell6=row4.createCell(5);
        XSSFCell cell7=row4.createCell(6);
        	//在单元格中写入数据
        cell1.setCellValue(list.get(i).getProductName());
        cell2.setCellValue(list.get(i).getLowerPrice());
        cell3.setCellValue(list.get(i).getAveragePrice());
        cell4.setCellValue(list.get(i).getMaxPrice());
        cell5.setCellValue(list.get(i).getSpecs());
        cell6.setCellValue(list.get(i).getUnit());
        cell7.setCellValue(list.get(i).getDate());
        }
         //把这个文档写入文件
        workBook.write(new FileOutputStream(new File("你的目标目录"+\\product.xlsx")) );
        System.out.println("写入excel完毕");
        //关闭流
        workBook.close();
		
	}
     
     
}

3.3、主方法,使用jsout实现爬虫,并调用3.2中的方法实现写入文件

package com.dark.reptile;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import com.dark.pojo.Product;
import com.dark.util.POItoExcel;

/**  作者:darkjazz 
*    日期:2018年3月22日 下午7:11:20
*/
public class Reptile {
       public static void main(String[] args) throws FileNotFoundException, IOException {
    	   List<Product> list=getInfor("http://www.xinfadi.com.cn/marketanalysis/1/list/1.shtml", 1000);
    	   POItoExcel.toExcel(list);
	}
	
       //可以指定网址,并且按照需求爬取前多少页的数据
       public static List<Product> getInfor(String url,int maxPage){
    	   List<Product> proList=new ArrayList<Product>();
    	   for(int i=2;i<=maxPage+1;i++){
    	      
    		 try {
    			
				Document doc=Jsoup.connect(url).get();
				Elements table=doc.select(".hq_table");
				Elements tbody=table.select("tbody");
				Elements trList=tbody.select("tr");
				trList.remove(0);
				for(Element tr:trList){
					Elements tdList=tr.select("td");
					Product product=new Product();
					product.setProductName(tdList.get(0).html().toString());
					product.setLowerPrice(tdList.get(1).html().toString());
					product.setAveragePrice(tdList.get(2).html().toString());
					product.setMaxPrice(tdList.get(3).html().toString());
					product.setSpecs(tdList.get(4).html().toString());
					product.setUnit(tdList.get(5).html().toString());
					product.setDate(tdList.get(6).html().toString());
					/*System.out.println(product.toString());*/
					proList.add(product);
				}
				
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    
    	   url="http://www.xinfadi.com.cn/marketanalysis/1/list/"+i+".shtml";
    	   }
    	   System.out.println("爬取前"+maxPage+"成功");
		return proList;
    	   
       }
	
	
	
}

四、效果展示


java 如何获取一个网页上的文本 java获取网页表格数据_jsout_02


本次爬取实现爬取1000页数据的效果!!!!