简单JAVA爬虫51Jobs
使用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的更多相关文章
- 一个简单java爬虫爬取网页中邮箱并保存
此代码为一十分简单网络爬虫,仅供娱乐之用. java代码如下: package tool; import java.io.BufferedReader; import java.io.File; im ...
- 超简单的java爬虫
最简单的爬虫,不需要设定代理服务器,不需要设定cookie,不需要http连接池,使用httpget方法,只是为了获取html代码... 好吧,满足这个要求的爬虫应该是最基本的爬虫了.当然这也是做复杂 ...
- java简单web爬虫(网页图片)
java简单web爬虫(网页图片)效果,执行main()方法后图片就下载道C盘的res文件夹中.没有的话创建一个文件夹代码里的常量根据自己的需求修改,代码附到下面. package com.sinit ...
- 学校实训作业:Java爬虫(WebMagic框架)的简单操作
项目名称:java爬虫 项目技术选型:Java.Maven.Mysql.WebMagic.Jsp.Servlet 项目实施方式:以认知java爬虫框架WebMagic开发为主,用所学java知识完成指 ...
- webmagic的设计机制及原理-如何开发一个Java爬虫
之前就有网友在博客里留言,觉得webmagic的实现比较有意思,想要借此研究一下爬虫.最近终于集中精力,花了三天时间,终于写完了这篇文章.之前垂直爬虫写了一年多,webmagic框架写了一个多月,这方 ...
- JAVA爬虫 WebCollector
JAVA爬虫 WebCollector 爬虫简介: WebCollector是一个无须配置.便于二次开发的JAVA爬虫框架(内核),它提供精简的的API,只需少量代码即可实现一个功能强大的爬虫. 爬虫 ...
- 爬虫入门 手写一个Java爬虫
本文内容 涞源于 罗刚 老师的 书籍 << 自己动手写网络爬虫一书 >> ; 本文将介绍 1: 网络爬虫的是做什么的? 2: 手动写一个简单的网络爬虫; 1: 网络爬虫是做 ...
- JAVA爬虫实践(实践三:爬虫框架webMagic和csdnBlog爬虫)
WebMagic WebMagic是一个简单灵活的Java爬虫框架.基于WebMagic,你可以快速开发出一个高效.易维护的爬虫. 采用HttpClient可以实现定向的爬虫,也可以自己编写算法逻辑来 ...
- java爬虫系列第一讲-爬虫入门
1. 概述 java爬虫系列包含哪些内容? java爬虫框架webmgic入门 使用webmgic爬取 http://ady01.com 中的电影资源(动作电影列表页.电影下载地址等信息) 使用web ...
随机推荐
- MUI 里js动态添加数字输入框后,增加、减少按钮无效
numbox 的自动初化是在 mui.ready 时完成的mui 页面默认会自动初始化页面中的所有数字输入框,动态构造的 DOM 需要进行手动初始化.比如:您动态创建了一个 ID 为 abc 的数字输 ...
- 位运算------按位与、按位或、按位异或、取反、<<、>>、>>>
程序中的所有数在计算机内存中都是以二进制的形式储存的,位运算就是直接对整数在内存中的二进制位进行操作. 知识点: 1.原码.反码.补码(以byte的1.-1举例) 示例 ...
- 【MarkMark学习笔记学习笔记】javascript/js 学习笔记
1.0, 概述.JavaScript是ECMAScript的实现之一 2.0,在HTML中使用JavaScript. 2.1 3.0,基本概念 3.1,ECMAScript中的一切(变量,函数名,操作 ...
- ubuntu 配置jdk报错解决办法
vi /etc/profile ,添加如下代码 export JAVA_HOME=/home/mark/android/jdk1.8 export JRE_HOME=/home/mark/androi ...
- 让用户输入一个日期字符串,将其转换成日期格式, 格式是(yyyy/MM/dd,yyyyMMdd,yyyy-MM-dd)中的一种, 任何一种转换成功都可以; 如果所有的都无法转换,输出日期格式非法。
第三种方法 while(true) { Date d; System.out.println("正在进行第一次匹配,请稍后~—~"); ...
- EF6 学习笔记(五):数据库迁移及部署
EF6学习笔记总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 原文地址:Code First Migrations and Deployment 原文主要讲两部分:开发环境下 ...
- tomcat的调优管理
1 记性调整存设定. A: 方法如下: 1. linux 下编辑tomcat安装目录下的bin目录下的catalina.sh文件,windows下为catalina.bat vi catalina. ...
- 微信公众号UX分析—— 学生作业小结
1. 不足: 1. 权威性:个人帐号,显得不够正式. 2. 排版问题: + 没有必要的外接端口,界面设计极度缺少排版.哪怕是个人公众号都不至于如此,更何况这是一个学校的教务平台. 3. 反应不及时或无 ...
- appium定位之xpath定位
前面也说过appium也是以webdriver为基的,对于元素的定位也基本一致,只是增加一些更适合移动平台的独特方式,下面将着重介绍xpath方法,这应该是UI层元素定位最强大的方法啦! 以淘宝app ...
- What does git fsck stand for?
fsck -> File System ChecK https://stackoverflow.com/questions/21151945/what-does-git-fsck-stand-f ...