使用java实现爬虫,并且把数据保存到excel表中格式化保存;目标网站如下,爬取该网站的农产品价格!!!!
jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。
jsoup官网:http://jsoup.org
目前最新版本:jsoup-1.10.2.jar
jsoup 的主要功能如下:
1. 从一个 URL,文件或字符串中解析 HTML;
2. 使用 DOM 或 CSS 选择器来查找、取出数据;
3. 可操作 HTML 元素、属性、文本;
POI全称 Poor Obfuscation Implementation,利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能。官网:http://poi.apache.org ,POI支持office的所有版本。
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.dark
reptile
0.0.1-SNAPSHOT
org.apache.httpcomponents
httpclient
4.5.3
org.apache.httpcomponents
httpmime
4.5.3
org.jsoup
jsoup
1.10.2
org.apache.poi
poi
3.16
org.apache.poi
poi-ooxml-schemas
3.16
org.apache.poi
poi-excelant
3.16
org.apache.poi
poi-examples
3.16
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 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
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 list=getInfor("http://www.xinfadi.com.cn/marketanalysis/1/list/1.shtml", 1000);
POItoExcel.toExcel(list);
}
//可以指定网址,并且按照需求爬取前多少页的数据
public static List getInfor(String url,int maxPage){
List proList=new ArrayList();
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;
}
}
欢迎访问我的github首页获取
博主的github地址,获取当前项目源码