项目实践《招聘网站数据爬取》

news2024/12/23 13:43:56

文章目录

  • 一、模块导入部分
  • 二、预定义参数部分
  • 三、函数定义部分:send_get(page)
  • 四、函数定义部分:process_data(data)
  • 五、函数定义部分:responsibility(job_url)
  • 六、函数定义部分:while_data()
  • 七、主程序执行部分:
  • 八、完整版代码

这个Python脚本的主要目标是解析"yiqifu.baidu.com"上的招聘信息,提取方面包括城市、公司名称、学历要求、工作经验、岗位名、薪资待遇以及岗位职责等信息,然后保存在Excel文件中。下面分别从各个模块和函数分析:

一、模块导入部分

这个脚本使用了requests,json,time,pandas以及BeautifulSoup等模块。requests用于发送网络请求,json用于处理JSON类型数据,time用于添加休眠抗拒请求过度频繁被服务器封禁的风险,pandas用于处理和存储数据,BeautifulSoup用于解析HTML页面。

import requests
import json
import time
import pandas as pd
from bs4 import BeautifulSoup

在这里插入图片描述

二、预定义参数部分

此部分定义了头部信息(headers)和请求网址(url)。头部信息用于构造符合服务器要求的http请求,避免因为缺乏必要的头部信息而导致请求被拒绝。请求网址是数据抓取的源头

headers = {
    'Accept':'application/json, text/plain, */*',
    'Accept-Encoding':'gzip, deflate, br, zstd',
    'Accept-Language':'zh-CN,zh;q=0.9',
    'Connection':'keep-alive',
    'Host':'yiqifu.baidu.com',
    'Referer':'https://yiqifu.baidu.com/g/aqc/joblist?q=python',
    'Sec-Ch-Ua':'"Chromium";v="122", "Not(A:Brand";v="24", "Google Chrome";v="122"',
    'Sec-Ch-Ua-Mobile':'?0',
    'Sec-Ch-Ua-Platform':'"Windows"',
    'Sec-Fetch-Dest':'empty',
    'Sec-Fetch-Mode':'cors',
    'Sec-Fetch-Site':'same-origin',
    'X-Requested-With':'XMLHttpRequest',
    'Cookie':'BIDUPSID=FFE582BA7343E4BDE8F2B0969587933A; PSTM=1701944630; BAIDUID=FFE582BA7343E4BDDB41B7BF2E661BA5:FG=1; BDUSS=NrUG9jTlVkRFBXa3V0bW5pNjNFUGdHaTdnc21rdXpkZUpvTU9nbFpaaGpVZEJsSVFBQUFBJCQAAAAAAAAAAAEAAABJQjjR0-nA1mNhcmV5eQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGPEqGVjxKhlc0; BDUSS_BFESS=NrUG9jTlVkRFBXa3V0bW5pNjNFUGdHaTdnc21rdXpkZUpvTU9nbFpaaGpVZEJsSVFBQUFBJCQAAAAAAAAAAAEAAABJQjjR0-nA1mNhcmV5eQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGPEqGVjxKhlc0; MCITY=-75%3A; H_WISE_SIDS_BFESS=40045_40166_40202_39662_40210_40216_40222; H_WISE_SIDS=39662_40210_40216_40222_40271_40294_40291_40289_40286_40317_40079; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; H_PS_PSSID=39662_40210_40216_40222_40271_40294_40291_40289_40286_40317_40079_40364_40352_40301_40381_40366; BA_HECTOR=81ak8h048gak8ga1a485a1849i0vgo1iuja9s1t; ZFY=SJTaRNG4jPGf5XpXAboM31VLOh8ATplB5TW1u:Atu7Tk:C; BAIDUID_BFESS=FFE582BA7343E4BDDB41B7BF2E661BA5:FG=1; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; delPer=0; PSINO=7; clue_site=pc; clue_ext=%7B%22referer%22%3A%22www.baidu.com%22%2C%22ref_eqid%22%3A%22b9d3408400103e780000000665e9c22e%22%7D; log_guid=9c965543f29ee6e76083129d371aaa8a; log_first_time=1709818419524; Hm_lvt_37e1bd75d9c0b74f7b4a8ba07566c281=1709818420; Hm_lpvt_37e1bd75d9c0b74f7b4a8ba07566c281=1709818903; log_last_time=1709818910917',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'
}

三、函数定义部分:send_get(page)

