matplotlib/pandas/BeautifulSoup/wordcloud等在前程无忧网站爬取、分析上的应用(代码)

news/2024/5/20 13:54:32/文章来源:https://blog.csdn.net/xj246304/article/details/80710948

文章详细分析内容发布于个人公众号。谢谢大家关注:

ID: DataDreamInitiate

公众号名称数据分析X小硕

此处仅放爬虫及分析代码。有问题可公众号或博客回复讨论,谢谢!

以下为搜索页面信息抓取、信息初步清理、岗位详细信息抓取的爬虫代码:

# - * - coding:utf-8 - * -
from bs4 import BeautifulSoup
import requests
import pandas as pd
url = r'https://search.51job.com/list/000000,000000,0000,00,9,99,' \r'%25E6%2595%25B0%25E6%258D%25AE%25E5%2588%2586%25E6%259E%2590,2,{}.html?' \r'lang=c&stype=1' \r'&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&lonlat=0%2' \r'C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare='final = []
def get_brief_contents():
#for i in range(0,2001):url_real = url.format(i)try:res = requests.get(url_real)res.encoding = 'gbk'soup = BeautifulSoup(res.text,'html.parser')total_content = soup.select('.dw_table')[0]companys = total_content.select('.el')
#           y = total_content.select('.t1 ')
#           print(y)for company in companys:total = {}position_all = company.select('.t1 ')[0]position_a = position_all.select('a')if len(position_a)>0:total['name'] = company.select('.t2')[0].text.strip()total['position'] = position_a[0]['title']total['location'] = company.select('.t3')[0].text.strip()total['salary'] = company.select('.t4')[0].text.strip()total['update_date'] = company.select('.t5')[0].text.strip()total['pos_url'] = position_a[0]['href'].strip()print("Dealing with page " + str(i) + '  Please waiting------')print('Company\'s name is  ' + total['name'] )final.append(total)except:print('Failed with page ' + str(i) + '  ------')df_raw = pd.DataFrame(final)df_raw.to_csv('0527_51job_raw.csv',mode = 'a',encoding = 'gbk')print('saved raw_data')return final#cleandata = []
def clean_data(final):#final = pd.read_csv('0521_51job_raw.csv',encoding = 'gbk', header = 0)#print('Now start Clean Raw data------')df = pd.DataFrame(final)df = df.dropna(how = 'any')df.set_index('pos_url')print('Now chose data with keywords------')df = df[df.position.str.contains(r'.*?数据.*?|.*?分析.*?')]df = df[df.salary.str.contains(r'.*?千/月.*?|.*?万/月.*?|.*?万/年.*?')]print('Now split data with dash------')Split = pd.DataFrame((x.split('-') for x in df['salary']), index = df.index, columns = ['low_s', 'high_s'])df = pd.merge(df, Split, right_index = True, left_index = True)print('Now unify the unit------')row_with_T = df['salary'].str.contains('千/月').fillna(False)for i, rows in df[row_with_T].iterrows():df.at[i, 'low_s'] = float(rows['low_s'])df.at[i, 'high_s'] = float(rows['high_s'][:-3])row_with_TT = df['salary'].str.contains('万/月').fillna(False)for i, rows in df[row_with_TT].iterrows():df.at[i, 'low_s'] = float(rows['low_s']) * 10df.at[i, 'high_s'] = float(rows['high_s'][:-3]) * 10print(df)df.to_csv('0527clean.csv',mode = 'a',encoding = 'gbk')print('saved clean data')#cleandata.extend(df)return 1detail_info = []
def get_detail_content():raw = pd.read_csv('0527clean.csv', encoding = 'gbk', header = 0)df = pd.DataFrame(raw)print(df)print(len(df))print('Getting details from specific urls------')df.reset_index()df.set_index('pos_url')urls = df['pos_url']failed_count = 0for url in urls:print('Connecting \n' + url + ' ------')info = {}info['url'] = urlres = requests.get(url)res.encoding = 'gbk'soup = BeautifulSoup(res.text, 'html.parser')try:"""公司类型规模人数"""basic_info = soup.select('.cn')[0].select('p')[1].text.strip()basic_info = [x.strip() for x in basic_info.split('|')]if len(basic_info) == 4:info['company_type'] = basic_info[0]info['company_imp_n'] = basic_info[1]info['company_field'] = basic_info[2]else:info['company_type'] = basic_info[0]info['company_imp_n'] = ''info['company_field'] = basic_info[1]"""工作经验学历人数"""try:tag = soup.select('.sp4')[3].textinfo['basic_req_exp'] = soup.select('.sp4')[0].textinfo['basic_req_gra'] = soup.select('.sp4')[1].textinfo['basic_req_num'] = soup.select('.sp4')[2].textexcept:info['basic_req_exp'] = soup.select('.sp4')[0].textinfo['basic_req_gra'] = ''info['basic_req_num'] = soup.select('.sp4')[1].text# basic_req_exp = basic_req[1].text"""福利"""try:info['benefit'] = soup.select('.t2')[0].text.strip()except:info['benefit'] = ''"""岗位描述与职责"""disc = soup.select('.tBorderTop_box')[1].select('p')[:-1]info['disc'] = [x.text for x in disc]"""职位类别"""label = soup.select('.mt10')[0].text.replace('职能类别:', '').strip()info['label'] = ''.join(label)print('Finishing \n' + url + ' ------')print('The label is \n' + info['label'])detail_info.append(info)except:print('Failed with \n' + url + ' ------')failed_count += 1print('failed_count ==  ' + str(failed_count))df1 = pd.DataFrame(detail_info)#df.dropna(how = 'any')df1.to_csv('20180527_detail_info.csv', mode = 'a')print('saved detail_info')print(len(detail_info))return 1def save_my_file():df_detail = pd.DataFrame(pd.read_csv('20180527_detail_info.csv', header = 0))print(df_detail)df_clean = pd.DataFrame(pd.read_csv('20180527clean.csv', header = 0))print(df_clean )df_detail.set_index('url')df_clean.set_index('pos_url')df_all = pd.merge(df_clean, df_detail, right_index = True, left_index = True)df_all.to_csv('20180527_51job-data_analysis.csv', mode = 'a',encoding = 'gbk')print('crawling over')get_brief_contents()
clean_data(final)
get_detail_content()
save_my_file()

