欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java实现网络爬虫

程序员文章站 2022-06-05 18:55:14
...

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&degreefrom=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);
		}
	}
}