java代码实现一个简单的网络爬虫

前言

       网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。

      大致步骤:  请求URL--->下载HTML内容--->保存结果进行分析

目标

      如下图:这是一个前程无忧的一个网页,要爬取该网站的职位名,公司名,工作地点,薪资,以及发布时间。   

  准备:

  1. Eclipse
  2. jdk1.6以上
  3. 要爬取的网站:https://search.51job.com/list/190200,000000,0000,00,9,99,Java%2B%25E6%259E%25B6%25E6%259E%2584,2,1.html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=1&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=
  4. jsoupd.jar包

         下载jar包地址:https://jsoup.org/download

      代码:

package com.wpc.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 * 用java代码实现一个简单的网络爬虫
 * 
 * @author wpc 
 * @创建时间:2018-01-11
 */
public class DownloadHtml {

	
	/**
	 * 
	 * @param url  要抓取的网页地址
	 * @param encoding   要抓取网页编码
	 * @return
	 */
	public static String getHtmlResourceByUrl(String url, String encoding) {
		URL urlObj = null;
		URLConnection uc = null;
		InputStreamReader isr = null;
		BufferedReader reader = null;

		StringBuffer buffer = new StringBuffer();

		// 建立网络连接
		try {
			urlObj = new URL(url);
			// 打开网络连接
			uc = urlObj.openConnection();
			// 建立文件输入流
			isr = new InputStreamReader(uc.getInputStream(), encoding);

			// 建立缓存导入 将网页源代码下载下来
			reader = new BufferedReader(isr);

			// 临时
			String temp = null;

			while ((temp = reader.readLine()) != null) {// 一次读一行 只要不为空就说明没读完继续读
				// System.out.println(temp+"\n");
				buffer.append(temp + "\n");
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 关流
			if (isr != null) {
				try {
					isr.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return buffer.toString();
	}

	
	/**
	 * 
	 * @param url    要抓取的网页地址
	 * @param encoding   要抓取网页编码
	 */
	public static void getJobInfo(String url, String encoding) {
		// 拿到网页源代码
		String html = getHtmlResourceByUrl(url, encoding);
		// 这里需要jar包   jsoupd.jar包		
		Document document = Jsoup.parse(html);
		// 获取dw_tlc_mk里面的内容  通过id拿到整个容器
		// id是唯一的,通过id那到容器(指定了容器)
		Element element = document.getElementById("dw_tlc_mk");
		// 获取结果 根据class进一步确定目标的内容位置
		Elements elements = document.getElementsByClass("el");

		for (Element el : elements) {
			// 职位名
			String jobTitle = el.getElementsByClass("t1").text();
			// System.out.println(jobTitle);

			// 公司名
			String companyName = el.getElementsByClass("t2").text();
			// System.out.println(companyName);

			// 工作地点
			String jobAddress = el.getElementsByClass("t3").text();
			// System.out.println(jobAddress);

			// 工资
			String wages = el.getElementsByClass("t4").text();
			// System.out.println(wages);

			// 直接在控制台打印
			System.out.println("职位名:" + jobTitle + "\t公司名:" + companyName + "\t工作地点:" + jobAddress + "\t工作:" + wages);

		}
	}

	public static void main(String[] args) {
		//网页地址
		String url = "https://search.51job.com/list/190200,000000,0000,00,9,99,Java%2B%25E6%259E%25B6%25E6%259E%2584,2,1.html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=1&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=";
		//不是同一个网站encoding可能不一样
		getJobInfo(url, "gbk");

	}

}

   getJobInfo()方法,中的“dw_tlc_mk”,"el"等结合下面的图看,例如如果要从某个学校的每个教室拿某个东西,那么Elementelement=document.getElementById("dw_tlc_mk");表示先通过dw_tlc_mk找到学校(dw_tlc_mk相当于学校名字是唯一的)。
   那么Elements elements =document.getElementsByClass("el");表示找到每一间教室,el则表示教室(不止一间),之后的循环就是从每一件教室那你要的东西,一层一层指定。

        

运行结果:

 

 

 

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值