首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实践:爬取前程无忧数据并做分析

实践:爬取前程无忧数据并做分析

作者头像
AngelNH
发布2020-05-12 17:00:01
2K0
发布2020-05-12 17:00:01
举报
文章被收录于专栏:AngelNIAngelNI

前程无忧数据爬取+数据部分分析

配置

#导包
import urllib.request
from lxml import etree
import xlwt
import re
from os import path
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from wordcloud import WordCloud,STOPWORDS
import matplotlib
import copy
%matplotlib inline

数据爬取

#获取当前页面的代码信息
def get_content(page):
    url = 'https://search.51job.com/list/000000,000000,0000,00,0,99,%25E5%25A4%25A7%25E6%2595%25B0%25E6%258D%25AE,2,'+str(page)+'.html'
    a = urllib.request.urlopen(url,timeout= 3)
    html = a.read().decode('gbk')#编码是gbk,utf-8会出现乱码
    return html
#爬取每个职位的岗位信息
def get_content_(url):
    a = urllib.request.urlopen(url,timeout= 3)
    html = a.read().decode('gbk')
    return html
#正则匹配所需要的信息
def get(html):
    reg = re.compile(r'class="t1 ">.*? <a target="_blank" title="(.*?)" href="(.*?)".*? <span class="t2"><a target="_blank" title="(.*?)".*?<span class="t3">(.*?)</span>.*?<span class="t4">(.*?)</span>.*? <span class="t5">(.*?)</span>',re.S)
    result = re.findall(reg,html)
    return result 
#单元格行计数
number = 1
#定义workbook
excel1 = xlwt.Workbook()
# 设置单元格
sheet1 = excel1.add_sheet('Job', cell_overwrite_ok=True)
sheet1.write(0, 0, '序号')
sheet1.write(0, 1, '职位')
sheet1.write(0, 2, '公司地点')
sheet1.write(0, 3, '薪资')
sheet1.write(0, 4,'任职要求')
#一共423页
for page in range(1,424):
    #异常处理
    try:
        print(f'正在下载第 {page}页')
        print('\n')
        #获取页面代码
        html = get_content(page)
        #职位计数
        count = 0
        #get(html)返回一个2D列表
        for item in get(html):
            #异常处理
            try:
                count+=1
                print(f"正在下载第{page}页,第{count}项工作\n\n")
                #item[1]是工作的链接,目的是为了获取岗位信息
                job_url = get_content_(item[1])
                #通过调用etree对象中的xpath方法,结合着xpath表达式进行标签定位和数据提取
                #感觉非常好用
                job_result = etree.HTML(job_url)
                #从网站上复制的Xpath
                require = job_result.xpath('/html/body/div[3]/div[2]/div[3]/div[1]/div/p/text()')

                '''
                with open('51job.txt','a',encoding= 'utf-8') as f:
                    f.write(item[0]+'\n')
                    f.close()
                '''
                #写入excel
                sheet1.write(number,0,number)
                sheet1.write(number,1,item[0])
                sheet1.write(number,2,item[3])
                sheet1.write(number,3,item[4])
                sheet1.write(number,4,require)
                #单元格行加一
                number+=1

            except:
                pass
    except:
        pass
#保存
excel1.save("data\\51job.xls")

读取数据

file ='data/51job.xls' 
data= pd.read_excel(file,sheet_name='Job')
#获取职位名
job = data['职位']
for name in job:
    job1.append(name)
    #print(name)

写入数据

#写入数据
with open('data/JOB.txt','a',encoding= 'gbk') as f:
    for name in job1:
        f.write(name+'\n')
    f.close()

词云分析

# 读取文本
text = open('data/JOB.txt','r').read()
#print(text)


