爬虫的基本思路

1、在前程无忧官网检索“大数据”的结果中,每条检索结果详情对应的URL存在a标签的href属性中,通过组合选择器可以找到每条检索结果详情的URL。

2、前程无忧的招聘岗位信息数据固定的放在HTML的各个标签内,通过id选择器、标签选择器和组合选择器可以诸如公司名、岗位名称和薪资等11个字段的数据。

3、基于上述1和2,可以通过解析检索“大数据”得到的URL得到其HTML,再从此HTML中的具体位置的a标签得到每个岗位的详情对应的URL;然后解析每个岗位的详情对应的URL得到其HTML,再从结果HTML的具体位置找到每个岗位的详情。具体位置怎么确定呢?通过组合选择器!

前程无忧爬虫具体代码

SpiderOf51job.py

import requests
from lxml import etree
import csv
import time
import random
'''
更多Python学习资料以及源码教程资料,可以在群1136201545免费获取
'''
fp = open('51job.csv', 'wt', newline='', encoding='GBK', errors='ignore')
writer = csv.writer(fp)
'''title,salary,company,companyinfo,companyplace,place,exp,edu,num,time,info'''
writer.writerow(('职位', '薪资', '公司', '公司信息', '公司地址', '地区', '工作经验', '学历', '人数', '时间', '岗位信息'))def parseInfo(url):headers = {'User-Agent': 'Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/ADR-1301071546) Presto/2.11.355 Version/12.10'}#更换请求头,防止被反爬虫res = requests.get(url, headers=headers)res.encoding = 'utf-8'selector = etree.HTML(res.text)title = selector.xpath('//*[@id="pageContent"]/div[1]/div[1]/p/text()')salary = selector.xpath('//*[@id="pageContent"]/div[1]/p/text()')company = selector.xpath('//*[@id="pageContent"]/div[2]/a[1]/p/text()')companyinfo = selector.xpath('//*[@id="pageContent"]/div[2]/a[1]/div/text()')companyplace = selector.xpath('//*[@id="pageContent"]/div[2]/a[2]/span/text()')place = selector.xpath('//*[@id="pageContent"]/div[1]/div[1]/em/text()')exp = selector.xpath('//*[@id="pageContent"]/div[1]/div[2]/span[2]/text()')edu = selector.xpath('//*[@id="pageContent"]/div[1]/div[2]/span[3]/text()')num = selector.xpath('//*[@id="pageContent"]/div[1]/div[2]/span[1]/text()')time = selector.xpath('//*[@id="pageContent"]/div[1]/div[1]/span/text()')info = selector.xpath('string(//*[@id="pageContent"]/div[3]/div[2]/article)')#类选择器解析URL中对应HTML对应的字段内容info = str(info).strip()print(title, salary, company, companyinfo, companyplace, place, exp, edu, num, time, info)writer.writerow((title, salary, company, companyinfo, companyplace, place, exp, edu, num, time, info))def getUrl(url):print('New page')res = requests.get(url)res.encoding = 'GBK'# print(res.text)if res.status_code == requests.codes.ok:selector = etree.HTML(res.text)urls = selector.xpath('//*[@id="resultList"]/div/p/span/a/@href')#                      //*[@id="resultList"]/div/p/span/a# id选择器找到当前网页每一个职位a标签对应的当前岗位具体信息URL列表print(urls)for url in urls:parseInfo(url)time.sleep(random.randrange(1, 4))#设置线程休眠时间防止被反爬虫if __name__ == '__main__':key = '大数据'# 第一页URL格式和后面的网页不一样url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,' + key + ',2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare='getUrl(url)# 后页[2,100)urls = ['https://search.51job.com/list/000000,000000,0000,00,9,99,' + key + ',2,{}.html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare='.format(i) for i in range(2, 100)]for url in urls:getUrl(url)

爬虫结果

爬虫结果我是以csv的格式存储的,看起来不太直观,所以我打算用wordcloud和直方图来可视化爬虫的结果。

爬虫结果处理

一般来说,应聘者对一个工作的地点、工作名称、薪资和需要的技术最为关心,刚好上述爬虫的结果包含了这四个字段。

1、薪资结果的处理。在爬虫结果中,薪资在第二列,一般是诸如“1-2万/月”、“20万/年”和“500/天”的结果,先判断每个结果的最后一个字符是“年”、“月”和“天”的哪一个,确定处理的逻辑之后,再用re.sub函数将除了数字之外的字符替换为空格,最后对结果求均值就到了了每个结果的均值。

wordcloudPlotSalary.py

