使用Jsoup工具,它是一个HTML解析器,可以直接直接解析某个地址或者HTML文件。还可 通过Dom,CSS以及类似JQuery的操作方法操作数据。

Jsoup官方文档地址:https://jsoup.org/cookbook/introduction/parsing-a-document

注意:出现乱码时,需要查看编码方式网页的编码方式,使用它的编码方式解码。使用表单传输中文数据时有些网站需要进行url编码才能正常传输中文=。=

主要代码如下:

package com.galoliy.spider.maven_spider.domain;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.jsoup.Connection;
import org.jsoup.Connection.Method;
import org.jsoup.Connection.Response;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements; public class Cat5jobs { public Document getResultPage(String url,String keyword) throws UnsupportedEncodingException {
Document doc = null; //multipart/form-data 编码类型转换,必须进行转换,不然会导致POST里的keyword乱码
//Multipart/form-data code type conversion must be converted, otherwise it will cause keyword confusion in POST.
keyword = URLEncoder.encode(keyword, "gbk"); try { //获取主页
//Get index page
Response resp = Jsoup.connect(url).method(Method.GET).execute();
doc = resp.parse(); //获取查询结果页的跳转链接
//Get query results jump page link
String actionPath = doc.select("form").attr("action"); Connection con = Jsoup.connect(actionPath)
.data("keyword", keyword)
.userAgent("Mozilla")
.cookies(resp.cookies())
.header("Accept-Language", "zh-CN,zh;q=0.9")
.timeout(300000);
//得到查询结果页面
//Get query results page
doc = con.method(Method.POST).execute().parse(); } catch (IOException e) {
e.printStackTrace();
}
return doc;
} public void getResult(String url,String keyword,String dir,String fileName) { Document doc = null;
File htmlPath = null;
File txtPath = null;
String htmlFilePath = dir + fileName + ".htm";
String txtFilePath = dir + fileName + "2.txt";
txtPath = new File(txtFilePath);
htmlPath = new File(htmlFilePath);
Map map = null;
String printSrc = ""; try {
//本地如果有html文件则解析该文件,打印内容并储存一个txt文件
//If there is a HTML file in the local area, parse the file, print the contents and store a TXT file.
if(!txtPath.exists() && htmlPath.exists()) { doc = Jsoup.parse(htmlPath, "utf-8"); if(!doc.children().isEmpty())
System.out.println("File not empty"); map = Screen51Jobs(doc);
printSrc = printScreen(map);
saveFile(printSrc, txtFilePath);
System.out.println(printSrc); //如果本地有html和txt文件则读取txt文件内容,否则抛出IOException
//If you have HTML and txt files locally, you can read the contents of the txt file, otherwise throw IOException.
}else if(txtPath.exists() && htmlPath.exists()) {
System.out.println("File not empty");
printSrc = printScreen(txtPath);
System.out.println(printSrc);
}else
throw new IOException("NOT HTML FILE"); } catch (IOException e) { //在catch块里执行爬虫并且把文件保存在本地,Execute crawler in catch block and save the file locally. System.out.println("file not found"); try { //从网址上获取查询结果页面
//Get query results page from web address
doc = this.getResultPage(url,keyword); htmlPath.createNewFile();
//存储html文件
//Save html file
saveFile(doc.toString(),htmlFilePath); map = Screen51Jobs(doc);
String printStr = printScreen(map); if(!htmlPath.exists())
htmlPath.createNewFile();
//存储txt文件
//Save txt file
saveFile(printStr, txtFilePath); System.out.println(printSrc); } catch (IOException ex) {
ex.printStackTrace();
}
} } private String printScreen(File path) throws IOException{ StringBuilder printSrc = new StringBuilder();
InputStream in = new FileInputStream(path);
BufferedInputStream bis = new BufferedInputStream(in); int len = 0;
byte[] bytes = new byte[1024 * 8];
while((len = bis.read(bytes, 0, bytes.length)) != -1) {
printSrc.append(new String(bytes,0,bytes.length));
}
bis.close(); return printSrc.toString();
} private String printScreen(Map<?,?> screen) throws IOException { StringBuilder sb = new StringBuilder();
String p = "\r\n";
sb.append(p + " KeyWord:" + screen.get("keyword") + p + p +" Total query data:"
+ screen.get("totalquerydata") + p + p + " Recruitment info:"); List list = (ArrayList)screen.get("recruitmentlist"); for (Object o : list) {
Map map = (HashMap<String,Object>)o; for (Object obj : map.entrySet()) {
Map.Entry<String, Object> entry = (Map.Entry<String, Object>)obj;
sb.append(p + entry.getKey() + " == " + entry.getValue());
}
sb.append(p);
} return sb.toString();
} @SuppressWarnings({ "rawtypes", "unchecked" })
private Map<?,?> Screen51Jobs(Document doc){ Map screen = new HashMap<String,Object>(); Elements resultList = doc.select("div[class=dw_table]div[id=resultList]");
Elements findKeyword = resultList.select("div[class=sbox]");
Elements totalQueryData = resultList.select("div[class=rt]div:matchesOwn(^共)");
Elements recruitmentInfo = resultList.select("div[class=el]"); screen.put("keyword", findKeyword.text());
screen.put("totalquerydata", totalQueryData.text()); List recruitmentList = new ArrayList<Map<String,String>>();
Map m = null;
for (Element e : recruitmentInfo) {
m = new HashMap<String,Object>();
m.put("position",e.select("p[class~=^t1]").text());
m.put("href", e.select("a").attr("href"));
m.put("corporatename", e.select("a").text());
m.put("address", e.select("span[class=t3]").text());
m.put("salary", e.select("span[class=t4]").text());
m.put("releasedate", e.select("span[class=t5]").text());
recruitmentList.add(m);
}
screen.put("recruitmentlist", recruitmentList); return screen;
} private void saveFile(String src,String path) throws IOException { // InputStream in = new FileInputStream(path);
OutputStream out = new FileOutputStream(path);
BufferedOutputStream bos = new BufferedOutputStream(out); byte[] bytes = src.getBytes("utf-8"); bos.write(bytes, 0, bytes.length);
}

