你所在的位置: 首页 > 正文

python爬取拉勾网数据并进行数据可视化

2019-07-23 点击:1560

爬上与python位置相关的数据,并将已爬行的数据存储在文件中,然后清理csv文件的相关字段的数据,并可视化数据,包括直方图显示,直方图图形显示,文字云显示,等,并根据可视化数据进一步分析,其余的分析和显示读者可以自己发挥和扩展,包括各种分析和不同的存储方法。 Python学习交流组:1004391443

1.抓取并分析相关的依赖关系

Python版本:Python3.6请求:下载页面数学:向上循环时间:暂停进程pandas:数据分析并保存为csv文件matplotlib:绘图pyecharts:绘制statsmodels:统计建模wordcloud,scipy,jieba:生成中文单词云pylab:设置绘图显示中文

在上述安装或使用过程中,读者可能会遇到安装或导入失败等问题。百度,选择相应版本的依赖包

其次,分析网页的结构

通过Chrome搜索“python工程师”,然后右键单击支票或F12,使用检查功能查看网页的源代码。当我们点击下一页观察浏览器的搜索栏的url没有改变时,这是因为网络反爬行机制,作业信息不在源代码中,而是在JSON文件中,所以我们下载直接使用JSON,并使用字典方法直接读取数据。您可以获得有关我们想要的python位置的信息。

29e5d7e088fe4bfbbd5962c247e185aa

要抓取的python工程师位置如下:

996fd0cd9b6b4a849bdc4aeadcb73afb

为了攀爬我们想要的数据,我们需要使用该程序来模拟浏览器以查看网页,因此我们将在抓取过程中添加标题信息。还通过分析网页获得标题信息。我们通过网页分析网页。知道请求的头信息,以及请求的信息和请求是一个POST请求,这样我们就可以获得我们想要进一步处理url请求的数据

a94d265af4d64d9fb6c3b875e6b3eeb4

抓取页面信息代码如下:

导入请求

Url=''

Def get_json(url,num):

'''

从指定的URL,请求头和请求体用于通过请求请求获取网页中的信息,

:返回:

'''

Url1=''

标题={

'User-Agent':'Mozilla/5.0(Windows NT 10.0; Win64; x64)AppleWebKit/537.36(KHTML,与Gecko一样)Chrome/66.0.3359.139 Safari/537.36',

'主持':'',

'Referer':'',

'X-Anit-Forge-Code':'0',

'X-Anit-Forge-Token':'无',

'X-Requested-With':'XMLHttpRequest'

}

数据={

'first':'true',

'pn': num,

'kd':'python engineer'}

s=requests.Session()

打印('创建会话:',s,'\ n \ n')

S.get(url=url1,headers=headers,timeout=3)

Cookie=s.cookies

打印('获取cookie:',cookie,'\ n \ n')

Res=requests.post(url,headers=headers,data=data,cookies=cookie,timeout=3)

Res.raise_for_status()

Res.encoding='utf-8'

Page_data=res.json()

打印('请求回复结果:',page_data,'\ n \ n')

返回page_data

Print(get_json(url, 1))

Through the search, we know that each page displays 15 positions, up to 30 pages. By analyzing the source code of the webpage, we can read the total number of posts in JSON, the total number of posts and the number of posts that can be displayed per page. We can calculate How many pages are in total, then use the loop to crawl by page, and finally summarize the job information and write it to a file in CSV format.

The program running result is shown in Figure:

e8d7b6c8ca4f497ba6086e8622a3efcb

Crawl all python related posts as follows:

f2c0b2f3685749d68adbf123e75c8916

Third, the data is cleaned and stored in the library

Data cleaning actually takes up a lot of work, we only do some simple data analysis here and then put it into the library. There will be 18,988 python-related posts in the hack. You can select the fields to be warehousing according to the needs of the work, and further filter some fields. For example, we can remove the positions of the interns in the job title, filter the positions of the specified field area in our designated area, and take the field salary. The average value, with the lowest value and a quarter of the difference as the average, etc. free to play according to demand