这个方法是在抓取分页数据时使用。它从参数中获取要抓取的页数,然后构造请求url并发送GET请求,最后解析得到的JSON数据并返回’data’字段中的’list’元素(这个元素包含了职位的详细信息)。

# 请求地址
url = 'https://yiqifu.baidu.com/g/aqc/joblist/getDataAjax?'

# 发送请求
def send_get(page):
    try:
        # 设置请求参数,其中q是查询关键字,page是页码,district是城市代码,salaryrange是薪资范围
        params = f'q=python&page={page}&district=510100&salaryrange='
        res = requests.get(url,headers=headers,params=params)
        # 将请求结果转为JSON格式
        res_loads = json.loads(res.text)
        # 通过对应的关键字获取请求数据
        res_list = res_loads['data']['list']
        # 返回请求结果列表
        return res_list
    except:
        # 如果请求失败,则返回一个空列表
        return []

四、函数定义部分:process_data(data)

这个方法用于处理从send_get方法获取的JSON数据。首先构造一个字典,然后从参数传入的职位数据中提取出所需的信息并放入字典中,同时还调用了responsibility()函数获取职位详细描述。函数最后将处理后的职位信息返回。
在这里插入图片描述


# 处理数据(pandas需要)
def process_data(data):
    # 创建一个字典用于存放数据
    job_data = {}
    # 提取和存放职位信息
    job_data['城市'] = data['city']
    job_data['公司名称'] = data['company']
    job_data['学历要求'] = data['edu']
    job_data['工作经验'] = data['exp']
    # 将<em></em>删除掉,替换招聘岗位名称中的HTML标签
    job_data['招聘岗位'] = data['jobName'].replace('<em>', '').replace('</em>', '')
    job_data['薪资待遇'] = data['salary']
    # 提取招聘详情的链接
    bid = data['bid']
    jobId = data['jobId']
    job_url = f'https://yiqifu.baidu.com/g/aqc/jobDetail?bid={bid}&jobId={jobId}&from=ps&fr=job_ald&rq=pos'
    # 获取岗位职责信息,并存放到字典中
    job_data['岗位职责'] = responsibility(job_url)
    print(f'正在获取{job_data}')
    # 返回职位信息字典
    return job_data

五、函数定义部分:responsibility(job_url)

这个方法基于BeautifulSoup模块,用于解析职位详情页中的职责信息。它首先发送请求获取职位详情页的内容,然后使用BeautifulSoup解析页面并进一步提取出职位职责信息。


# 获取岗位职责
def responsibility(job_url):
    detail_res = requests.get(job_url)
    res = requests.get(job_url,headers=headers)
    bs = BeautifulSoup(res.text,"html.parser")
    scripts = bs.find_all("script")
    text = ""
    for script in scripts:
        if "window.pageData" in script.text:
            text=script.text
    start = text.find("window.pageData = ")+len("window.pageData = ")
    end = text.find(" || {}")
    job_des = text[start:end]
    data = json.loads(job_des)
    time.sleep(1)
    return data["desc"].replace("<br />","").replace("</p>","").replace("<p>","").replace("&nbsp;","")

六、函数定义部分:while_data()

这是主函数,用于执行脚本的主要任务。它定义一个空列表all_data来存放所有解析到的职位数据。然后循环调用send_get()和process_data()方法以获取和处理数据。处理完的数据被添加到all_data列表中。循环结束后,返回包含所有职位信息的all_data列表。


# 循环获取数据
def while_data():
    # 创建一个列表用于存放所有的职位信息
    all_data = []
    # 循环获取数据
    for i in range(1,3):
        data = send_get(i)
        time.sleep(1)
        # 如果有获取到数据则进行处理
        if data:
            for item in data:
                # 处理数据并添加到职位信息列表中
                job = process_data(item)
                all_data.append(job)
    # 返回包含所有职位信息的列表
    return all_data

七、主程序执行部分:

调用上述定义的函数进行请求、处理数据并使用Pandas将最后的结果存储为Excel文件。


total_data = while_data()
df = pd.DataFrame(total_data)
df.to_excel('job.xlsx',index=False)

八、完整版代码

整体上,这个脚本用于抓取网站的招聘信息,并进行相关的清洗和整理工作,最后将得到的数据保存为Excel文件,方便后续的分析和使用。

import requests
import json
import time
import pandas as pd
from bs4 import BeautifulSoup

