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

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

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

一、系统介绍

系统主要功能:本项目爬取的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();}}

效果
在这里插入图片描述

三、其它

1.其他系统实现

Java+Swing实现学生选课管理系统
Java+Swing图书管理系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/885324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stm32不小心把SWD和JTAG都给关了,程序下载不进去,怎么办?

因为想用STM32F103的PA15引脚&#xff0c;调试程序的时候不小心把SWD和JTAD接口都给关了&#xff0c;先看下罪魁祸首 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//关掉JTAG&#xff0c;不关SWGPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);//关掉SW&am…

雷军-2022.8小米创业思考-11-新零售:用电商思维做新零售,极致的效率+极致的体验。也有弯路,重回极致效率的轨道上。

第十一章 新零售 当我们说到小米模式的时候&#xff0c;其实我们说的是两件东西&#xff1a; 一是小米模式的本质&#xff0c;即高效率的商业模式&#xff1b; 另一件是小米这家公司具象的商业模式&#xff0c;这是小米在实践中摸索、建立的一整套业务模型。 从2015年到202…

C语言实现数据结构之堆

文章目录 堆一. 树概念及结构1. 树的概念2. 树的相关概念3. 树的表示4. 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 二. 二叉树概念及结构1. 概念2. 特殊的二叉树3. 二叉树的性质4. 二叉树的存储结构 三. 二叉树的顺序结构及实现1. 二叉树的顺序结构2.…

DocuBurst——基于java实现

DocuBurst 文档散(DocuBurst)也是基于关键词的文本可视化,不过它还通过径向布局体现了词的语义等级。如下图所示,外层的词是内层词的下义祠,颜色饱和度的深浅用来体现词频的高低。 DocuBurst 是第一个利用词法数据库中人工创建的结构的文档内容可视化。我们使用公认的设…

知识课堂之域名系统中实现动态代理

怎么在域名系统中解析动态ip&#xff0c;这一直是一个需要解决的问题&#xff0c;人们对与网络的稳定连接与灵活运用已经成为生活和工作中不可或缺的一部分&#xff0c;因此这样的问题的解决迫在眉睫。 大家对于动态ip是什么&#xff0c;应该都有所了解了&#xff0c;所谓的动…

5G周边知识笔记

这里写目录标题 3GPP 5G标准路径图5G协议规范5G新空口关键指标4G LTE和5G NR新空口技术对比5G新频段FR1FR2 信道带宽上下行解耦新频点规划&#xff0c;信道栅格FR1各频段实际信道栅格和NR-ARFCN范围定义 同步栅格大规模天线阵列新型调制编码技术大规模载波聚合设备到设备直接通…

报名开启|开放原子大赛“Rust数据结构与算法学习赛”

开放原子大赛“Rust数据结构与算法学习赛”报名进行中&#xff0c;报名截止时间为11月17日。 为了进一步促进开源技术的发展&#xff0c;提升国内开源社区的创新能力和国际影响力&#xff0c;开放原子开源基金会与清华大学开源操作系统训练营等单位&#xff0c;共同举办本次Rus…

Flutter自定义矩形进度条实现详解

在Flutter应用开发中&#xff0c;进度条是一个常见的UI组件&#xff0c;用于展示任务的完成进度。本文将详细介绍如何实现一个支持动画效果的自定义矩形进度条。 功能特点 支持圆角矩形外观平滑的动画过渡效果可自定义渐变色可配置边框宽度和颜色支持进度更新动画 实现原理 …

C#中的Math类

在 C# 中&#xff0c;Math 类提供了许多数学运算的静态方法&#xff0c;涵盖了各种常见的数学函数和操作。以下是 Math 类中的常用方法及其用法&#xff08;持续更新中…&#xff09; 方法说明示例Abs()返回指定数值的绝对值int absValue Math.Abs(-10); 结果为 10Acos()返回…

uniapp配置h5路由模式为history时404

为了不让URL中出现#&#xff0c;让uniapp项目配置h5路由模式为hisory 然而本地好好的&#xff0c;放到服务器上却404了。 解决方法是给nginx配置一个伪静态&#xff1a; location /xxx-html/ {alias /home/nginx_web/xxx_new_html/;try_files $uri $uri/ /xxx-html/index.ht…

python画图|灵活的subplot_mosaic()函数-初逢

【1】引言 前述学习进程中&#xff0c;对hist()函数画直方图已经有一定的探索。然而学无止境&#xff0c;在继续学习的进程中&#xff0c;我发现了一个显得函数subplot_mosaic()&#xff0c;它几乎支持我们随心所欲地排布多个子图。 经过自我探索&#xff0c;我有一些收获&am…

单体架构的 IM 系统设计

先直接抛出业务背景&#xff01; 有一款游戏&#xff0c;日活跃量&#xff08;DAU&#xff09;在两千左右&#xff0c;虽然 DAU 不高&#xff0c;但这两千用户的忠诚度非常高&#xff0c;而且会持续为游戏充值&#xff1b;为了进一步提高用户体验&#xff0c;继续增强用户的忠…

vue实现天地图电子围栏

一、文档 vue3 javascript WGS84、GCj02相互转换 天地图官方文档 注册登录然后申请应用key&#xff0c;通过CDN引入 <script src"http://api.tianditu.gov.cn/api?v4.0&tk您的密钥" type"text/javascript"></script>二、分析 所谓电子围…

基于SSM(Spring + Spring MVC + MyBatis)框架的汽车租赁共享平台系统

基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架的汽车租赁共享平台系统是一个复杂的Web应用程序&#xff0c;用于管理和调度汽车租赁服务。下面我将提供一个详细的案例程序概述&#xff0c;包括主要的功能模块和技术栈介绍。 项目概述 功能需求 用户管理&…

Python函数专题:默认参数与关键字参数

在Python编程中,函数是一个非常重要的概念。它们不仅用于组织代码,还能够提高代码的重用性和可读性。在本文中,我们将深入探讨Python的默认参数和关键字参数这两个特性。这些特性可以让函数的调用更加灵活和强大。 一、什么是默认参数? 默认参数是指在定义函数时,为某些…

前端将后端返回的文件下载到本地

vue 将后端返回的文件地址下载到本地 在 template 拿到后端返回的文件路径 <el-button link type"success" icon"Download" click"handleDownload(file)"> 附件下载 </el-button>在 script 里面写方法 function handleDownload(v…

【C++前缀和 单调栈】1124. 表现良好的最长时间段|1908

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 C单调栈 LeetCode 1124. 表现良好的最长时间段 给你一份工作时间表 hours&#xff0c;上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大…

qt5将程序打包并使用

一、封装程序 (1)、点击创建项目->库->clibrary &#xff08;2&#xff09;、填写自己想要封装成库的名称&#xff0c;这里我填写的名称为mydll1 &#xff08;3&#xff09;、如果没有特殊的要求&#xff0c;则一路下一步&#xff0c;最终会出现如下文件列表。 (4)、删…

PICO+Unity MR空间锚点

官方链接&#xff1a;空间锚点 | PICO 开发者平台 注意&#xff1a;该功能只能打包成APK在PICO 4 Ultra上真机运行&#xff0c;无法通过串流或PICO developer center在PC上运行。使用之前要开启视频透视。 在 Inspector 窗口中的 PXR_Manager (Script) 面板上&#xff0c;勾选…

远程终端vim里使用系统剪切板

1、本地通过终端远程linux server&#xff0c;由于不是桌面环境/GUI&#xff0c;终端vim里似乎没办法直接使用系统剪切板&#xff0c;即便已经是clipboard。 $ vim --version | grep clipboard clipboard keymap printer vertsplit eval …