#设置字体
font = r'C:\Windows\Fonts\simfang.ttf'
#保留汉字
result=re.sub("[A-Za-z0-9\[\`\~\!\@\#\$\^\&\*\(\)\=\|\{\}\'\:\;\'\,\[\]\.\<\>\/\?\~\。\@\#\\\&\*\%\-]", " ",text)
#设置停用词
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("急聘");sw.add("急招")
sw.add("资深");sw.add("包吃住");sw.add("周末双休");sw.add("代招")
sw.add("高薪");sw.add("高底薪");sw.add("校招");sw.add("月均");sw.add("大平台");
sw.add("可实习");sw.add("年薪");sw.add("北京");sw.add("经理");sw.add("房地产销售");
sw.add("包住");sw.add("应届生");sw.add("南京");sw.add("专员");sw.add("房产经纪人");
sw.add("提成");sw.add("方向");sw.add("销售代表");sw.add("保底");sw.add("提供住宿");
sw.add("就近安排");sw.add("房产经纪人");sw.add("房产销售");sw.add("晋升快");
sw.add("实习生");sw.add("销售专员");sw.add("接受实习生");sw.add("培训多");
sw.add("销售经理");sw.add("销售");sw.add("置业顾问");sw.add("就近上班");
sw.add("新开始新起点");sw.add("招募区域老板");sw.add("中介");sw.add("使用期底薪");
sw.add("透明晋升");sw.add("电话销售");sw.add("房产销售代表");sw.add("带薪培训");
sw.add("储备干部培训生");sw.add("超快晋升");sw.add("扩店急招业务员");sw.add("就近");
sw.add("链家");sw.add("就近分配");sw.add("就业季");sw.add("房地产销售顾问");
sw.add("包住宿");sw.add("销售代表底薪");sw.add("医学客户代表");sw.add("经纪人");
sw.add("学术代表");sw.add("绩效");sw.add("名校同事");sw.add("链家房产精英");sw.add("毕业季");sw.add("高级");

#创建词云
wordcloud = WordCloud(background_color="white",font_path=font,stopwords=sw,width=500,height=400,max_words = 100,max_font_size = 90,margin = 2,random_state=20).generate(result)

# 显示图片
# matplotlib way:
plt.imshow(wordcloud)

plt.axis("off")
plt.show()
wordcloud.to_file('title.jpg')

工作地点分析