# 必须要完整的headers,否则会拒绝请求
headers = {
    'Accept':'application/json, text/plain, */*',
    'Accept-Encoding':'gzip, deflate, br, zstd',
    'Accept-Language':'zh-CN,zh;q=0.9',
    'Connection':'keep-alive',
    'Host':'yiqifu.baidu.com',
    'Referer':'https://yiqifu.baidu.com/g/aqc/joblist?q=python',
    'Sec-Ch-Ua':'"Chromium";v="122", "Not(A:Brand";v="24", "Google Chrome";v="122"',
    'Sec-Ch-Ua-Mobile':'?0',
    'Sec-Ch-Ua-Platform':'"Windows"',
    'Sec-Fetch-Dest':'empty',
    'Sec-Fetch-Mode':'cors',
    'Sec-Fetch-Site':'same-origin',
    'X-Requested-With':'XMLHttpRequest',
    'Cookie':'BIDUPSID=FFE582BA7343E4BDE8F2B0969587933A; PSTM=1701944630; BAIDUID=FFE582BA7343E4BDDB41B7BF2E661BA5:FG=1; BDUSS=NrUG9jTlVkRFBXa3V0bW5pNjNFUGdHaTdnc21rdXpkZUpvTU9nbFpaaGpVZEJsSVFBQUFBJCQAAAAAAAAAAAEAAABJQjjR0-nA1mNhcmV5eQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGPEqGVjxKhlc0; BDUSS_BFESS=NrUG9jTlVkRFBXa3V0bW5pNjNFUGdHaTdnc21rdXpkZUpvTU9nbFpaaGpVZEJsSVFBQUFBJCQAAAAAAAAAAAEAAABJQjjR0-nA1mNhcmV5eQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGPEqGVjxKhlc0; MCITY=-75%3A; H_WISE_SIDS_BFESS=40045_40166_40202_39662_40210_40216_40222; H_WISE_SIDS=39662_40210_40216_40222_40271_40294_40291_40289_40286_40317_40079; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; H_PS_PSSID=39662_40210_40216_40222_40271_40294_40291_40289_40286_40317_40079_40364_40352_40301_40381_40366; BA_HECTOR=81ak8h048gak8ga1a485a1849i0vgo1iuja9s1t; ZFY=SJTaRNG4jPGf5XpXAboM31VLOh8ATplB5TW1u:Atu7Tk:C; BAIDUID_BFESS=FFE582BA7343E4BDDB41B7BF2E661BA5:FG=1; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; delPer=0; PSINO=7; clue_site=pc; clue_ext=%7B%22referer%22%3A%22www.baidu.com%22%2C%22ref_eqid%22%3A%22b9d3408400103e780000000665e9c22e%22%7D; log_guid=9c965543f29ee6e76083129d371aaa8a; log_first_time=1709818419524; Hm_lvt_37e1bd75d9c0b74f7b4a8ba07566c281=1709818420; Hm_lpvt_37e1bd75d9c0b74f7b4a8ba07566c281=1709818903; log_last_time=1709818910917',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'
}

# 请求地址
url = 'https://yiqifu.baidu.com/g/aqc/joblist/getDataAjax?'

# 发送请求
def send_get(page):
    try:
        # 设置请求参数,其中q是查询关键字,page是页码,district是城市代码,salaryrange是薪资范围
        params = f'q=python&page={page}&district=510100&salaryrange='
        res = requests.get(url,headers=headers,params=params)
        # 将请求结果转为JSON格式
        res_loads = json.loads(res.text)
        # 通过对应的关键字获取请求数据
        res_list = res_loads['data']['list']
        # 返回请求结果列表
        return res_list
    except:
        # 如果请求失败,则返回一个空列表
        return []

# 处理数据(pandas需要)
def process_data(data):
    # 创建一个字典用于存放数据
    job_data = {}
    # 提取和存放职位信息
    job_data['城市'] = data['city']
    job_data['公司名称'] = data['company']
    job_data['学历要求'] = data['edu']
    job_data['工作经验'] = data['exp']
    # 将<em>和</em>删除掉,替换招聘岗位名称中的HTML标签
    job_data['招聘岗位'] = data['jobName'].replace('<em>', '').replace('</em>', '')
    job_data['薪资待遇'] = data['salary']
    # 提取招聘详情的链接
    bid = data['bid']
    jobId = data['jobId']
    job_url = f'https://yiqifu.baidu.com/g/aqc/jobDetail?bid={bid}&jobId={jobId}&from=ps&fr=job_ald&rq=pos'
    # 获取岗位职责信息,并存放到字典中
    job_data['岗位职责'] = responsibility(job_url)
    print(f'正在获取{job_data}')
    # 返回职位信息字典
    return job_data

