[Python] - 爬虫之抓取 Boss直聘 数据到 Excel 中

本文介绍了一个针对Boss直聘网站的爬虫实现案例,包括爬虫的基本结构、各组件的功能及其实现方式,并提供了完整的代码示例。该爬虫能够抓取指定关键词下多页的招聘信息,并将数据整理输出到Excel文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明:此博客爬取的数据只为学习爬虫使用,绝非广告


程序介绍

文件目录

├── Zhipin_spider  # 文件夹
│   ├── spider_main.py  # 调度器。是爬虫的入口,管理各个类
│   ├── html_downloader.py # 下载器,负责网页内容的下载
│   ├── html_parser.py # 解析器,负责解析数据,获取有价值的数据
│   └── html_outputer.py # 输出,将获取到的数据输出

使用依赖

  • 采用 Requests 请求数据
  • 使用 BeautifulSoup 解析数据
  • 使用 xlsxwriter 框架保存数据到 Excel 文件中

书写流程

调度器 –> 网页下载器 –> 网页解析器 –> 输出


每个模块介绍

网页下载器
  • 使用 Requests 框架请求数据
  • 添加 header 模拟浏览器访问
  • 使用 try...except... 捕捉异常

网页下载器核心代码

# -*- coding: utf-8 -*-
# @Time    : 2018/1/7 上午11:46
# @Author  : Mazy
# @File    : html_downloader.py
# @Software: PyCharm

import requests
import ssl

class HtmlDownloader(object):
    # 通过 url + 页码 + 关键词 获取数据
    def get_page(self, baseUrl, page_num, keyword):
        try:
            # 
            param = {"query": keyword, "city": "101010100", "page": page_num}

            # 设置请求头,模拟浏览器访问
            header = {
                'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)'
                              r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
                'Referer': r'http://www.zhipin.com/job_detail/',
                'Connection': 'keep-alive'
            }

            result = requests.get(baseUrl, params=param, headers=header)

            # print(result.text)

            return result.text

        except Exception as err:
            print(err)
            print("Boss直聘爬取失败")
            return None

网页解析器
  • 使用 BeautifulSoup 提取数据
  • 将每一条数据保存到列表中,再将每一页的数据用一个大的列表包裹,形成一个二维列表

网页解析器核心代码

# -*- coding: utf-8 -*-
# @Time    : 2018/1/7 上午11:47
# @Author  : Mazy
# @File    : html_parser.py
# @Software: PyCharm

from bs4 import BeautifulSoup

class HtmlParser(object):

    def parse(self, html_content):
        if html_content is None:
            return None

        soup = BeautifulSoup(html_content, 'html.parser')
        # 获取公司的列表
        companies = soup.find('div', class_='job-list').select('ul > li')

        results = []
        for com in companies:
            res = self.get_one_company(com)
            results.append(res)

        return results


    def get_one_company(self, soup):

        company_soup = soup.find('div', class_="info-company")
        # company name
        com_name = company_soup.find('a').text
        # company desc
        com_desc = company_soup.find('p').text

        primary_soup = soup.find('div', class_="info-primary")
        # job name
        all = primary_soup.find('h3', class_="name").a.text
        sala = primary_soup.find('h3', class_="name").a.span.text
        job = all.replace(sala, "")
        # salary
        salary = primary_soup.find('h3', class_="name").a.span.text
        # conpany require
        job_require = primary_soup.find('p').text

        return [com_name, job, salary, job_require, com_desc]

数据输出到 Excel 文件中
  • 1、使用 xlwt -> Workbook 框架将数据保存到 Excel
  • 2、使用 xlsxwriter 框架将数据保存到 Excel
  • 以上方法【二选一】

输出核心代码

# -*- coding: utf-8 -*-
# @Time    : 2018/1/7 上午11:47
# @Author  : Mazy
# @File    : html_outputer.py
# @Software: PyCharm

from xlwt import Workbook, Worksheet
import xlsxwriter

class HtmlOutputer(object):

    # 使用 xlwt 将数据存到 Excel
    def save_to_excel(self, results, tag_name, file_name):

        book = Workbook(encoding="utf-8")

        tmp = book.add_sheet('sheet')

        times = len(results) + 1

        for i in range(times):
            if i==0 :
                for tag_name_i in tag_name:
                    tmp.write(i, tag_name.index(tag_name_i), tag_name_i)

            else:
                for tag_list in range(len(tag_name)):
                    tmp.write(i, tag_list, str(results[i-1][tag_list]))

        book.save(r'/Users/bai/Desktop/%s.xls' % file_name)

    # 使用 xlsxwriter 将数据存到 Excel
    def save_to_excel_other_way(self, results, tag_names, file_name):
        book = xlsxwriter.Workbook(R'/Users/bai/Desktop/%s.xls' % file_name)
        tmp = book.add_worksheet()

        row_num = len(results)

        for i in range(1, row_num+1):
            if i == 1:
                tag_pos = 'A%s' % i
                tmp.write_row(tag_pos, tag_names)
            else:
                con_pos = 'A%s' % i
                content = results[i-1]
                tmp.write_row(con_pos, content)

        book.close()

