python爬虫实现获取招聘信息

使用的python版本: 3.12.1

selenium版本:4.8.0

urllib版本:1.26.18

from selenium import webdriver 
from selenium.webdriver import ActionChains
import time

import re
import xlwt
import urllib.parse




def get_html(url):

    chrome_driver = r"C:\chrome-win64\chromedriver.exe"



    options = webdriver.ChromeOptions()  # 用于配置Chrome浏览器驱动程序的行为

    options.add_argument("headless")  # 无界面启动

    options.add_experimental_option('useAutomationExtension', False)  # 禁用Chrome的自动化拓展程序
    options.add_experimental_option('excludeSwitches', ['enable-automation'])  # 确保浏览器不会因为启用自动化模式而出现不必要的错误或异常。
    options.add_argument("--disable-blink-features=AutomationControlled")  # 禁用由自动化测试或脚本控制的 Blink 功能。
    driver = webdriver.Chrome(chrome_options=options, executable_path=chrome_driver)

    # webdriver防屏蔽,不加这个就会出现滑动失败
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
        Object.defineProperty(navigator, 'webdriver', {
          get: () => false
        })
      """
    })

    driver.get(url)

    time.sleep(1)
    # 找到需要滑动的滑块元素
    slider = driver.find_element("class name","nc_bg")

    # 创建操作链
    action_chains = ActionChains(driver)

    # 将鼠标移动到滑块上
    action_chains.move_to_element(slider)

    # 模拟按下鼠标左键并保持不松开
    action_chains.click_and_hold()

    # 移动鼠标使滑块达到目标位置
    action_chains.move_by_offset(300, 0)

    # 松开鼠标左键
    action_chains.release()

    # 执行操作链
    action_chains.perform()

    time.sleep(10)

    html = driver.page_source  # 获取网页源码
    driver.quit()  # 清除后再退出

    return html


def get_msg(excel1, sheet1):
    number = 0
    job_type = input("请输入你想要搜索的职位:")
    for i in range(1, 3):  # 页数自己随便改
        try:
            print("正在爬取第" + str(i) + "页数据...")
            result = urllib.parse.quote(job_type)  # 编码
            url_start = 'https://we.51job.com/api/job/search-pc?api_key=51job&keyword=' + result

            # 删除&timestamp参数,修改&pageSize=500
            url_end = '&searchType=2&function=&industry=&jobArea=090200&jobArea2=&landmark=&metro=&salary=&workYear=&degree=&companyType=&companySize=&jobType=&issueDate=&sortType=0&pageNum=' \
                      + str(i) + '&requestId=&pageSize=200&source=1&accountId=&pageCode=sou%7Csou%7Csoulb'
            url = url_start + url_end
            msg = get_html(url)  # 用seleinum写的方法处理需要滑动进入,相当于这一部分可以拿到数据了
            msg = msg.replace('\\', '')  # 将用于转义的"\"替换为空

            # `(.*?)`表示任意我们想要的内容
            # `.*?`表示任意其他字符串
            reg = re.compile(
                r'"jobName"\s*:\s*"([^"]*)".*?'
                r'"cityString"\s*:\s*"([^"]*)".*?'
                r'"provideSalaryString"\s*:\s*"([^"]*)".*?'
                r'"issueDateString"\s*:\s*"([^"]*)".*?'
                r'"workYearString"\s*:\s*"([^"]*)".*?'
                r'"degreeString"\s*:\s*"([^"]*)".*?'
                r'"companyName"\s*:\s*"([^"]*)".*?'
                r'"companyTypeString"\s*:\s*"([^"]*)".*?'
                r'"companySizeString"\s*:\s*"([^"]*)"',
                re.DOTALL)  # 表示可以用.代替任意字符(包括那些换行符)

            items = reg.findall(msg)  # 按照正则表达式规则查找

            for item in items:
                number = number + 1
                print(number, item[0], item[1], item[2], item[3], item[4], item[5], item[6], item[7], item[8])
                sheet1.write(number, 0, number)
                sheet1.write(number, 1, item[0])
                sheet1.write(number, 2, item[6])
                sheet1.write(number, 3, item[1])
                sheet1.write(number, 4, item[7])
                sheet1.write(number, 5, item[2])
                sheet1.write(number, 6, item[5])
                sheet1.write(number, 7, item[4])
                sheet1.write(number, 8, item[8])
                sheet1.write(number, 9, item[3])

                # 表格文件保存是可以选择两种情况,
                # 一种在for循环里面,每写一行保存一次,这样可以放在程序中途出现异常后,文件内容啥也没有
                # 另一种是在for循环之外,所有内容写完再保存
                excel1.save("51job.xlsx")
                time.sleep(0.5)  # 休息间隔
        except Exception as e:
            print("except:"+str(e))
            pass


def creat_xls(excel1):
    # 设置单元格格式
    sheet1 = excel1.add_sheet('Job', cell_overwrite_ok=True)
    sheet1.write(0, 0, '序号')
    sheet1.write(0, 1, '职位')
    sheet1.write(0, 2, '公司名称')
    sheet1.write(0, 3, '公司地点')
    sheet1.write(0, 4, '公司性质')
    sheet1.write(0, 5, '薪资')
    sheet1.write(0, 6, '学历要求')
    sheet1.write(0, 7, '工作经验')
    sheet1.write(0, 8, '公司规模')
    sheet1.write(0, 9, '发布时间')
    return sheet1


def main():
    # 新建表格空间
    excel1 = xlwt.Workbook()  # 创建工作簿
    sheet1 = creat_xls(excel1)  # 创建工作表

    get_msg(excel1, sheet1)  # 使用函数


if __name__ == '__main__':
    main()

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

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

相关文章

将linux的代码上传至gitte,从创建到linux命令详解

目录 1:创建gitte的代码仓库 1:登录gitte网页 https://gitee.com/ 2:点击导航栏的+号 3:点击新建仓库​编辑4:仓库配置 ​编辑5:复制仓库的路径 linux操作系统命令行 1: linux…

Hadoop集群三节点搭建(一)

一、第一台虚拟机准备 确认是可以上网,方便下载文件和工具,使用ping命令测试下 安装工具 net-tool:工具包集合,包含ifconfig等命令,大家可以根据自己需要按需下载 创建普通用户attest,并修改attest用户的密…

MO 2023 年度回顾

PART-ONE 行业态势 随着供需关系的变化,数据库的竞争在经历了 3 年 “百花齐放” 般的发展后,终于在 2023 年进入到了一个相对收拢的阶段。 2023 年,各个数据库厂商间很有默契地在两个方面达成了一致: HTAP 已经成为新一代数据…

YOLO算法入门指南:了解门槛、学习路径及其易学性

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》…

基于Segformer实现PCB缺陷检测(步骤 + 代码)

导 读 本文主要介绍基于Segformer实现PCB缺陷检测 ,并给出步骤和代码。 背景介绍 PCB缺陷检测是电子制造的一个重要方面。利用Segformer等先进模型不仅可以提高准确性,还可以大大减少检测时间。传统方法涉及手动检查,无法扩展且容易出错…

k8s---声明式资源管理(yml文件)

在k8s当中支持两种声明资源的方式: 1、 yaml格式:主要用于和管理资源对象 2、 json格式:主要用于在API接口之间进行消息传递 声明式管理方法(yaml)文件 1、 适合对资源的修改操作 2、 声明式管理依赖于yaml文件,所有的内容都在y…

webapp下没有蓝点解决

解决方法: File->Project Structure 现在就是一个JavaWeb项目了。

WMS仓储管理系统如何优化急料处理流程

在当今快速发展的商业环境中,企业的运营效率和供应链管理面临着前所未有的挑战。尤其在面对急料处理这一环节时,许多企业都感到力不从心。为了满足生产线的连续运作、确保客户订单的及时交付,WMS仓储管理系统的急料处理流程优化成为了关键。本…

(17)Linux的进程阻塞进程程序替换 exec 函数簇

前言:本章我们讲解它的 options 参数。在讲解之前我们需要理解进程阻塞,然后我们重点讲解二进程程序替换,这是本章的重点,然后介绍一个进程替换函数 execl,通过介绍这个函数来打开突破口,引入进程创建的知识…

【解决复杂链式任务,打造全能助手】LangChain 大模型 打造 钢铁侠的全能助理 Jarvis

LangChain 大模型 结合 做 AutoGPT、ChatPDF 思维链 CoTLangChain模型IO:和大模型交互、提示词模版数据连接:从数据的接入、分割,到向量的构建、存储、搜索链:串联和组织,多个语言模型、组件记忆:灵魂伴侣&…

C#中使用 async await TaskCompletionSource<T>实现异步逻辑同步写

Task、async 和 await 是 C# 中用于处理异步编程的关键概念。它们一起构成了异步编程的基础。 Task Task 是表示异步操作的抽象,它属于 System.Threading.Tasks 命名空间。Task 可以表示已经完成的任务、正在运行的任务或者尚未开始的任务。通过 Task,…

算法导论复习——CHP16 贪心算法

定义 每一步都做出当前看来最优的操作。 问题引入——活动选择问题 问题描述 活动选择问题就是对给定的包含n个活动的集合S,在已知每个活动开始时间和结束时间的条件下,从中选出最多可兼容活动的子集合,称为最大兼容活动集合。 不失一般性&a…

【C++入门】C++内存管理

目录 前言 C/C内存分布 C内存管理方式 1. new和delete操作内置类型 快速了解与使用 2. new和delete操作自定义类型 3. operator new与operator delete 4. operator new [ ] *5.定位new 6. malloc/free和new/delete的区别 总结 前言 C作为一种面向对象的编程语言&#xff…

AI:110-基于深度学习的药物分子结构生成与预测

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

Unity ab包如何加密

「ab包」全称为 AssetBundle ,是Unity提供的一种资源存储压缩包。其中储存了游戏的资源,如图片、模型、纹理、音视频、代码等文件。 由于ab包具有灵活储存、支持热更、包体较小且便于管理等优势,已经成为了市面上主流的游戏资源压缩方式。 …

Jmeter(七) - 从入门到精通 - 建立数据库测试计划实战<MySQL数据库>(详解教程)

1.简介 在实际工作中,我们经常会听到数据库的性能和稳定性等等,这些有时候也需要测试工程师去评估和测试,上一篇文章宏哥主要介绍了jmeter连接和创建数据库测试计划的过程,宏哥在文中通过示例和代码非常详细地介绍给大家,希望对各…

【中小型企业网络实战案例 七】配置限速

相关学习文章: 【中小型企业网络实战案例 一】规划、需求和基本配置 【中小型企业网络实战案例 二】配置网络互连互通【中小型企业网络实战案例 三】配置DHCP动态分配地址 【中小型企业网络实战案例 四】配置OSPF动态路由协议【中小型企业网络实战案例 五】配置可…

51单片机(STC8)-- GPIO输入输出

文章目录 I/O口相关寄存器端口数据寄存器端口模式配置寄存器(PxM0,PxM1)端口上拉电阻控制寄存器(PxPU)关于I/O的注意事项 配置I/O口I/O设置demoI/O端口模式LED控制(I/O输出)按键检测(I/O输入) S…

【模拟量采集1.2】电阻信号采集

【模拟量采集1.2】电阻信号采集 1 怎么测?2 测输入电阻电压即转为测模拟电压值,这里需要考虑选用怎样的辅助电阻?3 实际电路分析3.1 在不考虑 VCC-5V 电压的纹波等情况时(理想化此时输入的 VCC 就是稳定的 5V)3.2 若考…