# 获取岗位职责
def responsibility(job_url):
    detail_res = requests.get(job_url)
    res = requests.get(job_url,headers=headers)
    bs = BeautifulSoup(res.text,"html.parser")
    scripts = bs.find_all("script")
    text = ""
    for script in scripts:
        if "window.pageData" in script.text:
            text=script.text
    start = text.find("window.pageData = ")+len("window.pageData = ")
    end = text.find(" || {}")
    job_des = text[start:end]
    data = json.loads(job_des)
    time.sleep(1)
    return data["desc"].replace("<br />","").replace("</p>","").replace("<p>","").replace("&nbsp;","")

# 循环获取数据
def while_data():
    # 创建一个列表用于存放所有的职位信息
    all_data = []
    # 循环获取数据
    for i in range(1,3):
        data = send_get(i)
        time.sleep(1)
        # 如果有获取到数据则进行处理
        if data:
            for item in data:
                # 处理数据并添加到职位信息列表中
                job = process_data(item)
                all_data.append(job)
    # 返回包含所有职位信息的列表
    return all_data


total_data = while_data()
df = pd.DataFrame(total_data)
df.to_excel('job.xlsx',index=False)

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

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

相关文章

antd5 虚拟列表原理(rc-virtual-list)

github:https://github.com/react-component/virtual-list rc-virtual-list 版本 3.11.4(2024-02-01) 版本&#xff1a;virtual-list-3.11.4 Development npm install npm start open http://localhost:8000/List 组件接收 Props PropDescriptionTypeDefaultchildrenRender …

57、服务攻防——应用协议RsyncSSHRDP漏洞批扫口令猜解

文章目录 口令猜解——Hydra-FTP&RDP&SSH配置不当——未授权访问—Rsync文件备份协议漏洞——应用软件-FTP&Proftpd搭建 口令猜解——Hydra-FTP&RDP&SSH FTP&#xff1a;文本传输协议&#xff0c;端口21&#xff1b;RDP&#xff1a;windows上远程终端协议…

华为WLAN配置攻击检测功能示例

华为WLAN配置攻击检测功能示例 组网图形 图1 配置攻击检测功能组网图 配置流程组网需求配置思路配置注意事项操作步骤配置文件 配置流程 WLAN不同的特性和功能需要在不同类型的模板下进行配置和维护&#xff0c;这些模板统称为WLAN模板&#xff0c;如域管理模板、射频模板、…

Linux使用git命令行教程

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 git安装git仓库的创建.git 文件添加文件git 三板斧(add,commit,push)解释拓展git log.gitignore git安装 首先输入git --version看看有没有安装git 如…

力扣每日一题 矩阵中移动的最大次数 DP

Problem: 2684. 矩阵中移动的最大次数 复杂度 ⏰ 时间复杂度: O ( n m ) O(nm) O(nm) &#x1f30e; 空间复杂度: O ( n m ) O(nm) O(nm) Code class Solution { public int maxMoves(int[][] grid){int n grid.length;int m grid[0].length;int[][] f new int[n][m]…

嵌入式硬件设计(一)|利用 NodeMCU-ESP8266 开发板和继电器结合APP“点灯•blinker”制作Wi-Fi智能开关(附有关硬件详细资料)

概述 本文主要讲述利用 NodeMCU-ESP8266 开发板和继电器通过手机 APP “ 点灯 • Blinker ” 制作一款能够由手机控制的WiFi 智能开关&#xff0c;从而实现智能物联。NodeMCU 是基于 Lua 的开源固件&#xff0c;ESP8266-NodeMCU是一个开源硬件开发板&#xff0c;支持WiFi功能&a…

SAP CAP篇十五:写个ERP的会计系统吧,Part II

本文目录 本系列文章目标开发步骤数据库表设计初始数据初始数据&#xff1a;AccountCategories初始数据&#xff1a;AccountUsages初始数据&#xff1a;ChartOfAccounts初始数据&#xff1a;AccountSubjects Service 定义生成Fiori AppApp运行 本系列文章 SAP CAP篇一: 快速创…

ABC345(A-C)

A - Leftrightarrow(100 points) 语法题&#xff0c;输入一个字符串&#xff0c;判断是否是&#xff1a;的样式&#xff0c;输入后只需判断是第一个和最后一个字符是否分别为">"和"<",再判断中间是否都是""即可。 #include<bits/stdc…

