简单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 ...
随机推荐
- memmove、memcpy和memccpy简介
memmove.memcpy和memccpy三个函数都是内存的拷贝,从一个缓冲区拷贝到另一个缓冲区.memmove(void *dest,void*src,int count)memcpy(void ...
- drf3 Serializers 序列化组件
为什么要用序列化组件 做前后端分离的项目,我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 给前端数据的时候都要转成json格式,那就需要对从数据库拿到的数据进行序列化. ...
- Java 线程使用注意事项
事件处理线程说明 如果事件处理的逻辑能迅速完成,并且不会发起新的IO请求,比如只是在内存中记个标识,则直接在IO线程上处理更快,因为减少了线程池调度. 但如果事件处理逻辑较慢,或者需要发起新的IO请求 ...
- 32 bit 与 64 bit 程序(2)比较
32 bit 与 64 bit 程序(2)区别 由于操作系统内存分配的不同,导致软件开发过程中,需要编译不同版本的软件. 几个重要概念: (1)这里所说的的32位与64位程序,是指经过编译器编译后 ...
- <Listener>HttpSessionListener和HttpSessionAttributeListener区别
一.HttpSessionListener HttpSessionListener是对Session的一个监听,主要监听关于Session的两个事件,即初始化和销毁.HttpSessionListen ...
- extern的使用详解(多文件编程)——C语言
extern——关键字 extern是C语言中的一个关键字,一般用在变量名前或函数名前,作用是用来说明“此变量/函数是在别处定义的,要在此处引用”,extern这个关键字大部分读者应该是在变量的存储类 ...
- Android 使用 HTTPS 问题解决(SSLHandshakeException)
title date categories tags Android 5.0以下TLS1.x SSLHandshakeException 2016-11-30 12:17:02 -0800 Andro ...
- 视频下载四大神器—如何下载优酷/爱奇艺/腾讯/B站超清无水印视频
视频下载四大神器—如何下载优酷/爱奇艺/腾讯/B站超清无水印视频 2018-07-11 | 标签»下载, 下载工具, 视频 又是视频下载,老生常谈的话题.阿刚同学已在乐软博客多次与大家分享推荐 ...
- Python模块学习 - fabric
简介 fabric是一个Python的库,同时它也是一个命令行工具.使用fabric提供的命令行工具,可以很方便地执行应用部署和系统管理等操作. fabric依赖于paramiko进行ssh交互,fa ...
- ASP.NET Web API实现微信公众平台开发(一)服务器验证
最近朋友的微信公众号准备做活动,靠固定的微信公众平台模版搞定不了,于是请我代为开发微信后台.鉴于我也是第一次尝试开发微信后台,所以也踩了不少坑,此系列博客将会描述微信公众号各项功能的实现. 先决条件 ...