import re
import matplotlib.pyplot as plt
import csv
import numpy as npdata = []
with open("51job.csv",encoding='gbk') as csvfile:csv_reader = csv.reader(csvfile)  # 使用csv.reader读取csvfile中的文件data_header = next(csv_reader)  # 读取第一行每一列的标题for row in csv_reader:  # 将csv 文件中的数据保存到data中data.append(row)data = np.array(data)  # 将list数组转化成array数组便于查看数据结构
header = np.array(data_header)
Jobinfo=data[:,10];
Salary=data[:,1];
name=data[:,0];
place=data[:,5];word="".join(Salary);font=r'C:\\Windows\\fonts\\msyh.ttf'#显示中文的关键步骤# 去掉英文,保留中文
resultword=re.sub("[A-Za-z\[\`\~\!\@\#\$\^\&\*\(\)\=\|\{\}\'\:\;\'\,\[\]\<\>\?\~\。\@\#\\\&\*\%]", " ",word)
# 现在去掉了中文和标点符号
wl_space_split = resultword
salary_info=wl_space_split.split();
salary_list=[];for s in salary_info:if(s[-1])=="年":ans=re.sub("[\u4e00-\u9fa5A-Za-z\/\-]", " ",s).split()sum=0;for i in ans:sum+=float(i)avg=sum/len(ans)/12elif (s[-1])=="月":ans = re.sub("[\u4e00-\u9fa5A-Za-z\/\-]", " ", s).split()sum=0;for i in ans:sum+=float(i)avg=sum/len(ans)elif (s[-1])=="天":ans = re.sub("[\u4e00-\u9fa5A-Za-z\/\-]", " ", s).split()sum=0;for i in ans:sum+=float(i)avg=sum/len(ans)*30salary_list.append(avg)salary_array = np.array(salary_list)
salary_array[salary_array>6]=-0.00001 #剔除大于6的异常数据或者不合实际的数据
plt.rcParams['font.sans-serif']=['SimHei']
plt.hist(salary_array, bins =  [0,1,2,3,4,5,6])plt.xlabel("工资区间(单位:万/月)") #设置X轴Y轴名称
plt.ylabel("数量")
plt.title("前程无忧大数据岗位工资(N="+str(len(salary_array))+",mean="+ str(round(salary_array.mean(),2))+ "万/月)")
plt.savefig('salaryHist.jpg')
plt.show();


2、需要的技术的处理。考虑到大数据要使用的技术绝大多数由外国人开发,如实我把大数据要使用的技术这一字段的中文全部替换为空格,然后用jieba提出掉一些无意义的助词,就得到了大数据要使用的技术的词云图。

wordcloudPlotJobinfo.py

import re
import jieba
from wordcloud import WordCloud,ImageColorGenerator,STOPWORDS
import  matplotlib.pyplot as plt
import csv
import numpy as np
'''
更多Python学习资料以及源码教程资料,可以在群1136201545免费获取
'''
data = []
with open("51job.csv",encoding='gbk') as csvfile:csv_reader = csv.reader(csvfile)  # 使用csv.reader读取csvfile中的文件data_header = next(csv_reader)  # 读取第一行每一列的标题for row in csv_reader:  # 将csv 文件中的数据保存到birth_data中data.append(row)data = np.array(data)  # 将list数组转化成array数组便于查看数据结构
header = np.array(data_header)
Jobinfo=data[:,10];
Salary=data[:,1];
name=data[:,0];
place=data[:,5];word="".join(Jobinfo);font=r'C:\\Windows\\fonts\\msyh.ttf'#显示中文的关键步骤# 去掉英文,保留中文
resultword=re.sub("[0-9\u4e00-\u9fa5\[\`\~\!\@\#\$\^\&\*\(\)\=\|\{\}\'\:\;\'\,\[\]\.\<\>\/\?\~\。\@\#\\\&\*\%\-]", "",word)
# 现在去掉了中文和标点符号
wordlist_after_jieba = jieba.cut(resultword)
wl_space_split = " ".join(wordlist_after_jieba)
print(wl_space_split);
# 设置停用词
sw = set(STOPWORDS)
sw.add(",")
sw.add(";")
sw.add("Responsibilities")
sw.add("experience")
sw.add("knowledge")
sw.add("communication")
sw.add("skill")
sw.add("office")
sw.add("support")
# 关键一步
my_wordcloud = WordCloud(font_path=font,scale=4,stopwords=sw,background_color='white',max_words = 100,max_font_size = 60,random_state=20).generate(wl_space_split)#显示生成的词云
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()#保存生成的图片
my_wordcloud.to_file('Jobinfo.jpg')


3、工作地点和职位名称的处理

wordcloudPlotPlace.py

