Python爬虫案例八:抓取597招聘网信息并用xlutils进行excel数据的保存

news2024/11/23 5:59:44

excel保存数据的三种方式:

 1、pandas保存excel数据,后缀名为xlsx;

  举例:       

import pandas as pd

dic = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': ['18', '19', '20', '21'],
    '住址': ['广州', '青岛', '南京', '重庆']
}
dic_file = pd.DataFrame(dic)
dic_file.to_excel('2.xlsx', index=False)

2、openpyxl保存excel数据,后缀名为xlsx;

---------A、覆盖数据-----------
from openpyxl import Workbook  
# 1、创建工作簿
wb = Workbook()

# 确定某一张表  
sheet = wb.active

# 2、数据读写
info_list = [
    ['姓名', '年龄', '性别'],
    ['张三', '19', '男'],
    ['李四', '20', '女'],
    ['王五', '21', '女']
]
for info in info_list:
    sheet.append(info)

sheet.append(['tom', '12', '女'])

# 3、保存
wb.save('2.xlsx')

-----------B、追加数据---------
from openpyxl import load_workbook

wb = load_workbook('2.xlsx')

sheet.append(['王五', '21', '女'])

sheet.save('2.xlsx')

3、xlutils保存excel数据,后缀名为xls【使用模版代码】。xlutils是一个库,它是一个成品案

使用步骤:

(1)构造一个字典,如 data = { '表名': ['张三', '18', '本科'] }

(2)复制成品代码

(3)调用保存函数

(4)修改某些内容 【表头 文件名xls 表名=键】

(5)复制导包

测试链接:https://fz.597.com/zhaopin/?page=1

代码: 



import requests
from lxml import etree
import os, xlwt, xlrd
from xlutils.copy import copy

class OneSpider(object):
    def __init__(self):
        self.no = 1
        self.city = '福州'
        self.is_text = True
        self.keyword = '司机'
        self.start_url = 'https://fz.597.com/zhaopin/c3/?'
        self.headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'
        }

    def request_url(self):
        while self.is_text:
            # 发送请求
            params = {
                'q': self.keyword,
                'page': f'{self.no}'
            }
            response = requests.get(self.start_url, headers=self.headers, params=params).text
            self.parse_response(response)
            self.no += 1
        print('------爬虫结束--------')

    def parse_response(self, response):
        A = etree.HTML(response)
        self.is_text = A.xpath('//div[@class="page"]/a[last()]/text()')
        # print(self.is_text)
        self.is_text = ''.join(self.is_text)
        self.is_text = True if self.is_text == '尾页' else False
        # -----解析正文----------
        div_list = A.xpath('//div[@class="firm_box"]/div[@class="firm-item"]')
        for div in div_list:
            zw = div.xpath('.//ul[@class="firm-list2"]/li[1]/a//text()')[0]
            gs = div.xpath('.//ul[@class="firm-list2"]/li[2]/a/text()')[0]
            info_id = div.xpath('.//ul[@class="firm-list2"]/li[1]/a/@href')[0].split('/job-')[-1].split('.html')[0]
            self.request_info_url(zw, gs, info_id)

    def request_info_url(self, zw, gs, info_id):
        # 请求详情页
        info_url = 'https://fz.597.com/job-{}.html'.format(info_id)
        response = requests.get(info_url, headers=self.headers).text
        self.parse_info_response(response, zw, gs)

    def parse_info_response(self, response, zw, gs):
        # 解析详情页
        A = etree.HTML(response)
        nr = A.xpath('.//div[@class="newTytit"]//text()')
        nr = ''.join([i.strip() for i in nr])
        sj_ts = A.xpath('//div[@class="newJobDtl "]/p[5]//text()')
        sj_ts = ''.join([i.strip() for i in sj_ts])
        # 对sj做细致的处理
        sj_ts = sj_ts.split('时间:')[-1]
        if '|' in sj_ts and '/' in sj_ts:
            sj = sj_ts.split('|')[0]
            ts = sj_ts.split('|')[1]
        else:
            if '|' in sj_ts:
                sj = sj_ts.split('|')[0]
                ts = '--'
            elif '/' in sj_ts:
                sj = '--'
                ts = sj_ts
            else:
                sj = '--'
                ts = '--'

        data = {
            '信息': [zw, gs, sj, ts, nr]
        }
        self.save_data(data, zw)
        self.no += 1

    def save_data(self, data, zw):
        '''
            保存excel模板代码
        '''
        if not os.path.exists(f'{self.city}_{self.keyword}招聘信息.xls'):
            # 1、创建 Excel 文件
            wb = xlwt.Workbook(encoding='utf-8')
            # 2、创建新的 Sheet 表
            sheet = wb.add_sheet('信息', cell_overwrite_ok=True)
            # 3、设置 Borders边框样式
            borders = xlwt.Borders()
            borders.left = xlwt.Borders.THIN
            borders.right = xlwt.Borders.THIN
            borders.top = xlwt.Borders.THIN
            borders.bottom = xlwt.Borders.THIN
            borders.left_colour = 0x40
            borders.right_colour = 0x40
            borders.top_colour = 0x40
            borders.bottom_colour = 0x40
            style = xlwt.XFStyle()
            style.borders = borders
            align = xlwt.Alignment()
            align.horz = 0x02
            align.vert = 0x01
            style.alignment = align
            header = ('职位名称', '公司名字', '时间', '天数', '内容')
            for i in range(0, len(header)):
                sheet.col(i).width = 2560 * 3
                sheet.write(0, i, header[i], style)
                wb.save(f'{self.city}_{self.keyword}招聘信息.xls')
        if os.path.exists(f'{self.city}_{self.keyword}招聘信息.xls'):
            wb = xlrd.open_workbook(f'{self.city}_{self.keyword}招聘信息.xls')
            sheets = wb.sheet_names()
            for i in range(len(sheets)):
                for name in data.keys():
                    worksheet = wb.sheet_by_name(sheets[i])
                    if worksheet.name == name:
                        rows_old = worksheet.nrows
                        new_workbook = copy(wb)
                        new_worksheet = new_workbook.get_sheet(i)
                        for num in range(0, len(data[name])):
                            new_worksheet.write(rows_old, num, data[name][num])
                        new_workbook.save(f'{self.city}_{self.keyword}招聘信息.xls')
        print(r'***正在保存第{}条信息:{}'.format(self.no, zw))

    def main(self):
        self.request_url()

