需求:
获取某职位在一线城市的职位信息数据,并分析其关键词出现次数,通过词云体现出来.
获取所有一线城市的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
cities = ['北京', '上海', '广州', '深圳', '成都', '杭州', '重庆', '武汉', '苏州', '天津', '南京', '西安', '郑州', '长沙',
'沈阳', '青岛', '宁波', '东莞', '无锡']
ids = []
def cities_ids():
for city in cities:
# 第一次正则获取各个城市的网页
mession = re.findall(r'%s' % 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'.*?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'(.*?)', 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' ', '', 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安全队列,生产者消费者模式,生产者负责获取信息,消费者负责保存信息.