import numpy as np
from PIL import Image
import re
import jieba
from wordcloud import WordCloud,ImageColorGenerator,STOPWORDS
# import wordcloud
import  matplotlib.pyplot as plt
import csv
import numpy as np
'''
更多Python学习资料以及源码教程资料,可以在群1136201545免费获取
'''
data = []
with open("51job.csv",encoding='gbk') as csvfile:csv_reader = csv.reader(csvfile)  # 使用csv.reader读取csvfile中的文件data_header = next(csv_reader)  # 读取第一行每一列的标题for row in csv_reader:  # 将csv 文件中的数据保存到birth_data中data.append(row)data = np.array(data)  # 将list数组转化成array数组便于查看数据结构
header = np.array(data_header)
Jobinfo=data[:,10];
Salary=data[:,1];
name=data[:,0];
place=data[:,5];
# 打开存放项目名称的txt文件
# with open('content.txt','r',encoding='utf-8') as f:
#    word= (f.read())
#    f.close()
str="";
word=str.join(place);# 图片模板和字体
# image=np.array(Image.open('ditu.jpg'))#显示中文的关键步骤
font=r'C:\\Windows\\fonts\\msyh.ttf'# 去掉英文,保留中文
resultword=re.sub("[A-Za-z0-9\[\`\~\!\@\#\$\^\&\*\(\)\=\|\{\}\'\:\;\'\,\[\]\.\<\>\/\?\~\。\@\#\\\&\*\%\-]", "",word)
#resultword=re.sub("[A-Za-z0-9\[\`\~\!\@\#\$\^\&\*\(\)\=\|\{\}\'\:\;\'\,\[\]\.\<\>\/\?\~\。\@\#\\\&\*\%]", "",word)
# 现在去掉了中文和标点符号
wordlist_after_jieba = jieba.cut(resultword)
wl_space_split = " ".join(wordlist_after_jieba)
print(wl_space_split);
# 设置停用词
sw = set(STOPWORDS)
sw.add("研发")
sw.add("系列")
sw.add("区")# 关键一步
my_wordcloud = WordCloud(font_path=font,scale=4,stopwords=sw,background_color='white',max_words = 100,max_font_size = 60,random_state=20).generate(wl_space_split)
#my_wordcloud = WordCloud(background_color='white',
#                         width=800,height=600,margin=2).generate(wl_space_split)
#显示生成的词云
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()#保存生成的图片
my_wordcloud.to_file('place.jpg')


职位名称词云:

wordcloudPlotName.py

import re
from wordcloud import WordCloud,ImageColorGenerator,STOPWORDS
import  matplotlib.pyplot as plt
import csv
import numpy as np
'''
更多Python学习资料以及源码教程资料,可以在群1136201545免费获取
'''
data = []
with open("51job.csv",encoding='gbk') as csvfile:csv_reader = csv.reader(csvfile)  # 使用csv.reader读取csvfile中的文件data_header = next(csv_reader)  # 读取第一行每一列的标题for row in csv_reader:  # 将csv 文件中的数据保存到birth_data中data.append(row)data = np.array(data)  # 将list数组转化成array数组便于查看数据结构
header = np.array(data_header)
Jobinfo=data[:,10];
Salary=data[:,1];
name=data[:,0];
place=data[:,5];word="".join(name);# 图片模板和字体
#image=np.array(Image.open('model.jpg'))#显示中文的关键步骤
font=r'C:\\Windows\\fonts\\msyh.ttf'# 去掉英文,保留中文
resultword=re.sub("[A-Za-z0-9\[\`\~\!\@\#\$\^\&\*\(\)\=\|\{\}\'\:\;\'\,\[\]\.\<\>\/\?\~\。\@\#\\\&\*\%\-]", " ",word)
#resultword=re.sub("[A-Za-z0-9\[\`\~\!\@\#\$\^\&\*\(\)\=\|\{\}\'\:\;\'\,\[\]\.\<\>\/\?\~\。\@\#\\\&\*\%]", "",word)
# 现在去掉了中文和标点符号
#wordlist_after_jieba = jieba.cut(resultword)
wl_space_split = resultword;
print(wl_space_split);
# 设置停用词
sw = set(STOPWORDS)
sw.add("广州")
sw.add("沈阳")
sw.add("武汉")
sw.add("双休")
sw.add("(周末双休)")
sw.add("五险一金")
sw.add("上海")
sw.add("杭州")
sw.add("急招")
sw.add("北京")
sw.add("周末双休")# 关键一步
my_wordcloud = WordCloud(font_path=font,scale=4,stopwords=sw,background_color='white',max_words = 100,max_font_size = 60,random_state=20).generate(wl_space_split)
#显示生成的词云
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()#保存生成的图片
my_wordcloud.to_file('name.jpg')

总结

1、前程无忧上大数据相关岗位出现频率最高的是:大数据开发工程师2、开出的平均工资:18K/月3、大数据就业岗位最多的城市是:上海、广州和深圳、4、大数据工作最吃香的技能是:Hadoop、SQL和Python