if __name__ == '__main__':
    one = OneSpider()
    one.main()

 运行效果:

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

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

相关文章

Hutool工具类生成二维码

1、引入依赖 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutoo…

Java 基于SpringBoot+vue框架的老年医疗保健网站

大家好&#xff0c;我是Java徐师兄&#xff0c;今天为大家带来的是Java Java 基于SpringBootvue框架的老年医疗保健网站。该系统采用 Java 语言开发&#xff0c;SpringBoot 框架&#xff0c;MySql 作为数据库&#xff0c;系统功能完善 &#xff0c;实用性强 &#xff0c;可供大…

华为FusionCube 500-8.2.0SPC100 实施部署文档

环境&#xff1a; 产品&#xff1a;FusionCube 500版本&#xff1a;8.2.0.SPC100场景&#xff1a;虚拟化基础设施平台&#xff1a;FusionCompute两节点 MCNA * 2硬件部署&#xff08;塔式交付场景&#xff09;免交换组网&#xff08;配置AR卡&#xff09; 前置准备 组网规划 节…

社团管理新体验:SpringBoot技术

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了社团管理系统的开发全过程。通过分析社团管理系统管理的不足&#xff0c;创建了一个计算机管理社团管理系统的方案。文章介绍了社团管理系统的系统分析部分&…

SSM之Bean

前言 这一节讲bean 1.初始spring 点projects Framework是spring的基础 spring官网 这三个主流 2. 系统架构 3. 核心概念 4. Ioc入门案例 其中Dao就是我们原来管理数据库的&#xff0c;service就是业务层 这个代码很简单 要交给spring管理&#xff0c;首先要有一个配置文…

Spring循环依赖如何解决的?

一、什么是循环依赖 循环依赖&#xff1a;说白是一个或多个对象实例之间存在直接或间接的依赖关系&#xff0c;这种依赖关系构成了构成一个环形调用。 第一种情况&#xff1a;自己依赖自己的直接依赖 第二种情况&#xff1a;两个对象之间的直接依赖 第三种情况&#xff1a;多个…

Mac vscode 激活列编辑模式

列编辑模式在批量处理多行文本时&#xff0c;非常有效&#xff0c;但 vscode 默认情况下&#xff0c;又没有激活&#xff0c;因此记录一下启动方法&#xff1a; 激活列编辑模式 然后就可以使用 Alt&#xff08;Mac 上是 Option 或 Command 键&#xff09; 鼠标左键 滑动选择了…

【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

商用密码应用安全性评估,密评整体方案,密评管理测评要求和指南,运维文档,软件项目安全设计相关文档合集(Word原件)

一、 密码应用安全性评估方案 &#xff08;一&#xff09; 密码应用测评工作思路 1.1.1. 测评准备活动的主要任务 1.1.2. 测评准备活动的输出文档 1.2. 方案编制活动 1.2.1. 方案编制活动的主要任务 1.2.2. 方案编制活动的输出文档 1.3. 现场预评估活动 1.3.1. 现场测评…

