jsoup爬虫项目基础用法,如何用jsoup从网上爬东西

时间:2022-10-31 09:15:02
package com.starry.service;

import java.io.IOException;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.dbutils.QueryRunner;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import com.starry.util.MyJDBCUtils;
import com.starry.utity.Job;

/**
* 这是一个方法类
* jsoup的使用方法
* 以下代码实验于智联招聘
* @author Starry
*
*/
public class DateSearch {
//主程序入口
public static void main(String[] args) throws SQLException {
String url = "http://sou.zhaopin.com/jobs/searchresult.ashx?jl=郑州&kw=保洁&p=1&isadv=0";
acquireDate(url);
}
/**
* 这是一个方法,需要传入一个字符串
* @param url
* @throws SQLException
*/
public static void acquireDate(String url) throws SQLException{

QueryRunner qr=new QueryRunner(MyJDBCUtils.getDataSource());
Job job = new Job();
try {
//根据一个url创建一个Document对象
//此时相当于鼠标点进去这个网页
Document doc = Jsoup.connect(url).get();
//获取网页里面class为zumc的那段代码
Elements element = doc.getElementsByClass("zwmc");
//获取网页上面那段代码中的的包含href属性的a标签,得到一个集合
Elements element2 = element.select("a[href]");
//遍历集合
for (Element ele : element2) {
//获取 上面那段代码中的 href="www.XXXXXXXXXXX.com" 获取的是引号中的网址
String href = ele.attr("href");
//然后根据获得的网址在创建一个对象 ,相当于又点进去了一个网页
Document docc = Jsoup.connect(href).get();
//下面的是我新建的一个job类,我把我从网页上弄出来的东西封装到这个类里面,然后在输出到mysql
//我使用的方法很简单,例如下面:div.inner-left>h1 意思就是说有个标签叫div,这个div
//的class是inner-left,">"这个符号的意思是这个标签里面有个h1的标签,".text"这个意思是把这个h1标签里面的文字转换出来变成String字符串
job.setJobName(docc.select("div.inner-left>h1").text());// 工作名称
job.setCompanyName(docc.select("div.inner-left>h2").text());// 公司名称
//这个就是有个class是terminal-ul的ul标签,他里面有个li,li里面有个strong标签
//然后把Strong里面的文字给我变成一个String字符串 "first"意思是 第一个strong标签里面的内容
job.setPay(docc.select("ul.terminal-ul>li>strong").first().text());// 工资范围
job.setJobDesc(docc.select("div.tab-inner-cont>p").first().text());// 职位描述
job.setCompanyDesc(docc.select("div.tab-inner-cont[style]>p").text());// 公司描述
//这是一个获取日期的方法
String str = docc.select("ul.terminal-ul>li").get(2).select("strong").text();
job.setPublicDate(dateMethod(str));// 发布日期
job.setCreateDate(dateMethod2(0));// 创建时间

//这个标签就有点意思了,select了两次
//第一次先查找第5个li,然后获取第5个li里卖弄的strong标签中的内容
//"get"的意思是我要获取第5个li里面的内容 {从0开始,第一个是0}
job.setPersonNumber(docc.select("ul.terminal-ul>li").get(6).select("strong").text());
job.setJobAdress(docc.select("ul.terminal-ul>li").get(1).select("strong").text());
job.setSourceURL(href);

//mysql插入数据的语句
String sql="insert into worktable value(?,?,?,?,?,?,?,?,?,?,?)";
Object[] params={null,job.getJobName(),job.getCompanyName(),
job.getPay(),job.getJobDesc(),job.getCompanyDesc(),job.getJobAdress(),job.getPersonNumber(),
job.getPublicDate(),job.getCreateDate(),job.getSourceURL()};
qr.update(sql, params);
}

} catch (IOException e) {
e.printStackTrace();
}

/*
* 创建时间 和当前时间
*/

}

/**
* 信息发布日期
* @param a
* @return
*/
public static String dateMethod(String str){

String regEx="\\d{4}-\\d{2}-\\d{2}";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
String aa = null;
if(m.matches()){
aa=str;
}else{
if(str.equals("前天")){
aa=dateMethod2(2);
}else if(str.equals("昨天")){
aa=dateMethod2(1);
}else if(str.equals("15天前")){
aa="15天前";
}else{
aa=dateMethod2(0);
}
}
return aa;
}

public static String dateMethod2(int a) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -a);
String yesterday = new SimpleDateFormat("yyyy-MM-dd ").format(cal.getTime());
return yesterday;
}
}