用python爬取前程无忧网大数据岗位信息并分析相关推荐

  1. 用python爬取基金网信息数据,保存到表格,并做成四种简单可视化。(爬虫之路,永无止境!)

    用python爬取基金网信息数据,保存到表格,并做成四种简单可视化.(爬虫之路,永无止境!) 上次 2021-07-07写的用python爬取腾讯招聘网岗位信息保存到表格,并做成简单可视化. 有的人留 ...

  2. python爬取东方财富网资金流向数据(在本地生成csv文件)

    今天我们来试着用python爬取东方财富网资金流向的表格数据. 第一步:程序及应用的准备 首先我们需要安装selenium库,使用命令pip install selenium;然后我们需要下载对应的c ...

  3. python爬取前程无忧_用python爬取前程无忧网,看看我们是否真的“前程无忧”?...

    The best time to plant a tree was 10 years ago,the second best time is now. 种一棵树最好的时间是十年前,其次是现在. 利用p ...

  4. 用python爬取前程无忧网,看看我们是否真的“前程无忧”?

    作者:旧时晚风拂晓城 公众号:凹凸数据 The best time to plant a tree was 10 years ago,the second best time is now. 种一棵树 ...

  5. 使用scrapy爬取前程无忧所有大数据岗位并做出数据可视化

    项目目录 项目要求 工具 软件 具体知识点 具体要求 数据源 爬取字段 数据存储 数据分析与可视化 具体步骤 分析网页 实现代码 抓取全部岗位的网址 字段提取 可视化 分析"数据分析&quo ...

  6. 在当当买了python怎么下载源代码-Python爬取当当网APP数据

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于AirPython ,作者星安果 目标 场景:有时候通过传统的方法去 ...

  7. Python爬取当当网APP数据

    目标 场景:有时候通过传统的方法去爬一些 Web 网页或者 APP,受限于对方的反爬方案,很难爬到想要的数据,这个时候可以考虑使用「Appium」结合「mitmproxy」的方式去爬取数据. 其中,A ...

  8. python爬取前程无忧招聘网站数据搭建Hadoop、Flume、Kafka、Spark用Hive做数据分析Sqoop存储到Mysql并实现可视化

    文章目录 一.项目总体要求 二.环境搭建 1.安装包准备 2.安装jdk (1)查询是否安装java (2)卸载jdk (3)安装jdk (4)配置jdk环境变量 3.配置ssh免密登录 (1)进入到 ...

  9. 【Python】手把手教你用Python爬取某网小说数据,并进行可视化分析

    网络文学是以互联网为展示平台和传播媒介,借助相关互联网手段来表现文学作品及含有一部分文字作品的网络技术产品,在当前成为一种新兴的文学现象,并快速兴起,各种网络小说也是层出不穷,今天我们使用seleni ...

最新文章

  1. 内核函数输出怎么看到_谈谈如何学习Linux内核
  2. getOutputStream() has already been called for this response
  3. [C++]怎么样实现一个较快的Hash Table
  4. 消息推送与同步协议的思考
  5. BP神经网络识别手写数字项目解析及matlab实现
  6. 数据驱动科技赋能,东吴证券打造数据中台“九大能力”
  7. JDBC技术总结(一)
  8. python查看帮助文档:help(命令)
  9. sqlite 多条件查询
  10. jQuery-简介与基本使用
  11. Java中进行Debug断点调试
  12. directadmin php-fpm,Directadmin + Nginx + php fpm + location:找不到文件
  13. 收到短信:【淘会员】加微信免费赠礼品!是什么套路?这类短信如何发
  14. 带你玩转以太坊智能合约的”Hello World“
  15. 适合学计算机学生喝的茶,学生喝什么茶能够提高记忆力
  16. 用python和adb将一加便签内容迁移到小米或其他品牌便签软件
  17. uni-app的基础概念
  18. 白银价格转换器(美元/盎司-人民币/克)
  19. 某音xg加密算法研究
  20. 菜鸟后端程序员花了两天半模仿写出了赶集网主页,速来围观!

热门文章

  1. pba mode ( path based analysis for sta )
  2. 创建RF测试库之使用装饰器@keyword
  3. 独享还是共享,你选择哪一种锁?(独享锁/共享锁)
  4. Unity UGUI Toggle监听onValueChanged
  5. [C/C++11]_[初级]_[如何转换带井号的#十六进制颜色字符串到数值]
  6. 虚拟机下解压zip类型压缩包 附各类型文件打包及压缩方式
  7. pwn暑假训练(十) emem这次的测验自己还是太菜
  8. 二维数组的定义和访问
  9. nginx单点故障怎么破?
  10. Pytorch实现基于深度学习的面部表情识别(最新,非常详细)