docker run m3e 配置网络,自动重启,GPU等 配置渠道要点

启动命令&#xff1a; docker run -d --restart always -p 6008:6008 --gpus all --name m3e --network fastgpt_fastgpt stawky/m3e-large-api 配置渠道m3e base url要像我这样填写才行&#xff0c;不然回出问题 模型要选m3e 密钥填&#xff1a;sk-aaabbbcccdddeeefffggghhhi…

OceanBase Shell开放内核运维接口,运维更便捷

DBA在日常业务中面临着繁琐的运维管理任务&#xff0c;亟需高效的工具和灵活的解决方案帮助他们简化操作、提升效率。因此&#xff0c;命令行操作和维护工具&#xff08;CLI工具&#xff09;&#xff0c;因其高效、灵活、可远程管理以及技术深度等特点&#xff0c;成为DBA和开发…

基于MATLAB的混沌序列图像加密程序

设计目的 图像信息生动形象&#xff0c;它已成为人类表达信息的重要手段之一&#xff0c;网络上的图像数据很多是要求发送方和接受都要进行加密通信&#xff0c;信息的安全与保密显得尤为重要&#xff0c;因此我想运用异或运算将数据进行隐藏&#xff0c;连续使用同一数据对图…

SMMU软件指南操作之翻译过程概述

安全之安全(security)博客目录导读 下图展示了每个传入事务&#xff08;transaction&#xff09;所经过的简化过程。本节描述了顶层翻译过程。 一个传入事务遵循以下步骤&#xff1a; 1. 如果 SMMU 被全局禁用&#xff0c;事务将直接通过 SMMU 而不进行任何地址改变。全局属性…

WEB-通用漏洞SQL注入CTF二次堆叠DNS带外

知识点&#xff1a; 1、数据库堆叠注入 根据数据库类型决定是否支持多条语句执行 数据库支持多条语句执行就是堆叠&#xff0c;如&#xff1a; 2、数据库二次注入 应用功能逻辑涉及上导致的先写入后组合的注入 3、数据库Dnslog注入 解决不回显&#xff08;反向连接&#…

基于 DRNN 神经网络整定的 PID 解耦控制

1. 基本原理 DRNN&#xff08;Dynamic Recurrent Neural Network, 动态递归神经网络&#xff09;是一种带有时间反馈的神经网络&#xff0c;能够建模系统的动态特性&#xff0c;适用于非线性、多变量、时变系统的控制。结合 PID 解耦控制&#xff0c;利用 DRNN 进行动态建模和…

【Spring Boot】用 MyBatis 实现数据的 CRUD

用 MyBatis 实现数据的 CRUD 1.创建项目 & 引入依赖2.实现数据表的自动初始化3.实现实体对象建模4.实现实体和数据表的映射关系5.实现增加、删除、修改和查询功能6.配置分页功能6.1 增加分页支持6.2 创建分页配置类 7.实现分页控制器8.创建分页视图 本篇博客将通过 MyBatis…

极坐标气泡图:医学数据分析的可视化新视角

在医学研究中&#xff0c;数据的可视化是至关重要的。它不仅能帮助我们更直观地理解数据&#xff0c;还能揭示数据中隐藏的模式和趋势。今天&#xff0c;我们要介绍一种独特的数据可视化工具——极坐标气泡图&#xff0c;以及它在医学中的重要作用。 什么是极坐标气泡图&#…

Cmakelist.txt之Liunx-rabbitmq

1.cmakelist.txt cmake_minimum_required(VERSION 3.16) ​ project(rabbitmq_linux_test LANGUAGES C) ​ add_library(examples-common OBJECT) target_sources(examples-common PRIVATEutils.hutils.c) if(WIN32)target_sources(examples-common PRIVATE win32/platform_ut…

【AIGC】ChatGPT提示词Prompt解析:拒绝的艺术:如何优雅地说“不“

引言 在人际交往的复杂网络中,学会优雅地拒绝是一种至关重要的社交智慧。很多人往往因为害怕伤害他人的感受,而选择敷衍、拖延或不置可否。 然而,真正的智慧在于如何用尊重和同理心传达"不"的信息。 本文将深入探讨优雅拒绝的艺术,帮助你在维护自身边界的同时,…

《OpenCV 图像缩放、翻转与变换全攻略:从基础操作到高级应用实战》

简介&#xff1a;本文详细阐述了 OpenCV 在图像操作中的关键技术&#xff0c;包括缩放&#xff08;确定尺寸缩放与按比例缩放&#xff09;、翻转&#xff08;沿不同轴的翻转方式&#xff09;以及变换&#xff08;平移、旋转、三点确定变换和四点确定变换即透视变换&#xff09;…