调度器
  • 主要负责管理 网页下载器、网页解析器和输出之间的调度

调度器核心代码

# -*- coding: utf-8 -*-
# @Time    : 2018/1/7 上午11:47
# @Author  : Mazy
# @File    : spider_main.py
# @Software: PyCharm

from Zhipin_spider import html_downloader, html_parser, html_outputer
import time
import random

class BOSS_Main(object):
    def __init__(self):
        self.downloader = html_downloader.HtmlDownloader()
        self.parser = html_parser.HtmlParser()
        self.outputer = html_outputer.HtmlOutputer()

    def start(self,keyword, baseURL, page_count):

        all_coms = []

        for i in range(1, page_count+1):
            # 添加延迟
            time.sleep(random.uniform(1, 5))
            # 获取网页内容
            content = self.downloader.get_page(baseURL, i, keyword)
            # 解析数据
            com_results = self.parser.parse(content)

            print("正在抓取第 %d 页数据, 有 %d 条数据" % (i, len(com_results)))
            # 保存数据到列表
            for com in com_results:
                all_coms.append(com)

        print(len(all_coms))
        print(all_coms)

        tag_name = ['公司名称', '职位名称', '工资', '所需学历', '公司介绍']
        # self.outputer.save_to_excel(all_coms, tag_name, "test")
        # 输出
        self.outputer.save_to_excel_other_way(all_coms, tag_name, "boss1")

# 程序的入口
if __name__ == "__main__":

    keyword = input('请输入抓取的关键词:\n')
    page_counts = input("请输入抓取总页数:\n")

    baseURL = "http://www.zhipin.com/job_detail/"
    bosszp = BOSS_Main()
    bosszp.start(keyword, baseURL, int(page_counts))

DEMO传送门

Zhipin_spider

### 数据爬取方案 为了实现从 Boss 网站上爬取大数据相关招信息的目标,可以基于 Selenium 和 Beautiful Soup 的组合完成这一任务。以下是具体的实现方法: #### 使用 Selenium 进行网页交互 由于 Boss 可能涉及动态加载内容以及反爬机制,因此推荐使用 Selenium 来模拟真实用户的浏览器行为。这一步骤主要用于登录、翻页和提取页面中的 HTML 内容。 ```python from selenium import webdriver import time # 初始化 WebDriver (需提前下载对应版本的 ChromeDriver 或其他驱动程序) driver = webdriver.Chrome() try: driver.get("https://www.zhipin.com/") # 打开目标网址 time.sleep(3) # 等待页面加载 # 输入关键词“大数据” search_box = driver.find_element_by_css_selector("#keyword") # 定位搜索框 search_box.send_keys("大数据") # 提交表单 submit_button = driver.find_element_by_css_selector(".search-btn") submit_button.click() # 获取当前页面源码 page_source = driver.page_source finally: driver.quit() # 关闭浏览器实例 ``` 此部分代码实现了打开 Boss 首页、输入关键字“大数据”并提交搜索的功能[^1]。 --- #### 利用 Beautiful Soup 解析数据 在获取到页面的 HTML 源码之后,可以通过 Beautiful Soup 对其进行解析,从而提取所需的字段信息(如职位名称、薪资范围、工作地点等)。 ```python from bs4 import BeautifulSoup soup = BeautifulSoup(page_source, 'html.parser') job_listings = soup.select('.job-primary') # 查找所有职位列表项 data = [] for job in job_listings: title = job.select_one('div.info-primary h3.name').text.strip() # 职位名 salary = job.select_one('span.red').text.strip() # 薪资 company_name = job.select_one('div.company-text a').text.strip() # 公司名 location = job.select_one('p.info-primary span').text.strip() # 工作地点 data.append({ "title": title, "salary": salary, "company_name": company_name, "location": location }) ``` 上述代码片段展示了如何通过 CSS 选择器定位各个字段,并将其存储为结构化的字典形式[^2]。 --- #### 数据保存与后续分析 最后,可借助 pandas 将收集的数据导出至 CSV 文件以便进一步处理;同时还可以调用 matplotlib 或 pyecharts 实现可视化展示。 ```python import pandas as pd df = pd.DataFrame(data) df.to_csv("big_data_jobs.csv", index=False) print("数据已成功保存!") ``` 至此完成了整个流程的设计——从初始访问至最终结果输出。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值