以下为其中一个词云制作的代码:

"""
词云中的generate_from_frequencies方法
不需要分词
需要词频
需要dict方法封装成字典作为frequency
"""
import re
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import pandas as pd
from pandas import DataFrame
font_path=r'C:\WINDOWS\Fonts\msyhl.ttc'
file = pd.DataFrame(pd.read_excel(r'D:\PycharmProjects\新建文件夹\汇合-0602.xlsx',sheet_name='Sheet1'))
benefit = file['disc'].dropna(how='any')
all_text = ''.join(text for text in benefit)
s = re.findall('[a-zA-Z]+',all_text)
s = [i.lower() for i in s]
s1 = set(s)
en_word = []
stopwords  = ['A','B','D','T','C','K','Www']
for words in s1:final_en_word = {}final_en_word['key'] = words.title()final_en_word['num'] = s.count(words)en_word.append(final_en_word)
print(en_word)
df = DataFrame(en_word)
print(df)
df.to_excel('en_word.xlsx')
sowe = list(df.key)
value = df.num
dic = dict(zip(sowe,value))
print(dic)
wc = WordCloud(font_path = font_path,background_color = 'White',stopwords = stopwords,max_words = 50,height=2000,scale = 1,width=3000).generate_from_frequencies(dic)
plt.imshow(wc)
plt.axis('off')
wc.to_file(r'D:\公众号\soft_prom_req.jpg')
plt.show()

以下为工作经验饼图制作代码:

import pandas as pd
path = r'D:\PycharmProjects\新建文件夹\汇合-0602.xlsx'
scope = pd.DataFrame(pd.read_excel(path,sheetname = 'Sheet2'))
scope['ave_salary'] = (df['low_s'] + df['high_s'])/2
requirement = list(scope['basic_req_exp']) 
unique_r = pd.DataFrame(list(set(requirement))) 
unique_r.columns = ['exp'] 
unique_r['exp_num'] = unique_r['exp'].apply(lambda x: requirement.count(x)) 
unique_r['exp_perc'] = unique_r['exp_num'].apply(lambda y: y/unique_r['exp_num'].sum()) 
unique_r['year'] = unique_r['exp'].apply(lambda v: v[:v.find('年')+1] if '年' in v else '无经验')
print(unique_r)
print(unique_r['exp_num'].sum())
plt.figure(1, figsize=(10,10))  
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.size'] = 20
explode = [0.1,0.1,0.2,0.1,0.1,0.1,0.2] 
plt.pie(x = unique_r['exp_perc'],explode = explode, labels = unique_r['year'],autopct = '%1.1f%%',labeldistance=1.05, shadow = True, startangle= 90) 
plt.axis ('equal') 
#plt.title('')
#plt.legend(labels = unique_r['year'], loc = 'right',borderaxespad =-2,frameon = False)
plt.savefig('工作经验饼图.jpg')
plt.show()

以下为柱状图代码:

import matplotlib.pyplot as plt
import pandas as pd
path = r'D:\PycharmProjects\charts\en_word.xlsx'
df = pd.DataFrame(pd.read_excel(path))
df.columns = ['softw','num']
pf = df.head(20)
pf.drop([3268,12,2989],inplace = True)
print(pf)
pf.softw = pf.softw.apply(lambda v: v.upper())
fig, ax = plt.subplots(figsize = (15,8))
ax.bar(range(len(pf.softw)),pf.num,tick_label=pf.softw )
ax.set_ylabel('Frequencies',fontsize = 18)
ax.set_xlabel('Top 17 Tools Required', fontsize = 18)
plt.savefig('Top 17 Tools Required.jpg')
plt.show()

欢迎大家关注本人微信公众号,公众号将持续更新python,tableau,SQL等数据分析的文章。


ID: DataDreamInitiate

      公众号名称数据分析X小硕


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_893950.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不能通过IP地址访问网站的解决方案

在服务器的IIS中添加网站,端口设为8081.然后通过IIS能够直接浏览网站。 但是在我电脑上访问网站:http://xxxx.xxxx.xxxx.xxx/index.aspx 以IP的形式始终访问不了网站。 原因:windows防火墙一般只开放了80端口。通过其他端口访问服务器是被拒绝的。 解…

IIS配置网站出现404

HTTP 404或Not Found错误信息是HTTP的其中一种“标准回应信息”(HTTP状态码),此信息代表客户端在浏览网页时,服务器无法正常提供信息,或是服务器无法回应且不知原因。 一般这种错误首先想到的就是请求的文件不存在。但…

GitHub Action自动完成华工疫情打卡、网站自动签到

AutoAction简介 该github工程主要是为了解决疫情期间华工需要不断地申报自身健康而建立,工程中使用GitHub Action来实现每天自动打卡工作。准备工作 1.一个github账号 2.一个163邮箱账号:用于发送签到成功邮件,推荐添加,为了方便验证是否签…

Latex 相关网站

公式王 在线进行公式图片识别,转换为 Latex 语法。 网址为 https://gongshi.wang/

B2C电商平台如何做SEO优化以提高流量?

B2C电子商城建设随着电商行业的发展而快速被搭建,B2C商城系统网站对于流量的需求也是很大的,有了流量才能去进行转化,从而获得更多的客户,获取更多的市场份额。想要提高流量就要从自然搜索的优化技巧入手,只有掌握了优…

教你免费且快速地搭建个人网站

今日科技快讯 针对近日坊间流传的“我们天天在看你的微信”一说,微信团队今天发表声明重申三条用户隐私原则:1、微信不留存任何用户的聊天记录,聊天内容只存储在用户的手机、电脑等终端设备上;2、微信不会将用户的任何聊天内容用于…

直接从网站下载视频的方法

直接从网站下载视频的方法 很多时候浏览器插件搞不定的事情就要自己动动手嘛。 1. 没加密的网页 开发者工具里找太费眼睛了 最快捷的方法就是用 you-get 直接下载 这里需要先安装python,站里就有许多帖子,我就不赘述了 有了python之后,我们…

在基于Form验证的SharePoint网站中实现用户口令过期策略

最近,公司有一个项目,是基于SharePoint的一个网站,采用Form验证,验证提供程序采用SqlMenbershipProvider。完成后交给用户测试,用户又提出新要求:要实现口令30天过期功能,超过30天的用户登录后自…

如何做网站迁移?网站搬家

网站迁移:指的是从本地迁移至生产服务器,或者是换台服务器。 迁移方法: 网站整体打包,复制到新到服务器。数据库通过phpmyadmin或者mysql命令行热备份。或者是关闭mysql服务器。直接拷贝数据库文件。将数据库恢复至新服务器修改新…

爬虫实例4(抓取12306网站余票信息)

简介 本实验主要是抓取2020-5-5成都东到西安北所有车次的信息,12306网站设置了反爬机制,要构造Headers才能获取数据,本文对获取的数据先进行了split()分割,将每趟列车的信息分割出来,然后通过与网站数据的对比找出哪些…

爬虫实例6(获取哔哩哔哩网站《后浪》弹幕并可视化显示)(pyecharts词云,pandas库)

声明,只用于学习研究爬虫 1.《后浪》弹幕词云 最近小视频《后浪》挺火,该视频是国家一级演员何冰登台演讲,认可、赞美与寄语年轻一代;对他们说:“你们有幸遇见这样的时代,但时代更有幸遇见这样的你们。”…

网站下载工具有哪些?

Teleport Ultra.exe 链接:https://pan.baidu.com/s/1LhrnKJdyjCKprALz6AbmWw 提取码:n3dw 注:本软件仅用于学习,禁止其它用途。

图标素材网站

素材图标 http://www.iconfont.cn/ 收藏和取消收藏 http://www.iconfont.cn/search/index?searchTypeicon&q%E6%94%B6%E8%97%8F&page1&fromCollection1

SEO书籍《这就是搜索引擎:核心技术详解》要点解读

经朋友的推荐,去年买了一本SEO书籍-《这就是搜索引擎:核心技术详解》,断断续续用了几个月的时间看完这本seo书籍。感觉还是蛮好的,此书涉及的内容广而不深,通俗易懂,适合广大站长朋友看,当然&am…

2014谷歌算法更新,再次降低全球网站PR值

2014谷歌算法更新了,即去年2月份后再次降低了全球网站PR值。2013全年全球网站的评价PR值已经从6.175降到现在为5.935。 这次GOOGLE即上次蜂鸟算法后又一次大的调整算法。据说,此次谷歌新算法调整,会针对全球网站降低PR值,同时&am…

东莞SEO联盟电商【干货分享】

昨天受SEO大师级人物-萧涵的邀请,参加了东莞SEO联盟电商小型聚会。和萧涵认识已有一段时间了,只是因为在网上认识的,却从未谋面,这次很荣幸能以这样一个形式在一起聚聚。这次东莞seo联盟聚会能圆满成功,还得感谢东莞市…

简单快速搭建个人博客网站

简单快速建站 准备开始使用宝塔安装lnmp环境使用WordPress部署博客 关于域名 准备 已经有云主机,亚马逊,阿里,腾讯,都有免费的可以申请。我的服务器是去年为了科学上网在亚马逊申请的,后来一两个月端口就被墙了&#…

PHP curl 爬取反 爬的网站,请开启JavaScript并刷新该页.

目标链接:http://www.pbc.gov.cn/zhengcehuobisi/125207/125213/125440/3876551/index.html 笔者查阅很多资料,大部分人说这样子需要模拟浏览器访问,根本原因是因为cookie不是动态生成的或者不是有效的,方法: 1、chrom…

在线网站、PC端、移动端,PDF转换器最全合集了解一下?

天天跟各种文档打交道的上班族们,对 PDF转换这个操作一定是深恶痛绝;什么PDF转Word、PDF转PPT、PDF转Excel;还有Word转PDF、PPT转PDF.......眼花缭乱,看着就头痛。 有的小伙伴会吐槽自己也就偶尔进行一下 PDF转换的操作&…

考研党必备软件和网站,PDF转Word工具上榜

考研,是一项考验精力、物力、财力和能力的声势浩大的工程。考研党每一天的行程基本可以概括为:不是在图书馆,就是在去图书馆的路上。废寝忘食、头悬梁锥刺股是考研党每天的状态。当然,那些真正考上研究生的人从来不是单枪匹马&…