position = data['公司地点']
area_data = {
        '北京': ['北京','朝阳区', '海淀区', '通州区', '房山区', '丰台区', '昌平区', '大兴区', '顺义区', '西城区', '延庆县', '石景山区', '宣武区', '怀柔区', '崇文区', '密云县',
               '东城区', '门头沟区', '平谷区'],
        '广东':['广东省', '东莞', '广州', '中山', '深圳', '惠州', '江门', '珠海', '汕头', '佛山', '湛江', '河源', '肇庆','潮州', '清远市', '韶关市', '揭阳市', '阳江市', '云浮市', '茂名市', '梅州市', '汕尾市'],
        '山东':['山东省', '济南', '青岛', '临沂', '济宁', '菏泽', '烟台','泰安', '淄博市', '潍坊市', '日照市', '威海市', '滨州市', '东营市', '聊城市', '德州市', '莱芜市', '枣庄市'],
        '江苏':['江苏省', '苏州市', '徐州市', '盐城市', '无锡市','南京市', '南通市', '连云港市', '常州市', '扬州市', '镇江市', '淮安市', '泰州市', '宿迁市'],
        '河南':['河南省', '郑州', '南阳', '新乡', '安阳', '洛阳', '信阳','平顶山', '周口', '商丘', '开封', '焦作', '驻马店', '濮阳', '三门峡', '漯河', '许昌', '鹤壁', '济源'],
        '上海':['上海市', '松江区', '宝山区', '金山区','嘉定区', '南汇区', '青浦区', '浦东新区', '奉贤区', '闵行区', '徐汇区', '静安区', '黄浦区', '普陀区', '杨浦区', '虹口区', '闸北区', '长宁区', '崇明县', '卢湾区'],
        '河北':[ '河北省', '石家庄市', '唐山市', '保定市', '邯郸市', '邢台市', '河北区', '沧州市', '秦皇岛市', '张家口市', '衡水市', '廊坊市', '承德市'],
        '浙江':['浙江省', '温州市', '宁波市','杭州市', '台州市', '嘉兴市', '金华市', '湖州市', '绍兴市', '舟山市', '丽水市', '衢州市'],
        '陕西':['陕西省', '西安市', '咸阳市', '宝鸡市', '汉中市', '渭南市','安康市', '榆林市', '商洛市', '延安市', '铜川市'],
        '湖南':[ '湖南省', '长沙市', '邵阳市', '常德市', '衡阳市', '株洲市', '湘潭市', '永州市', '岳阳市', '怀化市', '郴州市','娄底市', '益阳市', '张家界市', '湘西州'],
        '重庆':[  '重庆市', '江北区', '渝北区', '沙坪坝区', '九龙坡区', '万州区', '永川市', '南岸区', '酉阳县', '北碚区', '涪陵区', '秀山县', '巴南区', '渝中区', '石柱县', '忠县', '合川市', '大渡口区', '开县', '长寿区', '荣昌县', '云阳县', '梁平县', '潼南县', '江津市', '彭水县', '璧山县', '綦江县',
     '大足县', '黔江区', '巫溪县', '巫山县', '垫江县', '丰都县', '武隆县', '万盛区', '铜梁县', '南川市', '奉节县', '双桥区', '城口县'],
        '福建':['福建省', '漳州市', '泉州市','厦门市', '福州市', '莆田市', '宁德市', '三明市', '南平市', '龙岩市'],
        '天津':['天津市', '和平区', '北辰区', '河北区', '河西区', '西青区', '津南区', '东丽区', '武清区','宝坻区', '红桥区', '大港区', '汉沽区', '静海县', '宁河县', '塘沽区', '蓟县', '南开区', '河东区'],
        '云南':[ '云南省', '昆明市', '红河州', '大理州', '文山州', '德宏州', '曲靖市', '昭通市', '楚雄州', '保山市', '玉溪市', '丽江地区', '临沧地区', '思茅地区', '西双版纳州', '怒江州', '迪庆州'],
        '四川':['四川省', '成都', '绵阳市', '广元市','达州市', '南充市', '德阳市', '广安市', '阿坝州', '巴中市', '遂宁市', '内江市', '凉山州', '攀枝花市', '乐山市', '自贡市', '泸州市', '雅安市', '宜宾市', '资阳市','眉山市', '甘孜州'],
        '广西':['广西壮族自治区', '贵港市', '玉林市', '北海市', '南宁市', '柳州市', '桂林市', '梧州市', '钦州市', '来宾市', '河池市', '百色市', '贺州市', '崇左市',  '防城港市'],
        '安徽':['安徽省', '芜湖市', '合肥市', '六安市', '宿州市', '阜阳市','安庆市', '马鞍山市', '蚌埠市', '淮北市', '淮南市', '宣城市', '黄山市', '铜陵市', '亳州市','池州市', '巢湖市', '滁州市'],
        '海南':['海南省', '三亚市', '海口市', '琼海市', '文昌市', '东方市', '昌江县', '陵水县', '乐东县', '五指山市', '保亭县', '澄迈县', '万宁市','儋州市', '临高县', '白沙县', '定安县', '琼中县', '屯昌县'],
        '江西':['江西省', '南昌市', '赣州市', '上饶市', '吉安市', '九江市', '新余市', '抚州市', '宜春市', '景德镇市', '萍乡市', '鹰潭市'],
        '湖北':['湖北省', '武汉市', '宜昌市', '襄樊市', '荆州市', '恩施州', '孝感市', '黄冈市', '十堰市', '咸宁市', '黄石市', '仙桃市', '随州市', '天门市', '荆门市', '潜江市', '鄂州市', '神农架林区'],
        '山西':['山西省', '太原市', '大同市', '运城市', '长治市', '晋城市', '忻州市', '临汾市', '吕梁市', '晋中市', '阳泉市', '朔州市'],
        '辽宁':['辽宁省', '大连市', '沈阳市', '丹东市', '辽阳市', '葫芦岛市', '锦州市', '朝阳市', '营口市', '鞍山市', '抚顺市', '阜新市', '本溪市', '盘锦市', '铁岭市'],
        '中国台湾':['中国台湾省','台北市', '高雄市', '台中市', '新竹市', '基隆市', '台南市', '嘉义市'],
        '黑龙江':['黑龙江', '齐齐哈尔市', '哈尔滨市', '大庆市', '佳木斯市', '双鸭山市', '牡丹江市', '鸡西市','黑河市', '绥化市', '鹤岗市', '伊春市', '大兴安岭地区', '七台河市'],
        '内蒙古':['内蒙古自治区', '赤峰市', '包头市', '通辽市', '呼和浩特市', '乌海市', '鄂尔多斯市', '呼伦贝尔市','兴安盟', '巴彦淖尔盟', '乌兰察布盟', '锡林郭勒盟', '阿拉善盟'],
        '中国香港':["中国香港","中国香港特别行政区"],
        '中国澳门':['中古澳门','中国澳门特别行政区'],
        '贵州':['贵州省', '贵阳', '黔东南州', '黔南州', '遵义市', '黔西南州', '毕节地区', '铜仁地区','安顺市', '六盘水市'],
        '甘肃':['甘肃省', '兰州市', '天水市', '庆阳市', '武威市', '酒泉市', '张掖市', '陇南地区', '白银市', '定西地区', '平凉市', '嘉峪关市', '临夏回族自治州','金昌市', '甘南州'],
        '青海':['青海省', '西宁市', '海西州', '海东地区', '海北州', '果洛州', '玉树州', '黄南藏族自治州'],
        '新疆':['新疆','新疆维吾尔自治区', '乌鲁木齐市', '伊犁州', '昌吉州','石河子市', '哈密地区', '阿克苏地区', '巴音郭楞州', '喀什地区', '塔城地区', '克拉玛依市', '和田地区', '阿勒泰州', '吐鲁番地区', '阿拉尔市', '博尔塔拉州', '五家渠市',
     '克孜勒苏州', '图木舒克市'],
        '西藏':['西藏区', '拉萨市', '山南地区', '林芝地区', '日喀则地区', '阿里地区', '昌都地区', '那曲地区'],
        '吉林':['吉林省', '吉林市', '长春市', '白山市', '白城市','延边州', '松原市', '辽源市', '通化市', '四平市'],
        '宁夏':['宁夏回族自治区', '银川市', '吴忠市', '中卫市', '石嘴山市', '固原市']
    }
