爬取51job职位信息并且进行数据分析(制作词云)

需求:
获取某职位在一线城市的职位信息数据,并分析其关键词出现次数,通过词云体现出来.
获取所有一线城市的python职位描述到单个text文件内、文件夹内.
使用jjieba和wordcloud分析其中出现词频最高的内容
Python获取数据信息时其速度很慢,可采用多进程、多线程的方式操作。

稍做分析

①:从https://search.51job.com/list/010000,000000,0000,00,9,99,Python,2,1.html这个网址可以发现,010000代表的就是北京的id,所以我们如果想要获取到所有一线城市的python职位信息,那么就必须获取到该城市的id.
②:我们需要将所有的职位信息爬取下来,所以就需要挨个进入页面,这时候我们就要考虑几个问题A:如何获取到这个页面的url;B:那么多页,而且每个城市的页数不一致,如何去控制?;C:进入页面如何获取职位信息

获取城市id

我们可以将你想要获取id的城市放入一个列表,通过正则获取所对应的id信息,并将id放入列表中

# 获取城市的id
    cities = ['北京', '上海', '广州', '深圳', '成都', '杭州', '重庆', '武汉', '苏州', '天津', '南京', '西安', '郑州', '长沙',
              '沈阳', '青岛', '宁波', '东莞', '无锡']
    ids = []

def cities_ids():
    for city in cities:
        # 第一次正则获取各个城市的网页
        mession = re.findall(r'<span><a href="(.*)">%s</a></span>' % city, text_main)
        url_city = 'https:' + mession[0]
        text_city = requests.get(url_city, headers).content.decode('gbk')
        # 第二次正则来获取各个城市的id
        id = re.findall(r'id="citycode" value="(.*?)"', text_city)
        ids.append(id[0])

获取对应的页数,根据页数获取信息

通过上一步以及获取到了id信息,所以这些城市对应的python职位的url就能够写出来,然后通过正则获取页数即可!

    for id in ids:
        pageone = 'https://search.51job.com/list/%s,000000,0000,00,9,99,Python,2,1.html' % (id)
        text_page = requests.get(pageone, headers).content.decode('gbk')
        # 查看有多少页
        pages = re.findall(r'共(.*?)页', text_page)
        pages_position = int(pages[0])

        # 获取每一页的数据
        for page in range(1, pages_position + 1):
            url_page = 'https://search.51job.com/list/%s,000000,0000,00,9,99,Python,2,%d.html' % (id, page)

获取职位信息

通过前两步以及能够成功访问到每一页的招聘信息,然后我们需要单个进入这些招聘网页,来获取职位信息

        # 招聘信息网页
        url_zps_ = re.findall(r'<div class="el">.*?href="(.*?)"', text_page, re.DOTALL)
       	for i in range(len(url_zps_)):
            text_zp = s.get(url_zps_[i]).content.decode('gbk', 'ignore')
            # 获岗位要求
            mession_zps = re.findall(r'<div class="bmsg job_msg inbox">(.*?)</div>', text_zp, re.DOTALL)
            if len(mession_zps) == 0:
                continue
            # 去除杂物
            for mession_zp in mession_zps:
                mession_zp = re.sub(r'<.*?>', '', mession_zp)
                mession_zp = re.sub(r' ', '', mession_zp)
                mession_zp = re.sub(r'\r\n', '', mession_zp)
                mession_zp = re.sub(r'&nbsp;', '', mession_zp)
                print(mession_zp)

                self.data_queue.put((mession_zp))

保存数据到txt

我们以及获取到了所有的数据,现在要做的就是将爬取下来的职位信息放入到txt文件,方便我们制作词云,保存数据也很简单.

 with open('Python.txt','a', encoding='utf-8')as fp:
 	fp.write(self.data_queue.get())

制作词云

用了一个很简单的方法来制作词云,就不多做解释了,不懂的查一查

def CiYun():
    # 导入
    text = open(r'.\Python.txt', 'r', encoding='utf-8').read()
    # 去除无用的词语
    exclude = {'岗位职责', '熟悉', '任职', '要求', '职能', '类别', '使用', '熟练', '关键字', '工程师',
               '开发', '能力', '负责', '测试', '项目', '沟通', '良好', '学习', '以上学历', '以及', '以上'}

    # 进行分词
    cut_text = jieba.cut(text)
    result = ' '.join(cut_text)
    # 生成词云图
    wc = WordCloud(
        # 字体路径
        font_path=r'.\Deng.ttf',
        # 背景颜色
        background_color='white',
        width=500,
        height=350,
        max_font_size=50,
        stopwords=exclude
    )
    wc.generate(result)
    # 显示图片
    plt.figure('Python')
    plt.imshow(wc)
    plt.axis('off')
    plt.show()

多线程思想

我写的时候用了多线程,数据量过于庞大,不使用多线程的话那将是一个漫长的过程.
创建一个queue安全队列,生产者消费者模式,生产者负责获取信息,消费者负责保存信息.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值