Java爬虫 爬取某招聘网站招聘信息

  • 一、系统介绍
  • 二、功能展示
    • 1.需求爬取的网站内容
    • 2.实现流程
    • 2.1数据采集
    • 2.2页面解析
    • 2.3数据存储
  • 三、获取源码

一、系统介绍

系统主要功能:本项目爬取的XX招聘网站

二、功能展示

1.需求爬取的网站内容

2.实现流程

爬虫可以分为三个模块:数据采集,数据解析,数据保存

项目结构:

2.1数据采集

​ 数据采集主要是通过HttpClient去请求url,获取网页源码。
(注:除了HttpClient,还可以用HttpUtil,具体使用方式可以百度得到,这里贴出两种工具的使用代码,实现的功能是一样的)
在pom.xml配置相关依赖
HttpClient:

<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.9</version>
</dependency>

HttpUtil:

<dependency><groupId>net.sourceforge.htmlunit</groupId><artifactId>htmlunit</artifactId><version>2.27</version>
</dependency>

两种工具看个人喜好选择,本项目选择的是HttpClient.建议使用htmlunit,htmlunit爬内容相对齐全。
HTTPClient与HttpUtil的使用方法
HTTPClient

package com.master.controller;import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.HttpClientUtils;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;import java.io.IOException;public class HttpClientDownPage {//设置代理,模范浏览器private static final String USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36";public static String sendGet(String url){//1.生成httpclient,相当于该打开一个浏览器CloseableHttpClient httpClient = HttpClients.createDefault();//设置请求和传输超时时间RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(2000).setConnectTimeout(2000).build();CloseableHttpResponse response = null;String html = null;//2.创建get请求,相当于在浏览器地址栏输入 网址HttpGet request = new HttpGet(url);try {request.setHeader("User-Agent",USER_AGENT);request.setConfig(requestConfig);//3.执行get请求,相当于在输入地址栏后敲回车键response = httpClient.execute(request);//4.判断响应状态为200,进行处理if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {//5.获取响应内容HttpEntity httpEntity = response.getEntity();html = EntityUtils.toString(httpEntity, "GBK");} else {//如果返回状态不是200,比如404(页面不存在)等,根据情况做处理,这里略System.out.println("返回状态不是200");System.out.println(EntityUtils.toString(response.getEntity(), "utf-8"));}} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {//6.关闭HttpClientUtils.closeQuietly(response);HttpClientUtils.closeQuietly(httpClient);}return html;}
}

HttpUtil

package com.master.controller;import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;public class HttpUtilDownPage {//新建一个模拟谷歌Chrome浏览器的浏览器客户端对象private static final WebClient webClient = new WebClient(BrowserVersion.CHROME);public static String sendGet(String url){//当JS执行出错的时候是否抛出异常, 这里选择不需要webClient.getOptions().setThrowExceptionOnScriptError(false);//当HTTP的状态非200时是否抛出异常, 这里选择不需要webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);webClient.getOptions().setActiveXNative(false);//是否启用CSS, 因为不需要展现页面, 所以不需要启用webClient.getOptions().setCssEnabled(false);//很重要,启用JSwebClient.getOptions().setJavaScriptEnabled(true);//很重要,设置支持AJAXwebClient.setAjaxController(new NicelyResynchronizingAjaxController());HtmlPage page = null;try {page = webClient.getPage(url);} catch (Exception e) {e.printStackTrace();}finally {webClient.close();}//异步JS执行需要耗时,所以这里线程要阻塞30秒,等待异步JS执行结束webClient.waitForBackgroundJavaScript(30000);//直接将加载完成的页面转换成xml格式的字符串String pageXml = page.asXml();return pageXml;}
}

上面两种方法都可请求到页面源码信息,这里用的是字符串接收下来。

(注:如果使用HttpClient,有些网页无法获取到全部的页面代码信息,可换成HttpUtil尝试,如果还是不行,那可能是该网站采取了一些反爬措施,需要小伙伴自己动脑解决了)

2.2页面解析

页面源码请求下来了,那么就轮到页面解析模块出厂了。

​ 我们看到的网页,本质上都是由一个个标签嵌套组合而成,再加上js,css等渲染成一个美观的页面,但是我们需要的的数据,所以摒除绚丽的外观,我们只需要解析出目标数据所在的标签就行了。