Import pandas as pd

Import matplotlib.pyplot as plt

Import statsmodels.api as sm

From wordcloud import WordCloud

From scipy.misc import imread

From imageio import imread

Import jieba

xx

来自pylab import mpl

#使用matplotlib显示中文

mpl.rcParams ['font.sans-serif']=['SimHei']#指定默认字体

mpl.rcParams ['axes.unicode_minus']=False#解决保存图像为减号的问题' - '显示为正方形

#阅读数据

Df=pd.read_csv('Python_development_engineer.csv',encoding='utf-8')

#进行数据进行,过滤的实习职

#df.drop(df [df ['job name']。str.contains('intern')]。index,inplace=True)

#print(df.describe())

#由于csv文件中的字符采用字符串形式,因此首先使用正则表达式将字符串转换为列表,并将间隔中的均值转换为。

模式='\ d +'

#print(df ['工作工作'],'\ n \ n \ n')

#print(df ['工作工作'] .str.findall(pattern))

Df ['working years']=df ['work experience']。str.findall(pattern)

打印(输入(df ['working years']),'\ n \ n \ n')

Avg_work_year=[]

计数=0

对于我在df ['working years']:

#print('每个职位的工作年限',i)

#如果工作经验是“无限制”或“毕业”,则匹配值为空,工作时间为0

如果len(i)==0:

Avg_work_year.append(0)

#print('nihao')

计数+=1

#如果匹配值是数值,则返回值

Elif len(i)==1:

#print('hello world')

Avg_work_year.append(INT( ''。加入()))

计数+=1

#如果匹配是一个间隔,那么平均值

否则为:

Num_list=[i中的j的int(j)]

Avg_year=sum(num_list)/2

Avg_work_year.append(avg_year)

计数+=1

打印(计数)

Df ['avg_work_year']=avg_work_year

#将字符串转换为列表,工资的最低值加上值25%的区间,更接近现实

Df ['salary']=df ['salary']。str.findall(pattern)

Avg_salary_list=[]

对于k in df ['salary']:

Int_list=[int(n)for n in k]

Avg_salary=int_list [0] +(int_list [1] - int_list [0])/4

Avg_salary_list.append(avg_salary)

Df ['月薪']=avg_salary_list

#df.to_csv('python.csv',index=False)

四,数据可视化显示

以下是数据的可视化显示,只是部分视图的一些视觉显示,如果读者想要显示其他一些字段并希望使用不同的视图类型进行显示,请自行播放,注意:参见模块介绍在以下代码中最后一个完整代码

1.绘制python薪水的频率直方图并保存

如果我们想看看互联网行业中的python工程师相关帖子,一般工资范围的范围在哪里,我们可以使用matplotlib库来可视化我们存储在csv文件中的数据。该节目,但我们可以更直观地看到数据的细分趋势

#绘制python工资的频率直方图并保存

Plt.hist(df ['month salary'],bins=8,facecolor='#ff6700',edgecolor='blue')#形形

Plt.xlabel('薪水(单位/千)')

Plt.ylabel( '频率/频率')

Plt.title('python薪水直方图')

Plt.savefig('python salary distribution.jpg')

Plt.show()

结果如下:

6eb9ca8882284a0cba8f3980e1c18352

2,绘制一个与python相关位置位置的饼图

通过python的地理位置的地理位置,我们可以大致了解IT行业中哪些城市主要集中,这更有利于我们选择地理选择性就业,更多的访谈机会等,参数可以可以自己调试,也可以根据需要添加。

#绘制饼图并保存

City=df ['city']。value_counts()

打印(类型(城市))

#print(len(city))

Label=city.keys()

印刷(标签)

City_list=[]

计数=0

n=1

距离=[]

我在城市:

city_list.append()

print('列表长度',len(city_list))