#一个小技巧
from collections import defaultdict

new = []
for loc in position:
    if '-'in loc: 
        new_loc = re.findall(re.compile('(\w*)-'),loc)[0]
    else:  
        new_loc = loc
    new.append(new_loc)
#创建一个字典
position_count=defaultdict(int)
#将城市改为省
for k,v in area_data.items():
    for i in v:
        for item in new:
            if item in i:
                position_count[k]+=1
#记录省
#和工作数量
pos = []
count = []
for item in position_count.items():
    pos.append(item[0])
    count.append(item[1])
from pyecharts import Map 
import numpy as np
value = np.array(count)
attr = pos
print(len(value))
print(len(attr))

map = Map("截至 2020-5-9 前程无忧数据统计", width=1000, height=800)
map.add("",attr,value,is_map_symbol_show=True,maptype="china", is_visualmap=True, visual_text_color='#404a59', ##ffffff#000#404a59
    is_label_show=True, visual_range=[np.min(value),np.max(value)])
map.render(r'e:\\2020-5-9.html')

对有关大数据人才需求越大,颜色越鲜艳

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-09|,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前程无忧数据爬取+数据部分分析
    • 配置
      • 数据爬取
        • 读取数据
          • 写入数据
            • 词云分析
              • 工作地点分析
              相关产品与服务
              大数据
              全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档