​ 解析页面的方法也有多种,有htmlcleaner,Jsoup等,这里使用的是Jsoup,HTMLCleaner使用标签的Xpath解析,Xpath可以在浏览器中 进行一下操作 ctrl+shift+c,然后找到目标标签,点击鼠标右键,选择copy,会有cpoy Xpath选项即可,具体玩转需要小伙伴自己去探索,因为笔者也不懂。。。

​ 使用Jsoup,在springboot中只需配置相关依赖便可使用

 <!--Jsoup--><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.11.3</version></dependency>

将获取的网页信息通过Jsoup.parse(content)方法转化成Document对象,传到解析模块,解析模块相关代码:

    private void paraseList(Document document) throws InterruptedException {//根据网页标签解析源码Elements elements = document.getElementsByClass("sojob-item-main clearfix");for(Element element:elements){Elements elements1 = element.select("h3");String job = elements1.attr("title");Elements elements2 = element.select(".condition");String all = elements2.attr("title");String[] a = all.split("_");String salary = a[0];String address = a[1];String require = a[2]+a[3];Elements elements3 = (element.select(".temptation")).select("span");String welfare = elements3.text();//公司名称Elements elements4 = (element.select(".company-name")).select("a");String companyname = elements4.text();Job jobs = new Job();//kay是字段名 value是字段值jobs.setJob(job);jobs.setSalary(salary);jobs.setAddress(address);jobs.setCompanyname(companyname);jobs.setRequire(require);jobs.setWelfare(welfare);list.add(jobs);}}

这里是解析页面,获取想要的职位信息,将解析的数据封装到QCPage中,效果图如下

2.3数据存储

​数据解析完,就差数据存储了。
笔者采用了excel存储

    public void saveXls(List list,String name) {//第一步,创建一个workbook对应一个excel文件HSSFWorkbook workbook = new HSSFWorkbook();//第二部,在workbook中创建一个sheet对应excel中的sheetHSSFSheet sheet = workbook.createSheet("招聘表");//第三部,在sheet表中添加表头第0行,老版本的poi对sheet的行列有限制HSSFRow row = sheet.createRow(0);//第四步,创建单元格,设置表头HSSFCell cell = row.createCell(0);cell.setCellValue("招聘公司");cell = row.createCell(1);cell.setCellValue("岗位名称");cell = row.createCell(2);cell.setCellValue("岗位薪资");cell = row.createCell(3);cell.setCellValue("工作地点");cell = row.createCell(4);cell.setCellValue("岗位要求");cell = row.createCell(5);cell.setCellValue("福利待遇");//第五步,写入实体数据,实际应用中这些数据从数据库得到,对象封装数据,集合包对象。对象的属性值对应表的每行的值for (int i = 0; i < list.size(); i++) {HSSFRow row1 = sheet.createRow(i + 1);//创建单元格设值row1.createCell(0).setCellValue(((Job) list.get(i)).getCompanyname());row1.createCell(1).setCellValue(((Job) list.get(i)).getJob());row1.createCell(2).setCellValue(((Job) list.get(i)).getSalary());row1.createCell(3).setCellValue(((Job) list.get(i)).getAddress());row1.createCell(4).setCellValue(((Job) list.get(i)).getRequire());row1.createCell(5).setCellValue(((Job) list.get(i)).getWelfare());}File file = new File("D:/"+name+".xls");if (file.exists()) {file.delete();}//将文件保存到指定的位置try {file.createNewFile();FileOutputStream fos = new FileOutputStream(file);workbook.write(fos);System.out.println("写入成功");workbook.close();} catch ( IOException e) {e.printStackTrace();}}

效果

三、获取源码

点击下载
Java爬虫 爬取某招聘网站招聘信息

Java爬虫 爬取某招聘网站招聘信息相关推荐

  1. java爬虫爬取主流房屋网站

    最近博主要做一些分析课题,所以使用java爬取了主流的房屋网站,搞些事情,下面是我搞事情的思路,在结尾处我会投放我的源码文件,供大家下载: 导航: 设计思路 项目的包与类详解 部分重要代码展示 源码下 ...

  2. Jsoup学习 JAVA爬虫爬取美女网站 JAVA爬虫爬取美图网站 爬虫

    最近对爬虫起了兴趣,但是网上都说做爬虫最好得语言是py.但是我只会java,所以就想能不能用java实现一个爬虫,百度搜索发现,其实java也有很多优秀得开源爬虫框架,包括Gecco,webmagic ...

  3. 基于Jsoup的Java爬虫-爬取必应壁纸网站的壁纸(Java静态壁纸爬虫实例)

    准备阶段 1.必应壁纸网站:https://bing.ioliu.cn(爬取对象网站) 2.Jsoup包下载地址:https://jsoup.org/download(以下代码需要用到该包,记得导入包 ...

  4. Java爬虫-爬取四级词汇网站音频

    背景: 作为一个久不过四级的程序员有点不好意思啊,所以网购了冲刺卷认真过四级,签收后发现附送的词汇书音频网站竟然没有一键下载全部.只能自己写个伪爬虫了. 知识点: Java网络连接 字节流 文件输入输 ...

  5. java爬虫爬取互联网上的各大影视网站---360影视(附源码下载)

    关于爬虫: 万维网上有着无数的网页,包含着海量的信息,无孔不入.森罗万象.但很多时候,无论出于数据分析或产品需求,我们需要从某些网站,提取出我们感兴趣.有价值的内容,但是纵然是进化到21世纪的人类,依 ...

  6. python java 爬数据_如何用java爬虫爬取网页上的数据

    当我们使用浏览器处理网页的时候,有时候是不需要浏览的,例如使用PhantomJS适用于无头浏览器,进行爬取网页数据操作.最近在进行java爬虫学习的小伙伴们有没有想过如何爬取js生成的网络页面吗?别急 ...

  7. Java爬虫爬取wallhaven的图片

    Java爬虫爬取wallhaven的图片 参考文章:JAVA Jsoup爬取网页图片下载到本地 需要的jar包:jsuop wallhaven网站拒绝java程序访问,所以要伪装报头. 发送请求时 C ...

  8. Java爬虫爬取 天猫 淘宝 京东 搜索页和 商品详情

    Java爬虫爬取 天猫 淘宝 京东 搜索页和 商品详情 先识别商品url,区分平台提取商品编号,再根据平台带着商品编号爬取数据. 1.导包 <!-- 爬虫相关Jar包依赖 --><d ...

  9. Java爬虫 --- 爬取王者荣耀英雄图片

    Java爬虫 - 爬取王者荣耀英雄图片 import org.jsoup.Connection; import org.jsoup.Jsoup; import org.jsoup.nodes.Docu ...

最新文章

  1. python简单爬虫程序分析_[Python专题学习]-python开发简单爬虫
  2. DIV同时使用两个class
  3. android加载html
  4. 2017-2018-1 20155209 实验三 实时系统
  5. Python与常见加密方式
  6. webpack 工作方式
  7. 1066. 图像过滤(15)
  8. ipsec *** 的总结性谈论
  9. cmake 安装mysql5.6_使用cmake在CentOS6.5安装MYSQL5.6
  10. 英特尔技术流新帅履职,给员工们一些“笔记”学习一下
  11. 001jsp的基本知识-包括生命周期,怎么编译等等
  12. Bailian3179 最长单词【字符串】
  13. 神剧《切尔诺贝利》引发的技术思考:如何避免下一次核灾难?
  14. linux查看445端口状态,linux和Windows如何查看端口占用情况
  15. Opencv配置环境变量
  16. 贝塔朗菲的一般系统论:系统的有序性和目的性
  17. 宝塔利用同一个ip的不同端口号架设多个网站
  18. C ++ 扑克牌洗牌
  19. 【雷达与对抗】【2015】【部分源码】用于雷达成像与信道探测的FMCW信号
  20. Linux服务器下安装vsftpd,搭建文件服务器

热门文章

  1. 以太网与 TCP/IP
  2. 使用Android Studio开发一个简易的音乐播放器
  3. 翻译《Pro SQL Server Internals,2nd edition》的CHAPTER 3 Statistics的Introduction to SQL Server Statistics等
  4. 1.8.5 访问日志不记录静态文件
  5. 堆内存和栈内存详解(转载)
  6. windows程序设计作业
  7. mysql 数据库军规_MySQL 数据库开发的 36 条军规
  8. 电脑定时关机、取消定时关机、滑动关机
  9. 互联网老兵谈中国早期黑客的历史(转载)
  10. Android使用Github Actions持续集成并自动上传apk到蒲公英App内测分发平台(含证书密码脱敏)