count +=1

如果计数> 5:

n +=0.1

distance.append(n)的

别的:

distance.append(0)

plt.pie(city_list,labels=label,labeldistance=1.2,autopct='%2.1f %%',pctdistance=0.6,shadow=True,explode=distance)

plt.axis('equal')#使饼图为正圆形

plt.legend(loc='左上',bbox_to_anchor=( - 0.1,1))

plt.savefig( '蟒地理位置分布图.jpg')

plt.show()

运行结果如下:

2fc29beebc5540e5adc8cd18654541bf

3,绘制基于pyechart的城市分布柱状图

XXPycharts是Python基于js开发调用百度的echarts接口。它还可以对数据执行各种可视化操作。更多数据可视化和图形显示可以在echarts官方网站上找到:echarts官方网站提供了各种示例供我们参考,如折线图,直方图,饼图,路径图,树图等,基于pyecharts文档可以参考到以下官方网站:更多用法也可以是百度网络资源

City=df ['city']。value_counts()

打印(类型(城市))

打印(城市)

#print(len(city))

Keys=city.index#等同于keys=city.keys()

值=city.values

来自pyecharts进口酒吧

Bar=Bar(''python jobs'的城市地图)

Bar.add('城市',键,值)

Bar.print_echarts_options()#此行仅用于打印配置项,方便调试。

Bar.render(路径='a.html')

结果如下:

9454e5a69dd642e8a5dd8c1c31696eaa

4,绘制python福利相关词云

词云地图,也称为词云,在文本数据中直观地突出显示高频率的关键词,形成类似于云状彩色图像的“关键词渲染”,从而过滤掉大量的文本信息,以便一目了然,人们可以欣赏文本数据的主要含义。使用jieba分词和词云生成WorldCloud(可自定义的背景),以下是关于python相关位置福利的文字云显示,可以更直观地看到大多数公司的福利收益集中在哪里。 >

#绘制益处词

Text=''

对于df ['公司福利']:

中的行

如果len(eval(line))==0:

继续

否则为:

对于eval中的单词(行):

#print(word)

文字+=字

Cut_word=','。join(jieba.cut(text))

Word_background=imread('princess.jpg')

Cloud=WordCloud(

Font_path=r'C: \ Windows \ Fonts \ simfang.ttf',

BACKGROUND_COLOR='黑',

掩模=word_background,

Max_words=500,

Max_font_size=100,

宽度=400,

高度=800

Word_cloud=cloud.generate(cut_word)

Word_cloud.to_file('福利待遇word cloud.png')

Plt.imshow(word_cloud)

Plt.axis( 'OFF')

Plt.show()

结果如下:

64b361138da244a5baba44ede5b18228

V.爬行动物和视觉完整代码

完整的代码如下,代码经过测试,可以正常运行。有兴趣的合作伙伴可以尝试了解使用方法。如果操作或模块安装失败,您可以在注释区域中留言。让我们一起解决它

如果你觉得它对你有帮助,你可以喜欢它。原始内容被复制,您需要解释来源!

1,爬虫完整代码

为了防止我们频繁请求将网站限制为ip,我们选择在抓取每个页面后暂停一段时间。当然,您也可以使用代理和其他方法自己实现

导入请求

导入数学

导入时间

将pandas导入为pd

Def get_json(url,num):

'''

从指定的URL,请求头和请求体用于通过请求请求获取网页中的信息,

:返回:

'''

Url1=''

标题={

'User-Agent':'Mozilla/5.0(Windows NT 10.0; Win64; x64)AppleWebKit/537.36(KHTML,与Gecko一样)Chrome/66.0.3359.139 Safari/537.36',

'主持':'',

'Referer':'',

'X-Anit-Forge-Code':'0',

'X-Anit-Forge-Token':'无',

'X-Requested-With':'XMLHttpRequest'

}

数据={

'first':'true',

'pn': num,

'kd':'python engineer'}

s=requests.Session()

打印('创建会话:',s,'\ n \ n')

S.get(url=url1,headers=headers,timeout=3)

Cookie=s.cookies

打印('获取cookie:',cookie,'\ n \ n')

Res=requests.post(url,headers=headers,data=data,cookies=cookie,timeout=3)

Res.raise_for_status()

Res.encoding='utf-8'

Page_data=res.json()

打印('请求回复结果:',page_data,'\ n \ n')

返回page_data

Def get_page_num(count):

'''

计算要爬网的页数。通过在网络上输入关键字信息,您可以找到最多30页的信息,每页最多15个帖子

:返回:

'''

Page_num=math.ceil(count/15)

如果page_num> 30:

返回30

否则为:

返回page_num

Def get_page_info(jobs_list):

'''

获得一个职位

: param jobs_list:

:返回:

'''

Page_info_list=[]

对于i in jobs_list:#循环每页上的所有帖子

Job_info=[]

Job_info.append([ 'companyFullName'])

Job_info.append([ 'companyShortName'])

Job_info.append([ 'companySize'])

Job_info.append([ 'financeStage'])

Job_info.append([ '区'])

Job_info.append([ 'positionName'])

Job_info.append([ '工作年'])

Job_info.append([ '教育'])

Job_info.append([ '薪水'])

Job_info.append([ 'positionAdvantage'])

Job_info.append([ 'industryField'])

Job_info.append(i['firstType'])

Job_info.append(i['companyLabelList'])

Job_info.append(i['secondType'])

Job_info.append(i['city'])

Page_info_list.append(job_info)

Return page_info_list

Def main():

Url=' '

First_page=get_json(url, 1)

Total_page_count=first_page['content']['positionResult']['totalCount']

Num=get_page_num(total_page_count)

Total_info=[]

Time.sleep(10)

Print('python total number of related posts: {}, total page count is: {}'.format(total_page_count, num))

For num in range(1, num + 1):

# Get information about the position of each page

xxPage_data=get_json(url,num)#获取响应json

Jobs_list=page_data ['content'] ['positionResult'] ['result']#获取每页所有与python相关的职位信息

Page_info=get_page_info(jobs_list)

打印('每页与python相关的作业信息:%s'%page_info,'\ n \ n')

Total_info +=page_info

打印('已抓取到页面{},帖子总数为{}'。format(num,len(total_info)))

Time.sleep(20)

#将总数据转换为数据帧并输出,然后将其写入csv文件

Df=pd.DataFrame(data=total_info,

Columns=['公司的全名','公司缩写','公司规模','融资阶段','地区','工作名称','工作经验','教育要求','薪水','职位福利','业务范围',

“工作类型”,“公司利益”,“第二职位类型”,“城市”])

#df.to_csv('Python_development_engineer.csv',index=False)

打印('python相关作业信息已保存')

如果__name__=='__ main__':

main()的

2.可视化完整代码

数据可视化涉及使用matplotlib,jieba,wordcloud,pyecharts,pylab,scipy等模块。读者可以了解每个模块的用法以及所涉及的各种参数。

将pandas导入为pd

将matplotlib.pyplot导入为plt

将statsmodels.api导入为sm

从wordcloud导入WordCloud

来自scipy.misc import imread

#from imageio import imread

导入jieba

来自pylab import mpl

#使用matplotlib显示中文

mpl.rcParams ['font.sans-serif']=['SimHei']#指定默认字体

mpl.rcParams ['axes.unicode_minus']=False#解决保存图像为减号的问题' - '显示为正方形

#阅读数据

Df=pd.read_csv('Python_development_engineer.csv',encoding='utf-8')

#进行数据进行,过滤的实习职

#df.drop(df [df ['job name']。str.contains('intern')]。index,inplace=True)

#print(df.describe())

#由于csv文件中的字符采用字符串形式,因此首先使用正则表达式将字符串转换为列表,并将间隔中的均值转换为。

模式='\ d +'

#print(df ['工作工作'],'\ n \ n \ n')

#print(df ['工作工作'] .str.findall(pattern))

Df ['working years']=df ['work experience']。str.findall(pattern)

打印(输入(df ['working years']),'\ n \ n \ n')

Avg_work_year=[]

计数=0

对于我在df ['working years']:

#print('每个职位的工作年限',i)

#如果工作经验是“无限制”或“毕业”,则匹配值为空,工作时间为0

如果len(i)==0:

Avg_work_year.append(0)

#print('nihao')

计数+=1

#如果匹配值是数值,则返回值

Elif len(i)==1:

#print('hello world')

Avg_work_year.append(INT( ''。加入()))

计数+=1

#如果匹配是一个间隔,那么平均值

否则为:

Num_list=[i中的j的int(j)]

Avg_year=sum(num_list)/2

Avg_work_year.append(avg_year)

计数+=1

打印(计数)

Df ['avg_work_year']=avg_work_year

#将字符串转换为列表,工资的最低值加上值25%的区间,更接近现实

Df ['salary']=df ['salary']。str.findall(pattern)

Avg_salary_list=[]

对于k in df ['salary']:

Int_list=[int(n)for n in k]

avg_salary=int_list [0] +(int_list [1] - int_list [0])/4

avg_salary_list.append(avg_salary)

df ['月薪']=avg_salary_list

#df.to_csv('python.csv',index=False)

'' '1,绘制蟒薪资的频率直方图并保存' ''

plt.hist(df ['月薪'],bins=8,facecolor='#ff6700',edgecolor='blue')#形数目

plt.xlabel( '薪资(单位/千元)')

plt.ylabel( '频数/频率')

plt.title( '蟒薪资直方图')

plt.savefig( '蟒薪资分布.jpg')

plt.show()

'' '2,绘制饼状图并保存' ''

city=df ['城市'] .value_counts()

打印(类型(城市))

#print(len(city))

label=city.keys()

印刷(标签)

city_list=[]

count=0

n=1

XX距离=[]

对于我在城市:

City_list.append()

打印('list length',len(city_list))

计数+=1

如果计数> 5:

n +=0.1

Distance.append(n)的

否则为:

Distance.append(0)

Plt.pie(city_list,labels=label,labeldistance=1.2,autopct='%2.1f %%',pctdistance=0.6,shadow=True,explode=distance)

Plt.axis('相等')#使饼图成为一个完美的圆圈

Plt.legend(loc='左上角',bbox_to_anchor=( - 0.1,1))

Plt.savefig('python location map.jpg')

Plt.show()

'''3,云这个词''''

Text=''

对于df ['公司福利']:

中的行

如果len(eval(line))==0:

继续

别的:

eval中的单词(行):

#print(word)

文字+=字

cut_word=','。join(jieba.cut(text))

word_background=imread('公主.jpg')

cloud=WordCloud(

font_path=r'C: \ Windows \ Fonts \ simfang.ttf',

BACKGROUND_COLOR='黑',

掩模=word_background,

max_words=500,

max_font_size=100,

宽度=400,

高度=800

word_cloud=cloud.generate(cut_word)

word_cloud.to_file( '福利待遇词云.PNG')

plt.imshow(word_cloud)

plt.axis( 'OFF')

plt.show()

'' '4,基于pyechart的柱状图' ''

city=df ['城市'] .value_counts()

XX打印(类型(城市))

打印(城市)

#print(len(city))

Keys=city.index#等同于keys=city.keys()

值=city.values

来自pyecharts进口酒吧

Bar=Bar(''python jobs'的城市地图)

Bar.add('城市',键,值)

Bar.print_echarts_options()#此行仅用于打印配置项,方便调试。

Bar.render(路径='a.html')

日期归档
亚心网 版权所有© www.xatst.com 技术支持:亚心网 | 网站地图