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

文章目录

  • 一、模块导入部分
  • 二、预定义参数部分
  • 三、函数定义部分: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://www.hqwc.cn/news/545079.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Spring 篇】SpringMVC拦截器:给你的应用增添色彩

嗨&#xff0c;亲爱的小伙伴们&#xff01;欢迎来到这段关于SpringMVC拦截器的奇妙之旅。今天我们要一探究竟&#xff0c;深入挖掘拦截器的神秘面纱&#xff0c;看看它是如何在你的应用中悄然发挥作用的。别怕&#xff0c;我会用最通俗易懂的语言&#xff0c;一步一步带你走进这…

C语言字符函数和字符串函数详解

Hello, 大家好&#xff0c;我是一代&#xff0c;今天给大家带来有关字符函数和字符串函数的有关知识 所属专栏&#xff1a;C语言 创作不易&#xff0c;望得到各位佬们的互三呦 一.字符函数 在C语言中有一些函数是专门为字符设计的&#xff0c;这些函数的使用都需要包含一个头文…

麒麟系统Redis7.2哨兵集群部署

redis哨兵集群部署 1、原理 Redis 哨兵模式是指在 Redis 集群中,有一组专门的进程(即哨兵进程)负责监控主节点和从节点的状态,并在发现故障时自动进行故障转移,以保证 Redis 集群的高可用性。 Redis 提供了哨兵的命令,哨兵命令是一个独立的进程,哨兵进程会周期性地向主…

使用 Python 编写程序保护您的眼睛

眼睛&#xff0c;是心灵的窗户&#xff0c;生活在数字时代的我们&#xff0c;眼睛首当其冲地承受冲击。盯着电脑屏幕成为我们日常工作和学习的一部分&#xff0c;导致用眼过度。那如何减少对眼睛的伤害&#xff0c;应该如何保护眼睛&#xff1f; 用眼应控制时间&#xff0c;自…

【C语言】最大公约数

给定两个数&#xff0c;求这两个数的最大公约数 方法&#xff1a;辗转相除法 例&#xff1a;36与24的最小公约数 36/241...12 24/122...0 那么12就是36与24的最大公约数。 代码如下&#xff1a; #include <stdio.h> int main() { int a 0; int b 0; scan…

一起学数据分析_2

写在前面&#xff1a;代码运行环境为jupyter&#xff0c;如果结果显示不出来的地方就加一个print()函数。 一、数据基本处理 缺失值处理&#xff1a; import numpy as np import pandas as pd#加载数据train.csv df pd.read_csv(train_chinese.csv) df.head()# 查看数据基本…

【STM32定时器(一)内部时钟定时与外部时钟 TIM小总结】

STM32 TIM详解 TIM介绍定时器类型基本定时器通用定时器高级定时器常用名词时序图预分频时序计数器时序图 定时器中断配置图定时器定时 代码调试代码案例1代码案例2 TIM介绍 定时器&#xff08;Timer&#xff09;是微控制器中的一个重要模块&#xff0c;用于生成定时和延时信号…

9.用FFmpeg测试H.264文件的解码时间

1. Essence of Method 要测试对H.264文件的解码时间&#xff0c;可以使用FFmpeg进行操作。FFmpeg是一个开源的多媒体处理工具&#xff0c;可以用来处理视频和音频文件&#xff0c;包括解码H.264文件。以下是使用FFmpeg的命令行来测试解码时间的方法&#xff1a; ffmpeg -i in…

YOLOv9改进策略:注意力机制 | 归一化的注意力模块(NAM)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a; NAM作为一种高效且轻量级的注意力机制。采用了CBAM的模块集成并重新设计了通道和空间注意子模块。 yolov9-c-NAMAttention summary: 965 layers, 51000614 parameters, 51000582 gradients, 238.9 GFLOPs 改…

【全开源】JAVA匿名情侣假装情侣系统源码支持微信小程序+微信公众号+H5

一、功能介绍 匹配情侣、聊天功能、匹配记录 会员功能、我的团队、合伙代理 修改个人资料 我们技术使用JAVA后台服务 前后端分离 springbootmybatisplusmysql 用户端 uniapp&#xff08;vue语法&#xff09;管理后台 vueelementUi 适配小程序H5公众号&#xff0c;一套源码…

LabVIEW湍流等离子体束热效率优化

LabVIEW湍流等离子体束热效率优化 利用LabVIEW虚拟仪器技术&#xff0c;对湍流等离子体束的热效率进行了实时监测与优化&#xff0c;提高其在材料处理领域的应用效率和精度。通过双进气湍流等离子体发生器&#xff0c;实现了在不同工作参数下对热效率的实时在线监测&#xff0…

数据结构-红黑树

1.容器 容器用于容纳元素集合&#xff0c;并对元素集合进行管理和维护&#xff0e; 传统意义上的管理和维护就是&#xff1a;增&#xff0c;删&#xff0c;改&#xff0c;查&#xff0e; 我们分析每种类型容器时&#xff0c;主要分析其增&#xff0c;删&#xff0c;改&#xff…