zookeeper快速入门二:zookeeper基本概念

本文是zookeeper系列之快速入门中的第二篇&#xff0c;欢迎大家观看与指出不足。 目录 一、zookeeper的存储结构 二、什么是znode 三、znode节点的四种类型 四、权限控制ACL&#xff08;Access Control List&#xff09; 五、事件监听watcher 一、zookeeper的存储结构 z…

消息队列思想学习(以及池化思想延展)

目录 消息队列的功能 消息中间件必备 池化思想以及弹性线程池的设计 弹性连接池 [核心参数&#xff1a;初始连接数&#xff0c;最大连接数&#xff0c;最大空闲时间] 弹性线程池 [核心参数&#xff1a;coreThreadCount, maxThreadCount] 引言&#xff1a;为啥要把消息队列…

C语言从入门到熟悉------第五阶段

结构体 结构体很重要&#xff0c;一定要掌握。但是在很多C语言书籍中结构体的内容讲得非常少&#xff0c;因为从结构体开始&#xff0c;后面介绍的内容已经超出C语言基础的范畴&#xff0c;属于C高级编程部分了。仅仅具备前面的知识是远远不够的&#xff0c;因为在实际编程中&…

用 Visual Studio 调试器中查看内存中图像

返回目录&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 前一篇&#xff1a;OpenCV4.9.0在windows系统下的安装 后一篇&#xff1a; ​警告 本教程可以包含过时的信息。 Image Watch 是 Microsoft Visual Studio 的插件&#xff0c;可用于在调…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Rating)

提供在给定范围内选择评分的组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Rating(options?: { rating: number, indicator?: boolean }) 从API version 9开始&#…

linux源配置:ubuntu、centos

1、ubuntu源配置 1&#xff09;先查电脑版本型号: lsb_release -c2&#xff09;再编辑源更新&#xff0c;源要与上面型号对应 参考&#xff1a;https://midoq.github.io/2022/05/30/Ubuntu20-04%E6%9B%B4%E6%8D%A2%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F%E6%BA%90/ /etc/apt/…

海外直播带货对直播网络的要求

海外直播带货已成为电商领域的热门趋势&#xff0c;吸引了越来越多的品牌和商家参与。然而&#xff0c;要实现成功的海外直播带货&#xff0c;稳定、高效的直播网络是至关重要的。以下是海外直播带货对直播网络的主要要求&#xff1a; 1、稳定的网络连接&#xff1a; 海外直播带…

业务场景解析——如何执行重要的批次任务

业务场景解析之——如何执行批次重要的任务 前言一、流程时序二、并发设计 前言 这次业务场景上需要跑一批任务识别任务&#xff0c;而每个具体任务识别都比较重要&#xff0c;需要调用外部接口进行计费&#xff0c;而量又比较大&#xff0c;这就要求这个任务是比较稳定安全的。…

macbook删除软件只需几次点击即可彻底完成?macbook删除软件没有叉 苹果笔记本MacBook电脑怎么卸载软件? cleanmymac x怎么卸载

在MacBook的使用过程中&#xff0c;软件安装和卸载是我们经常需要进行的操作。然而&#xff0c;不少用户在尝试删除不再需要的软件时&#xff0c;常常发现这个过程既复杂又耗时。尽管MacOS提供了一些基本的macbook删除软件方法&#xff0c;但很多时候这些方法并不能彻底卸载软件…

实验室管理系统 |基于springboot框架+ Mysql+JSP技术+Tomcat的实验室管理系统 设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 用户后台功能模块 用户后台管理 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunw…

怎么利用视频截取gif?三步在线转换gif

在当今的社交媒体和网络世界中&#xff0c;GIF图像已经成为了一种非常受欢迎的表达方式。它们以简洁、循环播放的形式&#xff0c;能够生动地展示一系列图像的变化。你可能好奇&#xff0c;如何从视频中提取GIF图呢&#xff1f;很简单&#xff0c;使用视频转gif工具手机、pc均可…

爱发电开发者Webhook URL如何配置并且成功返回响应

Webhook URL 爱发电提供了webhook和api两种方式为开发者提供便利。 webhook功能需要配置好url&#xff0c;每当有订单时&#xff0c;会请求配置的url&#xff1b;API功能需要开发者通过token生成sign签名&#xff0c;主动请求接口查询历史订单 Webhook URL&#xff08;用来被…