简单JAVA爬虫51Jobs的更多相关文章

  1. 一个简单java爬虫爬取网页中邮箱并保存

    此代码为一十分简单网络爬虫,仅供娱乐之用. java代码如下: package tool; import java.io.BufferedReader; import java.io.File; im ...

  2. 超简单的java爬虫

    最简单的爬虫,不需要设定代理服务器,不需要设定cookie,不需要http连接池,使用httpget方法,只是为了获取html代码... 好吧,满足这个要求的爬虫应该是最基本的爬虫了.当然这也是做复杂 ...

  3. java简单web爬虫(网页图片)

    java简单web爬虫(网页图片)效果,执行main()方法后图片就下载道C盘的res文件夹中.没有的话创建一个文件夹代码里的常量根据自己的需求修改,代码附到下面. package com.sinit ...

  4. 学校实训作业:Java爬虫(WebMagic框架)的简单操作

    项目名称:java爬虫 项目技术选型:Java.Maven.Mysql.WebMagic.Jsp.Servlet 项目实施方式:以认知java爬虫框架WebMagic开发为主,用所学java知识完成指 ...

  5. webmagic的设计机制及原理-如何开发一个Java爬虫

    之前就有网友在博客里留言,觉得webmagic的实现比较有意思,想要借此研究一下爬虫.最近终于集中精力,花了三天时间,终于写完了这篇文章.之前垂直爬虫写了一年多,webmagic框架写了一个多月,这方 ...

  6. JAVA爬虫 WebCollector

    JAVA爬虫 WebCollector 爬虫简介: WebCollector是一个无须配置.便于二次开发的JAVA爬虫框架(内核),它提供精简的的API,只需少量代码即可实现一个功能强大的爬虫. 爬虫 ...

  7. 爬虫入门 手写一个Java爬虫

    本文内容 涞源于  罗刚 老师的 书籍 << 自己动手写网络爬虫一书 >> ; 本文将介绍 1: 网络爬虫的是做什么的?  2: 手动写一个简单的网络爬虫; 1: 网络爬虫是做 ...

  8. JAVA爬虫实践(实践三:爬虫框架webMagic和csdnBlog爬虫)

    WebMagic WebMagic是一个简单灵活的Java爬虫框架.基于WebMagic,你可以快速开发出一个高效.易维护的爬虫. 采用HttpClient可以实现定向的爬虫,也可以自己编写算法逻辑来 ...

  9. java爬虫系列第一讲-爬虫入门

    1. 概述 java爬虫系列包含哪些内容? java爬虫框架webmgic入门 使用webmgic爬取 http://ady01.com 中的电影资源(动作电影列表页.电影下载地址等信息) 使用web ...

随机推荐

  1. 2019.02.27 bzoj4556: [Tjoi2016&Heoi2016]字符串(二分答案+sam+线段树合并)

    传送门 题意:给一个字符串SSS. 有mmm次询问,每次给四个参数a,b,c,da,b,c,da,b,c,d,问s[a...b]s[a...b]s[a...b]的所有子串和s[x...y]s[x... ...

  2. drf5 版本和认证组件

    开发项目是有多个版本的 随着项目的更新,版本就越来越多.不可能新的版本出了,以前旧的版本就不进行维护了 那我们就需要对版本进行控制,这个DRF框架也给我们提供了一些封装好的版本控制方法 版本控制组件 ...

  3. js后加版本号

    页面引入两个js文件 <script charset="utf-8" src="mjs/randomimage.js?v=01291"></s ...

  4. async/await让你的代码更加优雅

    一. 回调地狱:回调函数里面嵌套着回调函数嵌套着回调函数”,这就是被传说中的“回调地狱callbackHell () { const api = new Api() let user, friends ...

  5. JavaScript基础视频教程总结(021-030章)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  6. 桌面应用开发之WPF动态背景

      因为项目需要,在WPF开发的桌面应用中,登陆页面需使用动态背景.由于没有前端开发人员,所以由半吊子的后端开发人员根据效果图写前端xaml.去掉页面上边框,抽离动态背景设置代码: <Windo ...

  7. Linux(以centos7为例)下自动挂载NTFS硬盘

    Linux(以centos7为例)下自动挂载NTFS硬盘 作者:子敬叔叔 编写时间:2017年5月3日星期三 需求:     为了熟悉Linux的使用,在自己的笔记本上新安装一个centos7, 但我 ...

  8. 首先看一下友晶DE-SOC开发板的user manual

    对于友晶DE-SOC系列开发板来说,由于其内部自带ARM 的cortex-A9硬核,所以使用nios II开发来说其实是不划算的,但是这里重点是为了学习NIOS II的开发,所以对于用DS-5来开发A ...

  9. 做JAVA开发的同学一定遇到过的爆表问题,看这里解决

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由净地发表于云+社区专栏 记一次Java线上服务器CPU过载问题的排查过程,详解排查过程中用到的Java性能监测工具:jvisualvm ...

  10. nginx 502 bad gateway 问题处理集锦

    一般看来, 这种情况可能是由于nginx默认的fastcgi进程响应的缓冲区太小造成的, 这将导致fastcgi进程被挂起, 如果你的fastcgi服务对这个挂起处理的不好, 那么最后就极有可能导致5 ...