爬虫基础练习: 基于 java + Jsoup + xpath 爬取51job网站

最基本的网页爬虫练习

爬取51jb网站,并将数据写入Excel中

  • 需要导入jsoup包和POI相关包

JSoup简介

jsoup是一款Java的HTML解析器,主要用来对HTML解析, 可通过DOM,CSS以及类似于jQuery的操作方法取出和操作数据。
主要功能

  1. 从一个URL,文件或字符串中解析HTML
  2. 使用DOM或CSS选择器来查找、取出数据使用DOM或CSS选择器来查
    找、取出数据
  3. 可操作HTML元素、属性、文本可操作HTML元素、属性、文本

XPath

XPath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML文档中查找信息的语言。最初是用来搜寻 XML 文档的,但同样适用于 HTML 文档的搜索。所以在做爬虫时完全可以使用 XPath 做相应的信息抽取。
爬虫基础练习: 基于 java + Jsoup + xpath 爬取51job网站_第1张图片

代码

package com.woniuxy.crawl;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 爬虫工具类
 * 伪造User-Agent,降低IP被封的概率
 */
public class CrawlUtil {
	private static List<String> userAgents = new ArrayList<>();
	
	static {
		userAgents.add("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36");
		userAgents.add("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1");
		userAgents.add("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36");
		userAgents.add("Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50");
		userAgents.add("Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11");
		userAgents.add("Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)");
		userAgents.add("Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)");
		userAgents.add("Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)");
		userAgents.add("Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)");
		userAgents.add("Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;");
	}
	
	public static String getUserAgent() {
		int index = new Random().nextInt(10); // 随机获取一个0-9的整数作为索引
		return userAgents.get(index);
	}
	
}
package com.woniuxy.crawl;

import java.io.FileOutputStream;
import java.util.List;

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 org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import cn.wanghaomiao.xpath.model.JXDocument;
import cn.wanghaomiao.xpath.model.JXNode;

/**
 * 基于Jsoup + xpath 爬取51jb网站,写入到excel中
 * 优化 : 
 * 		伪装浏览器
 * 		爬取多页数据
 * 		多线程爬虫
 *  爬虫  反爬虫  反反爬虫 : 有些网站会自动监测是否是恶意的爬虫攻击
 */
public class Crawl_51Job {

	@SuppressWarnings("all")
	public static void main(String[] args) {
		// 1.准备一个网址用来爬虫
		String url = "https://search.51job.com/list/020000,000000,0000,00,9,99,java,2,1.html";
		// 2.通过jsoup发送请求获取网页源码
		Connection conn = Jsoup.connect(url);
		// 3.伪造User-Agent(模拟一个真实的浏览器访问)
		conn.header("User-Agent", CrawlUtil.getUserAgent());
		try {
			// 4.获取网页源码并转换成文档树结构
			Document document = conn.get();
			// 5.将document转换成xpath能解析的文档树结构
			JXDocument jdoc = new JXDocument(document); // 此处可以使用xpath语法
			// 6.使用xpath语法来解析html文档来完成数据清洗
			List<JXNode> elNodes = jdoc.selN("//div[@id=resultList]/div[@class=el]");

			// 1. 新建Excel工作簿
			XSSFWorkbook workbook = new XSSFWorkbook();
			// 2. 创建一个sheet
			XSSFSheet sheet = workbook.createSheet("java");
			// 3. 创建第一行
			XSSFRow row0 = sheet.createRow(0);
			// 4. 操作行中的列
			XSSFCell cell00 = row0.createCell(0);
			cell00.setCellValue("公司");
			XSSFCell cell01 = row0.createCell(1);
			cell01.setCellValue("职位");
			// 5.数据写入excel
			for (int i = 0; i < elNodes.size(); i++) {
				String company = elNodes.get(i).sel("/span[@class=t2]/a/@title").get(0).toString();
				String title = elNodes.get(i).sel("/p/span/a/@title").get(0).toString();
				XSSFRow row = sheet.createRow(i+1); // 第二行开始
				row.createCell(0).setCellValue(company);
				row.createCell(1).setCellValue(title);
			}
			// 6.将内存数据写出到Excel文件中
			FileOutputStream fos = new FileOutputStream("post.xlsx");
			workbook.write(fos);
			workbook.close();
			System.out.println("Excel写出成功");
//			for (JXNode elNode : elNodes) { // 获取到每一个class="el"的div
//				String title = elNode.sel("/p/span/a/@title").get(0).toString();
//				String company = elNode.sel("/span[@class=t2]/a/@title").get(0).toString();
//				System.out.println(company + ":" + title);
//			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}

效果图

爬虫基础练习: 基于 java + Jsoup + xpath 爬取51job网站_第2张图片

你可能感兴趣的:(java)