• 【爬虫】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获取网页内容的示例代码:

    1. public String getHtml(String url) {
    2.     String html = null;
    3.     try {
    4.         // 创建HttpClient对象
    5.         CloseableHttpClient httpClient = HttpClients.createDefault();
    6.         // 创建HttpGet请求
    7.         HttpGet httpGet = new HttpGet(url);
    8.         // 执行HttpGet请求,获取HttpResponse响应
    9.         CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
    10.         // 获取HttpEntity实例
    11.         HttpEntity entity = httpResponse.getEntity();
    12.         // 使用EntityUtils工具类将HttpEntity转换成字符串
    13.         html = EntityUtils.toString(entity, "utf-8");
    14.         // 关闭资源
    15.         httpResponse.close();
    16.         httpClient.close();
    17.     } catch (Exception e) {
    18.         e.printStackTrace();
    19.     }
    20.     return html;
    21. }

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

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

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

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

    1. public List> parse(String html) {
    2.     List> dataList = new ArrayList<>();
    3.     // 使用Jsoup解析HTML页面
    4.     Document document = Jsoup.parse(html);
    5.     // 获取招聘信息列表
    6.     Elements jobElements = document.select(".newlist .jobList");
    7.     for (Element job : jobElements) {
    8.         Map data = new HashMap<>();
    9.         // 获取招聘信息
    10.         String jobTitle = job.select(".zwmc div a").first().text();
    11.         String jobUrl = job.select(".zwmc div a").first().attr("href");
    12.         String companyName = job.select(".gsmc a").first().text();
    13.         String companyUrl = job.select(".gsmc a").first().attr("href");
    14.         String jobCity = job.select(".gzdd").first().text();
    15.         String jobSalary = job.select(".zwyx").first().text();
    16.         String jobDate = job.select(".gxsj").first().text();
    17.         // 将信息保存到Map里
    18.         data.put("jobTitle", jobTitle);
    19.         data.put("jobUrl", jobUrl);
    20.         data.put("companyName", companyName);
    21.         data.put("companyUrl", companyUrl);
    22.         data.put("jobCity", jobCity);
    23.         data.put("jobSalary", jobSalary);
    24.         data.put("jobDate", jobDate);
    25.         // 将Map添加到列表里
    26.         dataList.add(data);
    27.     }
    28.     return dataList;
    29. }


     

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

    四、代理IP的使用

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

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

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

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

    1. public String getHtmlWithProxy(String url, String host, int port) {
    2.     String html = null;
    3.     try {
    4.         // 创建HttpClient对象
    5.         CloseableHttpClient httpClient = HttpClients.createDefault();
    6.         // 创建HttpGet请求
    7.         HttpGet httpGet = new HttpGet(url);
    8.         // 设置代理IP和端口
    9.         HttpHost proxy = new HttpHost(host, port);
    10.         RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
    11.         httpGet.setConfig(config);
    12.         // 执行HttpGet请求,获取HttpResponse响应
    13.         CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
    14.         // 获取HttpEntity实例
    15.         HttpEntity entity = httpResponse.getEntity();
    16.         // 使用EntityUtils工具类将HttpEntity转换成字符串
    17.         html = EntityUtils.toString(entity, "utf-8");
    18.         // 关闭资源
    19.         httpResponse.close();
    20.         httpClient.close();
    21.     } catch (Exception e) {
    22.         e.printStackTrace();
    23.     }
    24.     return html;
    25. }

    五、完整代码

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

    1. import org.apache.http.HttpEntity;
    2. import org.apache.http.HttpHost;
    3. import org.apache.http.client.config.RequestConfig;
    4. import org.apache.http.client.methods.CloseableHttpResponse;
    5. import org.apache.http.client.methods.HttpGet;
    6. import org.apache.http.impl.client.CloseableHttpClient;
    7. import org.apache.http.impl.client.HttpClients;
    8. import org.apache.http.util.EntityUtils;
    9. import org.jsoup.Jsoup;
    10. import org.jsoup.nodes.Document;
    11. import org.jsoup.nodes.Element;
    12. import org.jsoup.select.Elements;
    13. import java.util.ArrayList;
    14. import java.util.HashMap;
    15. import java.util.List;
    16. import java.util.Map;
    17. public class JobSpider {
    18.     private static final String ZHAOPIN_URL = "https://sou.zhaopin.com/jobs/searchresult.ashx";
    19.     public static void main(String[] args) {
    20.         String keyword = "Java";
    21.         String city = "北京";
    22.         int start = 0;
    23.         int count = 60;
    24.         JobSpider spider = new JobSpider();
    25.         List> dataList = spider.spiderJobInfo(keyword, city, start, count);
    26.         System.out.println(dataList);
    27.     }
    28.     public List> spiderJobInfo(String keyword, String city, int start, int count) {
    29.         List> dataList = new ArrayList<>();
    30.         try {
    31.             // 爬取数据
    32.             for (int i = start; i < start + count; i += 60) {
    33.                 // 构造请求参数
    34.                 String url = String.format("%s?jl=%s&kw=%s&start=%d", ZHAOPIN_URL, city, keyword, i);
    35.                 // 获取页面HTML
    36.                 String html = getHtmlWithProxy(url, "127.0.0.1", 1080);
    37.                 // 解析HTML页面,提取信息
    38.                 List> jobList = parse(html);
    39.                 // 将解析结果添加到结果集中
    40.                 dataList.addAll(jobList);
    41.             }
    42.         } catch (Exception e) {
    43.             e.printStackTrace();
    44.         }
    45.         return dataList;
    46.     }
    47.     public String getHtml(String url) {
    48.         String html = null;
    49.         try {
    50.             // 创建HttpClient对象
    51.             CloseableHttpClient httpClient = HttpClients.createDefault();
    52.             // 创建HttpGet请求
    53.             HttpGet httpGet = new HttpGet(url);
    54.             // 执行HttpGet请求,获取HttpResponse响应
    55.             CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
    56.             // 获取HttpEntity实例
    57.             HttpEntity entity = httpResponse.getEntity();
    58.             // 使用EntityUtils工具类将HttpEntity转换
    59. 成字符串
    60.             html = EntityUtils.toString(entity, "utf-8");
    61.             // 关闭资源
    62.             httpResponse.close();
    63.             httpClient.close();
    64.         } catch (Exception e) {
    65.             e.printStackTrace();
    66.         }
    67.         return html;
    68.     }
    69.     public String getHtmlWithProxy(String url, String host, int port) {
    70.         String html = null;
    71.         try {
    72.             // 创建HttpClient对象
    73.             CloseableHttpClient httpClient = HttpClients.createDefault();
    74.             // 创建HttpGet请求
    75.             HttpGet httpGet = new HttpGet(url);
    76.             // 设置代理IP和端口
    77.             HttpHost proxy = new HttpHost(host, port);
    78.             RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
    79.             httpGet.setConfig(config);
    80.             // 执行HttpGet请求,获取HttpResponse响应
    81.             CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
    82.             // 获取HttpEntity实例
    83.             HttpEntity entity = httpResponse.getEntity();
    84.             // 使用EntityUtils工具类将HttpEntity转换成字符串
    85.             html = EntityUtils.toString(entity, "utf-8");
    86.             // 关闭资源
    87.             httpResponse.close();
    88.             httpClient.close();
    89.         } catch (Exception e) {
    90.             e.printStackTrace();
    91.         }
    92.         return html;
    93.     }
    94.     public List> parse(String html) {
    95.         List> dataList = new ArrayList<>();
    96.         // 使用Jsoup解析HTML页面
    97.         Document document = Jsoup.parse(html);
    98.         // 获取招聘信息列表
    99.         Elements jobElements = document.select(".newlist .jobList");
    100.         for (Element job : jobElements) {
    101.             Map data = new HashMap<>();
    102.             // 获取招聘信息
    103.             String jobTitle = job.select(".zwmc div a").first().text();
    104.             String jobUrl = job.select(".zwmc div a").first().attr("href");
    105.             String companyName = job.select(".gsmc a").first().text();
    106.             String companyUrl = job.select(".gsmc a").first().attr("href");
    107.             String jobCity = job.select(".gzdd").first().text();
    108.             String jobSalary = job.select(".zwyx").first().text();
    109.             String jobDate = job.select(".gxsj").first().text();
    110.             // 将信息保存到Map里
    111.             data.put("jobTitle", jobTitle);
    112.             data.put("jobUrl", jobUrl);
    113.             data.put("companyName", companyName);
    114.             data.put("companyUrl", companyUrl);
    115.             data.put("jobCity", jobCity);
    116.             data.put("jobSalary", jobSalary);
    117.             data.put("jobDate", jobDate);
    118.             // 将Map添加到列表里
    119.             dataList.add(data);
    120.         }
    121.         return dataList;
    122.     }
    123. }

    总结

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

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

  • 相关阅读:
    SMOKE 单目相机 3D目标检测【训练模型】
    三元数异或(秋季每日一题 4)
    嵌入式硬件基础知识
    【全开源】进销存订货通管理系统(FastAdmin+ThinkPHP+Layui)
    力扣(LeetCode)1620. 网络信号最好的坐标(C++)
    DM8:达梦数据库dexp-DMP逻辑导出按用户模式定时自动备份数据库
    一行代码安装Tensorflow和Keras以及pytorch环境
    “轻松解决Linux应用程序无法访问的难题:关闭SELinux就对了!“
    springmvc
    【计算机】CPU,芯片以及操作系统概述
  • 原文地址:https://blog.csdn.net/wq10_12/article/details/134287571