当前位置:
首页 > temp > python入门教程 >
-
Python爬取招聘网站数据,并可视化展示招聘需求、薪资、招聘人数等数据
课程亮点
- 爬虫的基本流程
- re正则表达式模块的简单使用
- requests模块的使用
- 保存csv
环境介绍
- python 3.8 >>> 安装包找木子老师领取
- pycharm 2021专业版 需要激活可以找木子老师领取
-
pycharm 社区版 (免费) 没有主题
专业版 (需要激活码)
模块使用
- requests >>> pip install requests (数据请求模块)
- re
- json
- csv
- time
如果你要去爬取网站数据内容
-
就要去分析 数据是从哪里来得
通过开发者工具进行分析
(找数据内容) - 发送请求 对于目标网址发送请求
- 获取数据内容 网页源代码 response.text
【付费VIP完整版】只要看了就能学会的教程,80集Python基础入门视频教学
爬虫代码
导入模块
import requests # 数据请求模块 pip install requests import re # 正则表达式模块 import json # 序列化与反序列化 import pprint # 格式化输出模块 import csv import time # 时间模块
发送请求 对于目标网址发送请求
url = f'https://search.51job.com/list/010000%252C020000%252C030200%252C040000%252C180200,000000,0000,00,9,99,python,2,1.html' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36' } # 发送请求 requests调用里面get请求方法 然后把 url 以及 headers 传进去 response = requests.get(url=url, headers=headers) # <Response [200]> 返回响应对象 response 200状态码 表示请求成功
解析数据内容 提取想要数据
# re正则表达式 re正则表达式 可以直接提取字符串数据 # 使用re模块里面findall()方法 html_data = re.findall('window.__SEARCH_RESULT__ = (.*?)</script>', response.text)[0] # 正则匹配出来的数据 是列表 [] json_data = json.loads(html_data)['engine_jds'] print(json_data) for index in json_data: # 等号左边都是自定义变量 # pprint.pprint(index) title = index['job_title'] # 职位名字 company_name = index['company_name'] # 公司名字 money = index['providesalary_text'] # 薪资 job_welf = index['jobwelf'] # 福利 # job_info = index['attribute_text'] #基本信息 area = index['attribute_text'][0] # 城市 exp = index['attribute_text'][1] # 经验 edu = index['attribute_text'][2] # 学历 company_type = index['companyind_text'] # 公司类型 date = index['updatedate'] # 发布日期 href = index['job_href'] # 招聘详情页 # 复制一行 ctrl + D dit = { '职位名字': title, '公司名字': company_name, '薪资': money, '公司福利': job_welf, '地区': area, '经验': exp, '学历': edu, '公司类型': company_type, '发布日期': date, '详情页': href, } print(title, company_name, money, area, exp, edu, job_welf, company_type, date, href) csv_writer.writerow(dit)
保存数据
f = open('数据.csv', mode='a', encoding='utf-8', newline='') csv_writer = csv.DictWriter(f, fieldnames=[ '职位名字', '公司名字', '薪资', '公司福利', '地区', '经验', '学历', '公司类型', '发布日期', '详情页', ]) csv_writer.writeheader() # 写入表头
运行代码
对于本篇文章有疑问的同学可以加【资料白嫖、解答交流群:1039649593】
数据可视化代码
导入模块
import pandas as pd from pyecharts.charts import * from pyecharts import options as opts import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False
导入数据
boss = pd.read_csv('data.csv', engine='python', encoding='utf-8') boss
薪资区间
import numpy as np def shulie(first,end,step): x = [] for i in np.arange(first, end,step): x.append(i) return x list_1 = shulie(0,10,0.5) boss['top'].plot.hist(bins=30,figsize=(20,8),edgecolor="black") plt.xticks(list_1) plt.xlabel('万/月') plt.ylabel('数量') plt.show()
经验、学历要求情况
c = ( Pie(init_opts=opts.InitOpts(width="1000px", height="600px", bg_color="#2c343c")) .add( series_name="经验需求占比", data_pair=data_pair_1, rosetype="radius", radius="55%", center=["25%", "50%"], label_opts=opts.LabelOpts(is_show=False, position="center", color="rgba(255, 255, 255, 0.3)"), ) .add( series_name="学历需求占比", data_pair=data_pair_2, radius="55%", center=["75%", "50%"], label_opts=opts.LabelOpts(is_show=False, position="center", color="rgba(255, 255, 255, 0.3)"), ) .set_series_opts( tooltip_opts=opts.TooltipOpts( trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)" ), label_opts=opts.LabelOpts(color="rgba(255, 255, 255, 0.3)"), ) .set_global_opts( title_opts=opts.TitleOpts( title="经验、学历需求占比", pos_left="center", pos_top="20", title_textstyle_opts=opts.TextStyleOpts(color="#fff"), ), legend_opts=opts.LegendOpts(is_show=False), ) .set_colors(["#D53A35", "#334B5C", "#61A0A8", "#D48265", "#749F83"]) ) c.render_notebook()
哪些地区招聘人员比较多
from pyecharts.globals import SymbolType address_count = boss.groupby('地区').count()['公司名字'].sort_values() x = address_count.index.tolist() y = address_count.values.tolist() c = ( PictorialBar() .add_xaxis(x) .add_yaxis( "", y, label_opts=opts.LabelOpts(is_show=False), symbol_size=18, symbol_repeat="fixed", symbol_offset=[0, 0], is_symbol_clip=True, symbol=SymbolType.ROUND_RECT, ) .reversal_axis() .set_global_opts( title_opts=opts.TitleOpts(title="地区人员招聘数量"), xaxis_opts=opts.AxisOpts(is_show=False), yaxis_opts=opts.AxisOpts( axistick_opts=opts.AxisTickOpts(is_show=False), axisline_opts=opts.AxisLineOpts( linestyle_opts=opts.LineStyleOpts(opacity=0) ), ), ) ) c.render_notebook()
经验要求 和 薪资情况的情况 是不是薪资越高 经验要求越高
mean = boss.groupby('经验')['工资平均'].mean().sort_values() x = mean.index.tolist() y = mean.values.tolist() c = ( Bar() .add_xaxis(x) .add_yaxis( "工作经验", y, markpoint_opts=opts.MarkPointOpts( data=[opts.MarkPointItem(name="无需经验", coord=[x[3], y[3]], value=y[3])] ) ) .set_global_opts(title_opts=opts.TitleOpts(title="不同工作经验的平均薪资")) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) ) c.render_notebook()
mean = boss.groupby('学历')['工资平均'].mean().sort_values() x = mean.index.tolist() y = mean.values.tolist() c = ( Bar() .add_xaxis(x) .add_yaxis( "学历", y, markpoint_opts=opts.MarkPointOpts( data=[opts.MarkPointItem(name="学历不限", coord=[x[1], y[1]], value=y[1])] ) ) .set_global_opts(title_opts=opts.TitleOpts(title="不同学历的平均薪资")) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) ) c.render_notebook()
词云图
公司福利
import jieba words = jieba.lcut(text) #通过遍历words的方式,统计出每个词出现的频次 counts = {} for word in words: if len(word) == 1: continue else: counts[word] = counts.get(word,0) + 1 c = ( WordCloud() .add(series_name="热点分析", data_pair=new, word_size_range=[6, 66]) .set_global_opts( title_opts=opts.TitleOpts( title="公司福利", title_textstyle_opts=opts.TextStyleOpts(font_size=23) ), tooltip_opts=opts.TooltipOpts(is_show=True), ) ) c.render_notebook()
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数