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

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()

 运行效果:

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

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

相关文章

【Unity How】Unity中如何实现物体的匀速往返移动

直接上代码 using UnityEngine;public class CubeBouncePingPong : MonoBehaviour {[Header("移动参数")][Tooltip("移动速度")]public float moveSpeed 2f; // 控制移动的速度[Tooltip("最大移动距离")]public float maxDistance 5f; // 最大…

面向对象-接口的使用

1. 接口的概述 为什么有接口? 借口是一种规则,对于继承而言,部分子类之间有共同的方法,为了约束方法的使用,使用接口。 接口的应用: 接口不是一类事物,它是对行为的抽象。 2. 接口的定义和使…

理论结合实践:用Umami构建网站分析系统

个人博客地址(欢迎大家访问):理论结合实践:用Umami构建网站分析系统 1. 引言 网站统计分析是一种通过收集、处理和分析网站数据来评估网站性能、用户行为和流量来源的综合方法。通过分析用户访问模式、页面浏览量、访问时长、用户…

【AI最前线】DP双像素sensor相关的AI算法全集:深度估计、图像去模糊去雨去雾恢复、图像重建、自动对焦

Dual Pixel 简介 双像素是成像系统的感光元器件中单帧同时生成的图像:通过双像素可以实现:深度估计、图像去模糊去雨去雾恢复、图像重建 成像原理来源如上,也有遮罩等方式的pd生成,如图双像素视图可以看到光圈的不同一半&#x…

sysbench压测DM的高可用切换测试

一、配置集群 1. 配置svc.conf [rootlocalhost dm]# cat /etc/dm_svc.conf TIME_ZONE(480) LANGUAGE(CN)DM(192.168.112.139:5236,192.168.112.140:5236) [DM] LOGIN_MODE(1) SWITCH_TIME(300) SWITCH_INTERVAL(200)二、编译sysbench 2.1 配置环境变量 [dmdba~]# vi ~/.bas…

高性能linux服务器运维实战小结 性能调优工具

性能指标 进程指标 进程关系 父进程创子进程时,调fork系统调用。调用时,父给子获取一个进程描述符,并设置新的pid,同事复制父进程的进程描述符给子进程,此时不会复制父进程地址空间,而是父子用相同地址空…

pcb元器件选型与焊接测试时的一些个人经验

元件选型 在嘉立创生成bom表,对照bom表买 1、买电容时有50V或者100V是它的耐压值,注意耐压值 2、在买1117等降压芯片时注意它降压后的固定输出,有那种可调降压比如如下,别买错了 贴片元件焊接 我建议先薄薄的在引脚上涂上锡膏…

【zookeeper03】消息队列与微服务之zookeeper集群部署

ZooKeeper 集群部署 1.ZooKeeper 集群介绍 ZooKeeper集群用于解决单点和单机性能及数据高可用等问题。 集群结构 Zookeeper集群基于Master/Slave的模型 处于主要地位负责处理写操作)的主机称为Leader节点,处于次要地位主要负责处理读操作的主机称为 follower 节点…

C 语言复习总结记录三

C 语言复习总结记录三 一 函数的定义 维基百科中对函数的定义:子程序 在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method, subprogram, callable unit),是一个大型程序中的…

MYSQL——多表设计以及数据库中三种关系模型

大致介绍数据库中三种关系模型 一对多(1:N) 定义: 一个实体可以与另一个实体的多个实例相关联,而后者只能与前者的一个实例相关联。 例子: 学生和课程的关系。 学生(1):每个学生…

OpenCV和Qt坐标系不一致问题

“ OpenCV和QT坐标系导致绘图精度下降问题。” OpenCV和Qt常用的坐标系都是笛卡尔坐标系,但是细微处有些不同。 01 — OpenCV坐标系 OpenCV是图像处理库,是以图像像素为一个坐标位置,即一个像素对应一个坐标,所以其坐标系也叫图像…

实验四:构建园区网(OSPF 动态路由)

目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验步骤 1、在 eNSP 中部署网络 2、设计全网 IP 地址 3、配置二层交换机 4、配置路由交换机并测试通信 5、配置路由接口地址 6、配置 OSPF 动态路由,实现全网互通 一、实验简介 使用路由…

《剖析 Spring 原理:深入源码的旅程(二)》

六、Spring 的 Bean 注入与装配 Spring 的 Bean 注入与装配的方式有很多种,可以通过 xml、get set 方式、构造函数或者注解等。简单易用的方式就是使用 Spring 的注解,Spring 提供了大量的注解方式,如 Autowired、Qualifier 等。Spring 还支持…

Java文件上传解压

目录结构 工具类 枚举 定义文件类型 public enum FileType {// 未知UNKNOWN,// 压缩文件ZIP, RAR, _7Z, TAR, GZ, TAR_GZ, BZ2, TAR_BZ2,// 位图文件BMP, PNG, JPG, JPEG,// 矢量图文件SVG,// 影音文件AVI, MP4, MP3, AAR, OGG, WAV, WAVE}为了避免文件被修改后缀&#xff0…

CSRF保护--laravel进阶篇

laravel对csrf非常重视,专门针对csrf作出了很多的保护。如果您是刚刚接触laravel的路由不久,那么您可能对于web.php路由文件的post请求很疑惑,因为get请求很顺利,而post请求则可能会遭遇失败。其中一个失败的原因是由于laravel的c…

jupyter notebook的 markdown相关技巧

目录 1 先选择为markdown类型 2 开关技巧 2.1 运行markdown 2.2 退出markdown显示效果 2.3 注意点:一定要 先选择为markdown类型 3 一些设置技巧 3.1 数学公式 3.2 制表 3.3 目录和列表 3.4 设置各种字体效果:加粗,斜体&#x…

【GAT】 代码详解 (1) 运行方法【pytorch】可运行版本

GRAPH ATTENTION NETWORKS 代码详解 前言0.引言1. 环境配置2. 代码的运行2.1 报错处理2.2 运行结果展示 3.总结 前言 在前文中,我们已经深入探讨了图卷积神经网络和图注意力网络的理论基础。还没看的同学点这里补习下。接下来,将开启一个新的阶段&#…

redis工程实战介绍(含面试题)

文章目录 redis单线程VS多线程面试题**redis是多线程还是单线程,为什么是单线程****聊聊redis的多线程特性和IO多路复用****io多路复用模型****redis如此快的原因** BigKey大批量插入数据测试数据key面试题海量数据里查询某一固定前缀的key如果生产上限值keys * ,fl…

神经网络问题之二:梯度爆炸(Gradient Explosion)

梯度爆炸(Gradient Explosion)是神经网络训练过程中常见的一个问题,它指的是在反向传播过程中,梯度值变得非常大,超出了网络的处理范围,从而导致权重更新变得不稳定甚至不收敛的现象。 一、产生原因 梯度爆…

小杨的N字矩阵c++

题目描述 小杨想要构造一个m*m 的 N 字矩阵( m为奇数),这个矩阵的从左上角到右下角的对角线、第1 列和第m 列都 是半角加号 ,其余都是半角减号 - 。例如,一个 5*5 的 N 字矩阵如下: --- -- -- -- --- 请…