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

目录

前言

一、爬虫程序的基本架构

二、如何获取目标网站的页面内容

三、解析HTML页面,提取所需信息

四、代理IP的使用

五、完整代码

总结


前言

随着互联网的普及,越来越多的人开始关注网络上的招聘信息,而传统的求职方式愈发显得不够快捷、高效。爬虫技术,则能够帮助我们快速地获取互联网上的招聘信息,从而提高求职的效率。

本文介绍如何使用Java编写爬虫程序,以爬取某招聘网站的招聘信息为例,并采用代理IP提高爬取效率。文章包含以下几个部分:

1. 爬虫程序的基本架构
2. 如何获取目标网站的页面内容
3. 解析HTML页面,提取所需信息
4. 代理IP的使用
5. 完整代码

一、爬虫程序的基本架构

一个基本的爬虫程序通常由三个模块组成:获取页面、解析页面、存储数据。具体实现可以使用各种语言和库,这里我们使用Java和Jsoup库实现爬虫程序。

二、如何获取目标网站的页面内容

获取页面的方法主要有两种:使用HttpURLConnection或使用HttpClient。此处我们使用HttpClient。HttpClient是Apache Jakarta Common Project组织提供的开源Java实现的HTTP客户端软件包。它不仅可以支持HTTP协议,还可以支持HTTPS协议。并且,HttpClient提供了一些扩展功能,例如自动重定向,SSL连接等。

下面是使用HttpClient获取网页内容的示例代码:

