爬取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
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是爬取51job职位信息并绘图的步骤: 1. 确定要爬取职位和地区,以及需要的数据字段。可以使用Python中的requests、beautifulsoup4等库进行页解析和爬取。 2. 通过分析页结构,确定要爬取的数据在哪个标签中,例如可以使用BeautifulSoup库中的find_all方法找到所有职位信息所在的标签。 3. 将爬取到的数据存储到本地文件或数据库中,可以使用Python中的csv、pandas等库进行数据处理和存储。 4. 对爬取到的数据进行分析和绘图,可以使用Python中的matplotlib、seaborn等库进行数据可视化。 以下是一个简单的示例代码,用于爬取51job站上的Python职位信息并绘制饼图: ```python import requests from bs4 import BeautifulSoup import pandas as pd import matplotlib.pyplot as plt # 设置请求头,模拟浏览器访问 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} # 构造请求url url = 'https://search.51job.com/list/010000,000000,0000,00,9,99,Python,2,{}.html' # 循环爬取所有页面的职位信息 data = [] for i in range(1, 6): res = requests.get(url.format(i), headers=headers) soup = BeautifulSoup(res.text, 'html.parser') job_list = soup.find_all('div', class_='el') for job in job_list: job_name = job.find('a', target='_blank').text.strip() company_name = job.find('span', class_='t2').text.strip() salary = job.find('span', class_='t4').text.strip() if salary == '面议': continue data.append({'job_name': job_name, 'company_name': company_name, 'salary': salary}) # 将爬取到的数据存储到本地文件中 df = pd.DataFrame(data) df.to_csv('jobs.csv', index=False) # 对爬取到的数据进行分析和绘图 df = pd.read_csv('jobs.csv') df['salary'] = df['salary'].apply(lambda x: int(x.split('-')[0])) df['salary_range'] = pd.cut(df['salary'], [0, 5000, 10000, 15000, 20000, 30000, 50000, 100000]) salary_count = df['salary_range'].value_counts() plt.pie(salary_count, labels=salary_count.index, autopct='%1.1f%%') plt.title('Python职位薪资分布') plt.show() ``` 这段代码会爬取前5页的Python职位信息,并将职位名称、公司名称和薪资存储到本地文件中。然后,对薪资进行分段处理,统计每个薪资段的职位数量,并绘制饼图展示。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值