1. 程式人生 > >jsoup爬蟲專案基礎用法,如何用jsoup從網上爬東西

jsoup爬蟲專案基礎用法,如何用jsoup從網上爬東西

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;
	}
}