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

文章目录

  • 一、模块导入部分
  • 二、预定义参数部分
  • 三、函数定义部分: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_listexcept:# 如果请求失败,则返回一个空列表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.textstart = 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_listexcept:# 如果请求失败,则返回一个空列表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.textstart = 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_datatotal_data = while_data()
df = pd.DataFrame(total_data)
df.to_excel('job.xlsx',index=False)

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

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

相关文章

利用express从0到1搭建后端服务

目录 步骤一&#xff1a;安装开发工具步骤二&#xff1a;安装插件步骤三&#xff1a;安装nodejs步骤四&#xff1a;搭建启动入口文件步骤五&#xff1a;启动服务器总结 在日常工作中&#xff0c;有很多重复和繁琐的事务是可以利用软件进行提效的。但每个行业又有自己的特点&…

【消息队列开发】 实现MemoryDataCenter类——管理内存数据

文章目录 &#x1f343;前言&#x1f334;数据格式的准备&#x1f332;内存操作&#x1f6a9;对于交换机&#x1f6a9;对于队列&#x1f6a9;对于绑定&#x1f6a9;对于单个消息&#x1f6a9;对于队列与消息链表&#x1f6a9;对于未确认消息&#x1f6a9;从硬盘上读取数据 ⭕总…

Java -- 异常

异常概念 异常是程序在运行期间发生的不正常的事件, 它会打断指令的正常执行流程.   设计良好的程序应该在异常发生时提供处理这些不正常事件的方法, 使程序不会因为异常的发生而阻断或产生不可预见的结果.    Java语言使用异常处理机制为程序提供了异常处理的能力. 异常分…

无线局域网——wlan

目录 一.wlan的含义和发展 二.wlan技术带来的挑战 1.企业办公场景多样 2.位置速度的要求 3.安全的要求 4.规范的挑战 三.家庭和企业不同的部署需求 1.胖AP模式组网 2.AC瘦AP模式组网 3.组网模式的不同 四.三层隧道转发实验 1.拓扑 2.AP上线 核心交换机vlan ​编辑…

LGB2028 反向输出一个三位数

&#xff08;LG是洛谷&#xff08;洛谷&#xff09;的意思&#xff09; 题目链接&#xff1a;B2028 题目描述 将一个三位数反向输出&#xff0c;例如输入 358&#xff0c;反向输出 853。 输入格式 一个三位数 n。 输出格式 反向输出 n。 输入输出样例 输入 #1 100 输…

HashMap底层是如何实现的?

1、典型回答 不同的JDK 版本&#xff0c;HashMap 的底层实现是不一样的&#xff0c;总体来说&#xff1a;在JDK 1.8 之前(不包含JDK 1.8)&#xff0c;HashMap 使用的是数组 链表实现的&#xff0c;而JDK 1.8之后(包含JDK 1.8)使用的是数组 链表或红黑树实现的 HashMap 在JD…

CTFHUB-web-信息泄漏

题目所在位置&#xff1a;技能树->web->信息泄漏 目录遍历 打开题目&#xff0c;我们进入的是这个页面 翻译过来就是 得到的信息就是&#xff1a;flag要在这些目录里面寻找&#xff0c;我们直接一个一个点开查看就行 发现得到一个flag.txt&#xff0c;点击打开得到flag …

计算机组成原理 第五章(计算机的运算方法)—第六节(算数逻辑单元)

写在前面&#xff1a; 本系列笔记主要以《计算机组成原理&#xff08;唐朔飞&#xff09;》为参考&#xff0c;大部分内容出于此书&#xff0c;笔者的工作主要是挑其重点展示&#xff0c;另外配合下方视频链接的教程展开思路&#xff0c;在笔记中一些比较难懂的地方加以自己的…

upload-labs通关方式

pass-1 通过弹窗可推断此关卡的语言大概率为js&#xff0c;因此得出两种解决办法 方法一 浏览器禁用js 关闭后就逃出了js的验证就可以正常php文件 上传成功后打开图片链接根据你写的一句话木马执行它&#xff0c;我这里采用phpinfo&#xff08;&#xff09; 方法二 在控制台…

