前言
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。
大致步骤: 请求URL--->下载HTML内容--->保存结果进行分析
目标
如下图:这是一个前程无忧的一个网页,要爬取该网站的职位名,公司名,工作地点,薪资,以及发布时间。
准备:
下载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°reefrom=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则表示教室(不止一间),之后的循环就是从每一件教室那你要的东西,一层一层指定。
运行结果: