Java实现网络爬虫
1.URL类和URLConnection扩展
1.1URL学习
-
(Uniform Resource Locator)中文名为统一资源定位符,也被俗称为网页地址。表示为互联网上的资源,如网页或者FTP地址但是在Java中表示为处理网页请求的一个类,Java的URL类可以让访问网络资源就像是访问你本地的文件夹一样方便快捷。我们通过使用java.net.URL;的URL类 就可以经由URL完成读取和修改数据的操作。通过一个URL连接,我们就可以确定资源的位置,
-
简而言之:通过URL类可以使Java程序很方便的操作网络资源
-
小结:URL类就是一个网络资源操作的类
1.2URL的基本使用 案例
package com.Li.url01;
import java.net.MalformedURLException;
import java.net.URL;
/**
* @Description: url的基本使用
* @auther:Li Ya Hui
* @Time:2021年4月24日上午10:46:38
*/
public class Test {
public static void main(String[] args) throws MalformedURLException {
//1.指定网络资源地址 路径字符串
String urlpath = "https://so.youku.com/search_video/q_%E9%92%A2%E9%93%81%E4%BE%A0?spm=a2hww.11359951.#qheader_search~10";
//2.初始化URL类
URL realurl = new URL(urlpath);
//请求网络主机
System.out.println("主机是:"+realurl.getHost());
//协议
System.out.println("协议是:"+realurl.getProtocol());
//默认端口
System.out.println("默认的端口是:"+realurl.getDefaultPort());
//请求参数
System.out.println("请求参数是:"+realurl.getQuery());
}
}
1.3URL的应用举例
-
通过URL获取HTML的内容实现另存为
-
百度大部分标签通过动态加载(反爬虫的一种)实现,所以目前方法有所限制
package com.Li.url02;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
/**
* @Description: URL的应用举例 :通过URL获取HTML的内容
* @auther:Li Ya Hui
* @Time:2021年4月24日上午11:05:22
*/
public class Test {
public static void main(String[] args) throws IOException {
//实例化一个URL对象
URL url = new URL("http://www.baidu.com");
//根据url对象获取一个输入流
InputStream is = url.openStream();
//设定输入流的编码集为utf-8
InputStreamReader isr = new InputStreamReader(is, "utf-8");
//加入到缓存读取对象中
BufferedReader br = new BufferedReader(isr);
//设置要保存的路径,
File filepath = new File("E://zp");//要创建目录 的路径
File file = new File("E://zp//baidu.html");
//创建目录
filepath.mkdirs();
//将file加入到print writer对象中
PrintWriter pwriter = new PrintWriter(file);
//创建一个行数
String hang= "";
while ((hang=br.readLine())!=null) {//循环逐行读取
pwriter.print(hang);
pwriter.write(hang);
pwriter.flush();
}
//关闭打印流
pwriter.close();
//关闭缓冲流
br.close();
//关闭输入流
isr.close();
//关闭输入获取流
is.close();
}
}
1.4. URLConnection使用方法(通过URL进而获取到 选讲)
使用方法
- URLConnection是URL类的升级,其目的是更加方便的进行网络资源的请求和操作的
- 利用可以实现简单的爬虫
使用URLConnection对象一般分为以下7步
1:创建一个URL对象;
2:通过URL对象的openConnection方法创建URLConnection对象;
3:通过URLConnection对象提供的方法可以设置参数和一般请求属性。常用的请求属性设置方式有以下几种:
-
~public void setRequestProperty(String key,String value)设置指定的请求关键字对应的值
-
~public void setDoInput(boolean doinput)设置是否使用URL连接进行输入,默认值为true
-
~public void setDoOutput(boolean dooutput)设置是否使用URL连接进行输出,默认值为false,如果设置为true,就可以获取一个字节输出流,用于将数据发送到服务器
-
~public void setUseCaches(boolean usecaches)设置此连接是否使用任何可用的缓存,默认值为true
4:调用URLConnection对象的connect方法连接到该远程资源
5:连接到服务器后,就可以查询头部信息了,查询头部信息常用方法有以下几种:
-
~public String getHeaderField(String name)返回指定头字段的值
-
~public Map<String,List>getHeaderFields()返回头字段的不可修改的Map
-
~public String getContentType()返回content-type头字段的值
-
~public String getContentEncoding()返回content-encoding的值
6:获取输入流访问资源数据。使用getInputStream 方法,获取一个字节输入流,以便读取资源信息
7:获取输出流并写数据
1.5.URLConnection 的简介和基本用法
package com.Li.url01;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @Description: URLConnection 的简介和基本用法
* @auther:Li Ya Hui
* @Time:2021年4月24日下午10:08:22
*/
public class Test03 {
public static void main(String[] args) throws IOException {
//1.创建URL对象
URL url = new URL("https://search.51job.com/list/010000,000000,0000,00,9,99,java,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=");
//2.通过URL对象中的openConnection()方法创建URLConnection对象
URLConnection connection = url.openConnection();
//3.调用URLConnection对象提供的connect方法连接远程服务
connection.connect();
//4.连接服务器后,就可以查询头部信息了
Map<String,List<String>> headerMap = connection.getHeaderFields();
Set<String> keySet = headerMap.keySet();
Iterator<String> it = keySet.iterator();
//遍历出爬到的,获取标题字段
while (it.hasNext())
{
String key = it.next();
List<String> list = headerMap.get(key);
StringBuffer sb=new StringBuffer();
for (int i = 0; i <list.size(); i++)
{
if(i>0)
{
sb.append(",");
}
String str = list.get(i);
sb.append(str);
}
// System.out.println(key+":"+sb);
}
//整体html
//6.获取输入流,从中读取资源数据
InputStream inputStream = connection.getInputStream();
InputStreamReader reader=new InputStreamReader(inputStream);
BufferedReader bufferedReader=new BufferedReader(reader);
String line="";
while ((line=bufferedReader.readLine())!=null)
{
System.out.println(line);
}
//7.关闭流对象
bufferedReader.close();
reader.close();
inputStream.close();
}
}
1.6.利用url爬取网页的图片
package com.Li.url01;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
/**
* @desc 利用url爬取网页的图片 UrlConnection实现图片的下载
* @author wyh
* @time 2018-08-22
*
*/
public class Test04 {
public static void main(String[] args) throws IOException {
//1.创建URL对象
URL url = new URL("https://imgsa.baidu.com/forum/w%3D580/sign=a6b7ab9a10dfa9ecfd2e561f52d1f754/48c7a7efce1b9d16a99e53e7f2deb48f8d5464d8.jpg");
//2.通过URL对象中的openConnection()方法创建URLConnection对象
URLConnection connection = url.openConnection();
//3.调用URLConnection对象提供的connect方法连接远程服务
// 设定请求的方法,默认是GET
connection.setRequestProperty("method", "GET");
// 设置字符编码
connection.setRequestProperty("Charset", "UTF-8");
connection.connect();
int fileLength = connection.getContentLength();//获取文件的大小
//4.在客户端(Test04.java)与服务端(网页)建立一个输入流
InputStream inputStream = connection.getInputStream();
//5.将输入流转变成缓冲流
BufferedInputStream bin = new BufferedInputStream(inputStream);
//6.设定图片保存的路径
String path = "E:\\zp\\uc\\1.jpg";
File file = new File(path);//根据路径开辟一个内存文件
//如果路径不存在就创建一个路径
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
//创建一个输出流
OutputStream out = new FileOutputStream(file);
int size = 0;
int len = 0;
byte[] buf = new byte[1024];//构建一个缓冲区块
while ((size = bin.read(buf)) != -1) //逐行去读
{
len += size;
out.write(buf, 0, size);//写入
// 打印下载百分比
System.out.println("下载了-------> " + len * 100 / fileLength +"%\n");
}
//关闭流对象
bin.close();
out.close();
inputStream.close();
}
}
2.Commons-io.jar
2.1Commons讲解
-
commons-io:是一款处理io流的工具包,封装了很多处理io流和文件的方法,可以大大简化我们处理io流和操作文件的代码。
-
从commons-io的官方使用文档可以看出,它主要分为
- 工具类
- 尾端类
- 迭代器
- 文件过滤器
- 文件比较器
- 扩展流
-
简而言之:是Apache基金会出产的一个能更加方便进行i/o操作的jar
-
官网地址:http://commons.apache.org/proper/commons-io/
-
下载 :http://commons.apache.org/proper/commons-io/download_io.cgi
2.2.Commons主要的类和方法
工具类包括:FileUtils、IOUtils、FilenameUtils和FileSystemUtils,前三者的方法并没有多大的区别,只是操作的对象不同,
- FileUtils主要操作File类;FileUtils:处理文件的打开,移动,读取和判断文件是否存在
- IOUtils主要操作IO流;
- FilenameUtils则是操作文件名;
- FileSystemUtils包含了一些JDK没有提供的用于访问文件系统的实用方法。
2.3.FileUtils工具类的使用案例 ( 简单好用 )
package com.Li.Commmons;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import org.apache.commons.io.FileUtils;
/**
* @Description: 利用Commons-io.jar创建文件的工具类
* @auther:Li Ya Hui
* @Time:2021年4月25日上午11:05:45
*/
public class FileTools {
/**
* @desc 1.读取文件中的每一行
* @param pathname
* @throws IOException
*/
public void getLinesByRead(String pathname) throws IOException{
//下面的代码用于读取磁盘上的某个文件
File file=new File(pathname);
List<String> list = FileUtils.readLines(file, "GBK");
for (String every : list)
{
System.out.println(every);
}
}
/**
* @desc 2.将字符串写入到文件中
* @param pathname
* @param str
* @throws IOException
*/
public void strWriteToFile(String pathname,String str) throws IOException
{
File file=new File(pathname);
FileUtils.writeStringToFile(file, str, "GBK", true);
System.out.println("字符串写入成功了");
}
/**
* @desc 3.逐行写入文件中,但是效果会是文件的复制
* @param srcPath
* @param purposePath
* @throws IOException
*/
public void strWriteToFile2(String srcPath,String purposePath) throws IOException
{
File file =new File(srcPath);
List<String> line = FileUtils.readLines(file, "GBK");//逐行的读取
File file2=new File(purposePath);
FileUtils.writeLines(file2, line);
System.out.println("逐行写入文件成功了");
}
/**
* @desc 4.文件复制
* @param srcPath
* @param purposePath
* @throws IOException
*/
public void fileCopy(String srcPath,String purposePath) throws IOException
{
File srcFile=new File(srcPath);
File purposeFile=new File(purposePath);
FileUtils.copyFile(srcFile, purposeFile);
System.out.println("文件复制成功了");
}
/**
* @desc 5.根据URL进行赋值,产生的结果就是相当于是另存为
* @param url
* @param pathname
* @throws Exception
*/
public void urlSaveAsFile(String url,String pathname) throws Exception
{
URL urlHtml=new URL(url);
File file=new File(pathname);
FileUtils.copyURLToFile(urlHtml, file);
System.out.println("另存为成功了");
}
/**
* @desc 6.删除路径下的文件和文件夹
* @param pathname
* @throws Exception
*/
public void delete(String pathname) throws Exception
{
File file=new File(pathname);
FileUtils.deleteDirectory(file);
}
}
//测试类
package com.Li.Commmons;
/**
* @Description: 测试类:测试Common-io包
* @auther:Li Ya Hui
* @Time:2021年4月25日上午11:05:16
*/
public class Test01 {
public static void main(String[] args) throws Exception {
//实例化工具类
FileTools fts=new FileTools();
//读取文件中的每一行
fts.getLinesByRead("E:/123.txt");
//将字符串写入到文件中
fts.strWriteToFile("E:/123.txt", "沙漠之舟aaa");
//逐行写入文件,文件复制
fts.strWriteToFile2("E:/123.txt", "F:/123.txt");
//文件的复制
fts.fileCopy("E:/123.txt", "E:/cp/666.txt");
//网络音频的下载
fts.urlSaveAsFile("https://d-ring.i4.cn/audio/2019/09/02/15/1567407708580_446168.mp3", "E:/cp/mp3/123.mp3");
//文件夹的删除
fts.delete("E:/cp");
}
}
3.Jsoup
3.1.Jsoup解释
1.Jsoup:是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据
- 简而言之:Jsoup就是一个第3方的jar包,可以帮助我们很方便的实现爬虫
2.主要功能:
- 从一个URL,文件或字符串中解析HTML;
- 使用DOM或CSS选择器来查找、取出数据;
- 可操作HTML元素、属性、文本;
3.Jsoup的官方网址:http://www.open-open.com/jsoup/parsing-a-document.htm
3.2.爬取文本案例
package com.Li.Jsoup.Test;
import java.io.IOException;
import java.util.List;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
/**
* @Description: 爬取文本的测试类 //学校官网
* @auther:Li Ya Hui
* @Time:2021年4月25日下午12:19:59
*/
public class Test {
public static void main(String[] args) throws IOException {
//利用jsoup爬取文本内容
//指定网络资源地址
String urlHtml = "https://www.hbsi.edu.cn/xygk/xyjj.htm";
//通过jsoup获取Document对象
Document document = Jsoup.connect(urlHtml).post();
//通过属性匹配获取爬取的文本内容
Elements text = document.getElementsByAttributeValue("id", "vsb_content_501");
//打印文本,arraylist
System.out.println(text.eachText());
//打印html
System.out.println(text.html());
//打印第一个找到的元素
System.out.println(text.first());
//包装好的方法有很多,一试就会
}
}
3.3.批量爬取网络图片
package com.Li.Jsoup.img;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
/**
* @Description: 利用jsoup 实现 批量爬取图片
* @auther:Li Ya Hui
* @Time:2021年4月25日下午1:55:52
*/
public class Test {
public static void main(String[] args) throws IOException {
String url = "https://tieba.baidu.com/p/6273075690?red_tag=1517420026";
//通过Jsoup创建Document对象 post方式连接到网页源码
Document document = Jsoup.connect(url).post();
//设置匹配图片后缀为.jpg 的正则表达式
String regex = "img[src$=.jpg]";
//图片路径的list
List<String> list = new ArrayList<String>();
//获取所有图片
Elements imgList = document.select(regex);
//遍历图片元素
for (int i = 0; i < imgList.size(); i++)
{
//获取图片元素
Element everyImgEle = imgList.get(i);
//获取src属性
String imgurl = everyImgEle.attr("src");
if (imgurl.startsWith("https"))
{
//将路径存入列表
list.add(imgurl);
}
}
//遍历路径 调用保存图片方法
for (int j = 0; j < list.size(); j++) {
//下载图片 保存图片
download(list.get(j), "E://img//", 0+"-"+j);
}
}
/**
* 自定义函数:保存图片
* @param imgUrl
* @param pathName
* @param fileName
* @throws IOException
*/
//保存图片方法
public static void download(String imgUrl , String pathName , String fileName ) throws IOException
{
//文件名
String finshpath = pathName+fileName+".jpg";
System.out.println(finshpath);
//下载地址
URL url = new URL(imgUrl);
File filepath = new File(finshpath);
//将图片存储到指定文件
FileUtils.copyURLToFile(url, filepath);
}
}
3.4.利用Jsoup实现爬取音视频资源
package com.Li.Jsoup.videoAudio;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
/**
* @Description: 利用Jsoup实现爬取音视频资源
* @auther:Li Ya Hui
* @Time:2021年4月25日下午3:10:42
*/
public class Test {
public static void main(String[] args) throws IOException {
String path = "https://www.tukuppt.com/video/v104_c111/";
//获取网页资源
Document document = Jsoup.connect(path).get();
//视频标签cbox s-box video
Elements videobox = document.getElementsByAttributeValue("class", "cbox s-box video");
//Elements video = document.getElementsByTag("video");
for (int j = 0; j < videobox.size(); j++) {
String AudioUrlName = videobox.get(j).getElementsByTag("dt").get(0).text();
String video = videobox.get(j).getElementsByTag("video").get(0).attr("src");
System.out.println(AudioUrlName);
System.out.println(video);
downLoadMp3("http:"+video, "E://video//", AudioUrlName);
}
System.out.println(2&3);
}
public static void downLoadMp3(String everyMp3Url,String purposePath,String everyMp3Name) throws IOException
{
URL url = new URL(everyMp3Url);
String songName=purposePath+everyMp3Name+".mp4";
File file = new File(songName);//加入到内存中
FileUtils.copyURLToFile(url, file);//第一个参数:下载/复制/另存为的url;第二个参数:是存在什么地方且存为什么文件
System.out.println(songName+":下载成功");
}
}
4.利用jsoup爬取招聘网站(中华英才网)
4.1首先写一个job类
package com.Li.Zhaopin;
/**
* @Description: 工作类
* @auther:Li Ya Hui
* @Time:2021年4月28日上午10:33:27
*/
public class job {
private String jobName ; //岗位名称
private String date ; //发布日期
private String money ; //薪水
private String cityArea ;//地址
private String record ; //工作经验
private String nacture ; //学历
private String company ; //公司名称
//getter setter
public String getJobName() {
return jobName;
}
public void setJobName(String jobName) {
this.jobName = jobName;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getMoney() {
return money;
}
public void setMoney(String money) {
this.money = money;
}
public String getCityArea() {
return cityArea;
}
public void setCityArea(String cityArea) {
this.cityArea = cityArea;
}
public String getRecord() {
return record;
}
public void setRecord(String record) {
this.record = record;
}
public String getNacture() {
return nacture;
}
public void setNacture(String nacture) {
this.nacture = nacture;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
@Override
public String toString() {
return "job [jobName=" + jobName + ", date=" + date + ", money=" + money + ", cityArea=" + cityArea
+ ", record=" + record + ", nacture=" + nacture + ", company=" + company + "]";
}
}
4.2写一个爬虫处理类
package com.Li.Zhaopin;
/**
* @Description: 爬虫处理类
* @auther:Li Ya Hui
* @Time:2021年4月28日上午10/:38:25
*/
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.nodes.Node;
import org.jsoup.select.Elements;
public class JsoupHtml {
//获取Document对象
public Document getDocument(String url) throws IOException
{
//返回爬取到的Document
return Jsoup.connect(url).get();
}
//获取Document 来爬取 找到一定规律的信息
public List<job> getDataFromDocument(Document document)
{
//建一个list对象 用来存储每一个job
List<job> list = new ArrayList<job>();
// Elements jobList = document.getElementsByAttributeValue("class", "jobList pc_search_listclick");
//两种找div的方法
Elements jobList = document.select("div[class=jobList pc_search_listclick]");
//对 爬取到的 信息 进行 循环 切割
for (int i = 0; i < jobList.size(); i++) {
//每一次都创建一个存储工作类
job job = new job();
//招聘div
Element everyelement = jobList.get(i);
//子元素1
Element ul01 = everyelement.child(0);
//切割子元素文字
String[] ul01Array = ul01.text().split(" ");
//设置工作名
job.setJobName(ul01Array[0]);
//设置日期
job.setDate(ul01Array[1]);
//子元素2
Element ul02 = everyelement.child(1);
//切割文字
String[] ul02Array = ul02.text().split(" ");
List<String> ul02List = new ArrayList<String>();
for (String string : ul02Array) {
//进行二次数据筛选
if (!string.equals("|") && !string.equals("元/月"))
{
//筛选后的数据加进list
ul02List.add(string);
}
}
//存入数据
job.setMoney(ul02List.get(0));
job.setCityArea(ul02List.get(1));
job.setRecord(ul02List.get(2));
job.setNacture(ul02List.get(3));
job.setCompany(ul02List.get(5));
//job装入list
list.add(job);
}
return list;
}
}
4.3写一个Excell存储处理类
package com.Li.Zhaopin;
import java.io.File;
import java.io.IOException;
import java.util.List;
import jxl.Sheet;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
/**
* @Description: excel 处理工具类
* @auther:Li Ya Hui
* @Time:2021年4月28日下午4:22:52
*/
public class ExcellTools {
//将数据写入到excel中
public void writeExcel(List<job> jobList ,String pathName , String keyWord) throws IOException, RowsExceededException, WriteException, InterruptedException
{
//创建一个文件类
File file = new File(pathName);
//创建workbook //Excell
WritableWorkbook workBook = Workbook.createWorkbook(file);
//创建一个页 sheet
WritableSheet sheet = workBook.createSheet("zhyc_"+keyWord, 0);
//创建表头
sheet.addCell(new jxl.write.Label(0, 0, "岗位名称"));
sheet.addCell(new jxl.write.Label(1, 0, "发布日期"));
sheet.addCell(new jxl.write.Label(2, 0, "薪水"));
sheet.addCell(new jxl.write.Label(3, 0, "地址"));
sheet.addCell(new jxl.write.Label(4, 0, "工作经验"));
sheet.addCell(new jxl.write.Label(5, 0, "学历"));
sheet.addCell(new jxl.write.Label(6, 0, "公司名称"));
//将list中的数据写入到sheet中 (从第二行开始)
int row = 1;
for (int i = 0; i < jobList.size(); i++,row++) {
//取出job 对象
job job = jobList.get(i);
sheet.addCell(new Label(0, row, job.getJobName()));;
sheet.addCell(new Label(1, row, job.getDate()));;
sheet.addCell(new Label(2, row, job.getMoney()));;
sheet.addCell(new Label(3, row, job.getCityArea()));;
sheet.addCell(new Label(4, row, job.getRecord()));;
sheet.addCell(new Label(5, row, job.getNacture()));;
sheet.addCell(new Label(6, row, job.getCompany()));;
}
workBook.write();
System.out.println(Thread.currentThread().getName()+"正爬取在");
Thread.sleep(2000);
workBook.close();
}
}
4.4.最后写一下爬虫的测试类
package com.Li.Zhaopin;
import java.io.IOException;
import java.util.List;
import org.jsoup.nodes.Document;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
/**
* @Description: 测试类:测试利用爬虫获取招聘网站的信息
* @auther:Li Ya Hui
* @Time:2021年4月28日上午10:43:18
*/
public class Test {
public static void main(String[] args) throws IOException, RowsExceededException, WriteException, InterruptedException {
String keyWord = "python";
for (int i = 1; i <= 3; i++) {
String url = "https://search.chinahr.com/bj/job/pn"+i+"/?key="+keyWord;
JsoupHtml jsoupHtml = new JsoupHtml();
Document document = jsoupHtml.getDocument(url);
// System.out.println(document.body());
List<job> joblist = jsoupHtml.getDataFromDocument(document);
ExcellTools excellTools = new ExcellTools();
excellTools.writeExcel(joblist, "E://招聘//zhyc_"+keyWord+"0_"+i+".xls", keyWord);
}
}
}
上一篇: Linux下的用户管理
下一篇: 不应该让领导先走吗