第八阶段:uni-app小程序 --首页开发(2)

一&#xff1a;分析页面布局 1.1: 功能 搜索框&#xff1a; 轮播图&#xff1a; 分类的导航区&#xff1a; 楼层区&#xff1a; 二&#xff1a; 利用命令创建home分支 git branch git checkout -b home git branch 三&#xff1a; 配置网络请求(main.js 入口函数&#x…

TCP多线程模型、IO模型(select、poll、epoll)

我要成为嵌入式高手之3月11日Linux高编第十九天&#xff01;&#xff01; ———————————————————————————— TCP并发模型 一、TCP多线程模型&#xff1a; 缺点&#xff1a;创建线程会带来资源开销&#xff0c;能够现的并发量比较有限 二、IO模型&…

科研绘图二:箱线图(抖动散点)

R语言绘图系列—箱线图抖动散点 &#xff08;二&#xff09;: 科研绘图一&#xff1a;箱线图&#xff08;抖动散点&#xff09; 文章目录 R语言绘图系列---箱线图抖动散点&#xff08;二&#xff09;: 科研绘图一&#xff1a;箱线图&#xff08;抖动散点&#xff09; 前言一、…

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

onRequestSelected onRequestSelected(callback: () > void) 当Web组件获得焦点时触发该回调。 示例&#xff1a; // xxx.ets import web_webview from ohos.web.webviewEntry Component struct WebComponent {controller: web_webview.WebviewController new web_webv…

蓝桥集训之糖果

蓝桥集训之糖果 核心思想&#xff1a;dfs 剪枝 重复覆盖问题 暴搜 直到所有列都覆盖优化&#xff1a; 1.迭代加深 答案从1开始 2.逻辑简化 每次从可选行数最少得一列开始 3.可行性剪枝 添加估值函数h(),表示至少还需要选几行 与剩余行数的大小比较 4.**位运算 **将每包糖果…

wsl ubuntu 安装cuda nvcc环境

wsl ubuntu 安装cuda环境&#xff1a; CUDA Toolkit 11.6 Downloads | NVIDIA DeveloperDownload CUDA Toolkit 11.6 for Linux and Windows operating systems.https://developer.nvidia.com/cuda-11-6-0-download-archive?target_osLinux&target_archx86_64&Distri…

22-分支和循环语句_while语句(下)(初阶)

该代码输出什么&#xff1f; int main() {char ch \0;while ((ch getchar()) ! EOF){if (ch < 0 || ch>9){continue;}putchar(ch);}return 0; } 结果&#xff1a;该代码只打印数字字符 附&#xff1a;ASCII码表

C语言项目:数组与函数实践:扫雷游戏

目录 目录&#xff1a; 1.扫雷游戏分析与设计 1.1扫雷游戏的功能说明&#xff1a; 1.1.1使用控制台实现经典扫雷的游戏 1.1.2游戏可以通过菜单实现继续玩或者退出游戏 1.1.3扫雷棋盘是9*9的格子 1.1.4默认随机布置10个雷 1.1.5 可以排查雷 2.扫雷游戏的代码实现 1.遇到的问题…

【PyTorch】进阶学习:一文详细介绍 load_state_dict() 的应用场景、实战代码示例

【PyTorch】进阶学习&#xff1a;一文详细介绍 load_state_dict() 的应用场景、实战代码示例 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入…

特殊文件——属性文件、XML文件

目录 特殊文件 ——属性文件、XML文件 特殊文件的作用 需要掌握的知识点 Properties文件 ​编辑 构造器与方法​编辑 使用Properties 把键值对数据写出到属性文件中 ​编辑 XML文件​编辑 XML文件的作用和应用场景 解析XML文件 使用Dom4J框架解析出XML文件——下载…

windows使用nvm对node进行版本管理切换

在使用之前各位务必卸载掉自己安装过的nvm或者node版本包括环境变量之类的&#xff0c;要保证自己的电脑完全没有node环境&#xff0c;下面这些配置会自动配置node环境和安装node 参考视频 https://github.com/coreybutler/nvm-windows 访问以上链接到github去下载 点击release…