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

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


程序介绍

文件目录

├── 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

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值