public String getHtml(String url) {
    String html = null;
    try {
        // 创建HttpClient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        // 创建HttpGet请求
        HttpGet httpGet = new HttpGet(url);
        // 执行HttpGet请求,获取HttpResponse响应
        CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
        // 获取HttpEntity实例
        HttpEntity entity = httpResponse.getEntity();
        // 使用EntityUtils工具类将HttpEntity转换成字符串
        html = EntityUtils.toString(entity, "utf-8");
        // 关闭资源
        httpResponse.close();
        httpClient.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return html;
}

三、解析HTML页面,提取所需信息

解析HTML页面的方法通常有两种:使用正则表达式或使用HTML解析器。使用正则表达式可能会更加灵活,但是容易出错。所以,此处我们使用HTML解析器Jsoup。

Jsoup是Java的一个HTML解析器,它可以直接解析某个URL地址、HTML文本内容。它提供了类似于Jquery的语法,再加上一些API操作,可以很灵活的进行HTML解析。

下面是使用Jsoup解析HTML页面并提取信息的示例代码:

public List<Map<String, Object>> parse(String html) {
    List<Map<String, Object>> dataList = new ArrayList<>();
    // 使用Jsoup解析HTML页面
    Document document = Jsoup.parse(html);
    // 获取招聘信息列表
    Elements jobElements = document.select(".newlist .jobList");
    for (Element job : jobElements) {
        Map<String, Object> data = new HashMap<>();
        // 获取招聘信息
        String jobTitle = job.select(".zwmc div a").first().text();
        String jobUrl = job.select(".zwmc div a").first().attr("href");
        String companyName = job.select(".gsmc a").first().text();
        String companyUrl = job.select(".gsmc a").first().attr("href");
        String jobCity = job.select(".gzdd").first().text();
        String jobSalary = job.select(".zwyx").first().text();
        String jobDate = job.select(".gxsj").first().text();
        // 将信息保存到Map里
        data.put("jobTitle", jobTitle);
        data.put("jobUrl", jobUrl);
        data.put("companyName", companyName);
        data.put("companyUrl", companyUrl);
        data.put("jobCity", jobCity);
        data.put("jobSalary", jobSalary);
        data.put("jobDate", jobDate);
        // 将Map添加到列表里
        dataList.add(data);
    }
    return dataList;
}


 

以上代码使用了CSS选择器来定位目标元素,大大简化了解析过程。

四、代理IP的使用

在爬虫过程中,我们需要频繁的向目标网站发送请求,如果每次请求都使用同一个IP地址,就会被目标网站封锁,影响爬取效率。此时,代理IP是一个好的选择。

代理IP是指代理服务器上的IP地址,用来代替客户端发送请求和接收响应。代理IP可以隐藏客户端真实的IP地址,同时可以在一定程度上保护用户的隐私。

使用代理IP的方法也很简单。我们只需要在每次发送请求时,指定使用的代理IP即可。

下面是使用代理IP的示例代码:

public String getHtmlWithProxy(String url, String host, int port) {
    String html = null;
    try {
        // 创建HttpClient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        // 创建HttpGet请求
        HttpGet httpGet = new HttpGet(url);
        // 设置代理IP和端口
        HttpHost proxy = new HttpHost(host, port);
        RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
        httpGet.setConfig(config);
        // 执行HttpGet请求,获取HttpResponse响应
        CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
        // 获取HttpEntity实例
        HttpEntity entity = httpResponse.getEntity();
        // 使用EntityUtils工具类将HttpEntity转换成字符串
        html = EntityUtils.toString(entity, "utf-8");
        // 关闭资源
        httpResponse.close();
        httpClient.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return html;
}

五、完整代码

以下是完整的爬虫程序代码:

import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
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.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JobSpider {
    private static final String ZHAOPIN_URL = "https://sou.zhaopin.com/jobs/searchresult.ashx";

    public static void main(String[] args) {
        String keyword = "Java";
        String city = "北京";
        int start = 0;
        int count = 60;

        JobSpider spider = new JobSpider();
        List<Map<String, Object>> dataList = spider.spiderJobInfo(keyword, city, start, count);
        System.out.println(dataList);
    }

    public List<Map<String, Object>> spiderJobInfo(String keyword, String city, int start, int count) {
        List<Map<String, Object>> dataList = new ArrayList<>();
        try {
            // 爬取数据
            for (int i = start; i < start + count; i += 60) {
                // 构造请求参数
                String url = String.format("%s?jl=%s&kw=%s&start=%d", ZHAOPIN_URL, city, keyword, i);
                // 获取页面HTML
                String html = getHtmlWithProxy(url, "127.0.0.1", 1080);
                // 解析HTML页面,提取信息
                List<Map<String, Object>> jobList = parse(html);
                // 将解析结果添加到结果集中
                dataList.addAll(jobList);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dataList;
    }

    public String getHtml(String url) {
        String html = null;
        try {
            // 创建HttpClient对象
            CloseableHttpClient httpClient = HttpClients.createDefault();
            // 创建HttpGet请求
            HttpGet httpGet = new HttpGet(url);
            // 执行HttpGet请求,获取HttpResponse响应
            CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
            // 获取HttpEntity实例
            HttpEntity entity = httpResponse.getEntity();
            // 使用EntityUtils工具类将HttpEntity转换

成字符串
            html = EntityUtils.toString(entity, "utf-8");
            // 关闭资源
            httpResponse.close();
            httpClient.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return html;
    }

    public String getHtmlWithProxy(String url, String host, int port) {
        String html = null;
        try {
            // 创建HttpClient对象
            CloseableHttpClient httpClient = HttpClients.createDefault();
            // 创建HttpGet请求
            HttpGet httpGet = new HttpGet(url);
            // 设置代理IP和端口
            HttpHost proxy = new HttpHost(host, port);
            RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
            httpGet.setConfig(config);
            // 执行HttpGet请求,获取HttpResponse响应
            CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
            // 获取HttpEntity实例
            HttpEntity entity = httpResponse.getEntity();
            // 使用EntityUtils工具类将HttpEntity转换成字符串
            html = EntityUtils.toString(entity, "utf-8");
            // 关闭资源
            httpResponse.close();
            httpClient.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return html;
    }

    public List<Map<String, Object>> parse(String html) {
        List<Map<String, Object>> dataList = new ArrayList<>();
        // 使用Jsoup解析HTML页面
        Document document = Jsoup.parse(html);
        // 获取招聘信息列表
        Elements jobElements = document.select(".newlist .jobList");
        for (Element job : jobElements) {
            Map<String, Object> data = new HashMap<>();
            // 获取招聘信息
            String jobTitle = job.select(".zwmc div a").first().text();
            String jobUrl = job.select(".zwmc div a").first().attr("href");
            String companyName = job.select(".gsmc a").first().text();
            String companyUrl = job.select(".gsmc a").first().attr("href");
            String jobCity = job.select(".gzdd").first().text();
            String jobSalary = job.select(".zwyx").first().text();
            String jobDate = job.select(".gxsj").first().text();
            // 将信息保存到Map里
            data.put("jobTitle", jobTitle);
            data.put("jobUrl", jobUrl);
            data.put("companyName", companyName);
            data.put("companyUrl", companyUrl);
            data.put("jobCity", jobCity);
            data.put("jobSalary", jobSalary);
            data.put("jobDate", jobDate);
            // 将Map添加到列表里
            dataList.add(data);
        }
        return dataList;
    }
}

总结

本文介绍了如何使用Java编写爬虫程序,以爬取某招聘网站的招聘信息为例,并采用代理IP提高爬取效率。本文主要包括爬虫程序的基本架构、如何获取目标网站的页面内容、解析HTML页面,提取所需信息、代理IP的使用以及完整代码和运行截图等内容。

爬虫技术无疑为我们提供了更多的信息来源,但在使用时也需要注意合法性,尊重网站的规则和隐私,避免对网站造成不友好的影响。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker部署mysql

docker部署mysql Docker部署MySQL配置远程登录持久化数据创建容器时配置挂载卷后置配置挂载卷 Docker卸载MySQL部署特定版本mysql【出现1251错误】远程连接docker容器中的mysql8.0数据库时出现连接不上 Docker部署MySQL 要使用Docker部署MySQL&#xff0c;你可以使用官方的MyS…

伊朗黑客对以色列科技和教育领域发起破坏性网络攻击

导语 近期&#xff0c;以色列的高等教育和科技领域遭受了一系列破坏性的网络攻击。这些攻击始于2023年1月&#xff0c;旨在部署以前未记录的数据清除恶意软件。在最近的攻击中&#xff0c;攻击者试图窃取个人身份信息和知识产权等敏感数据。本文将介绍这些攻击的具体细节&#…

Go语言开发环境安装,hello world!

1. Go开发包SDK https://golang.google.cn/dl/&#xff08;国内也可以安装&#xff09; 根据自己电脑下载对应的安装包&#xff0c;我懒下载了msi安装 然后一路点确定安装Go 2.安装GoLand https://www.jetbrains.com/go/download/#sectionwindows 下载安装包 一路确定安装完…

大数据疫情分析及可视化系统 计算机竞赛

文章目录 0 前言2 开发简介3 数据集4 实现技术4.1 系统架构4.2 开发环境4.3 疫情地图4.3.1 填充图(Choropleth maps)4.3.2 气泡图 4.4 全国疫情实时追踪4.6 其他页面 5 关键代码最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 大数据疫…

Linux 安装 Nginx 并配置为系统服务(超详细)

目录 前言安装 Nginx安装依赖项下载Nginx解压Nginx编译和安装防火墙设置启动Nginx 配置 Nginx 为系统服务配置 Nginx 服务文件启动 Nginx 服务设置开机自启动检查 Nginx 状态停止 Nginx 服务重启 Nginx 服务 卸载 Nginx结语 前言 Nginx是一款卓越的高性能Web服务器&#xff0c…

STM32 IIC 实验

1. 可以选择I2C1&#xff0c;也可以选择I2C2&#xff0c;或者同时选择&#xff0c;同时运行 配置时钟信号 为节约空间&#xff0c;选择这两个&#xff0c;然后选择GENERATE CODE 二、HAL_I2C_Mem_Write I2C_HandleTypeDef *hi2c&#xff1a;I2C设备句柄 uint16_t DevAddress&am…

算法进阶指南图论 道路与航线

其实再次看这题的时候。想法就是和强连通分量有关&#xff0c;我们很容易发现&#xff0c;题目中所说的双向边&#xff0c;就构成了一个强连通分量&#xff0c;而所谓的单向边&#xff0c;则相当于把强连通分量进行缩点&#xff0c;然后整个图成为了一个DAG&#xff0c;众所周知…

new Vue() 发生了什么

目录 前言: 原理: 代码: 用法: 总结: 相关资料: 前言: 在Vue.js中&#xff0c;当你创建一个新的Vue实例时&#xff0c;通过 new Vue() 发生了一系列重要的操作&#xff0c;包括Vue实例的初始化、数据绑定、模板编译等。这个过程是Vue应用的核心&#xff0c;本文将深入探…

可恶的 TCP 加速

中午有朋友给我发来一个图片&#xff0c;早期 TCP 规范起草人&#xff0c;david reed 老爷子气坏了&#xff1a; 互联网本是一个以合作而共赢的网络&#xff0c;结果被一群损人不利己的自私的家伙以无知的方式将这基本原则破坏掉了。 我没有能力如此言简意赅且优雅地喷(jerks…

【赠书第2期】嵌入式虚拟化技术与应用

文章目录 前言 1 背景概述 2 专家推荐 3 本书适合谁&#xff1f; 4 内容简介 5 书籍目录 6 权威作者团队 7 粉丝福利 前言 随着物联网设备的爆炸式增长和万物互联应用的快速发展&#xff0c;虚拟化技术在嵌入式系统上受到了业界越来越多的关注、重视和实际应用。嵌入式…

第八章《搞懂算法:逻辑回归是怎么回事》笔记

8.1 如何理解逻辑回归 逻辑回归根据给定的自变量数据集来估计事件的发生概率&#xff0c;由于结果是一个概率&#xff0c;因此因变量的范围在 0 和 1 之间。 逻辑回归的与线性回归一样&#xff0c;也是以线性函数为基础的&#xff1b;而与线性回归不同的是&#xff0c;逻辑回…

【广州华锐互动】VR影视制片虚拟仿真教学系统

随着虚拟现实(VR)技术的不断发展&#xff0c;VR在影视制片教学中的应用场景也变得越来越丰富。本文将介绍VR在影视制片教学中的常见应用场景及其意义&#xff0c;并通过案例分析来更好地展示其应用前景。 在影视制片教学中&#xff0c;VR可以提供一种沉浸式的制作体验。其中&am…

Unity 3D 调整cube的颜色

1.选中Assets后&#xff0c;右键->Create->Material 2.调整Material的颜色&#xff0c;然后将Material拖到对应的cube上

微头条项目实战:通过postman测试登录验证请求

1、CrosFilter package com.csdn.headline.filters; import jakarta.servlet.*; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; public class CrosFilter implements Filter {/*** 过滤器方法&#xff0c;用于处理HTTP请求* param servletReq…

【Orangepi Zero2 全志H616】驱动舵机控制 、Linux定时器(signal、setitimer)

一、SG90舵机开发 舵机基本介绍 二、Linux定时器 signal 函数setitimer 函数原型signal、setitimer函数API调用 三、舵机 软件PWM实现 一、SG90舵机开发 舵机基本介绍 如下图所示&#xff0c;最便宜的舵机sg90&#xff0c;常用三根或者四根接线&#xff0c;黄色为PWM信号控…

python爬虫(数据获取——双R)

静态资源加载 静态资源给了请求头和url即可 动态资源加载 headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 } url "https://www.xinpianchang.com/api/xpc/comments/article…

flink的带状态的RichFlatMapFunction函数使用

背景 使用RichFlatMapFunction可以带状态来决定如何对数据流进行转换&#xff0c;而且这种用法非常常见&#xff0c;根据之前遇到过的某个key的状态来决定再次遇到同样的key时要如何进行数据转换&#xff0c;本文就来简单举个例子说明下RichFlatMapFunction的使用方法 RichFl…

智慧工地综合管理平台-项目整体需求规格说明书

引言 定位与目标 智慧工地是一种现代化的管理方式,目标是通过应用现代科技手段,对施工现场的设备、人员、物资等信息全面掌控,减少工地事故的发生,提高施工质量和安全性,同时也能够降低成本,提高效益,实现建筑施工的数字化、智能化和可持续发展,为城市建设和社会发展…