概要:
使用java实现爬虫,并且把数据保存到excel表中格式化保存;目标网站如下,爬取该网站的农产品价格!!!!
一、知识准备
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;
}
}
四、效果展示
本次爬取实现爬取1000页数据的效果!!!!