当前位置:   article > 正文

Python应用-Scrapy爬虫之拉勾网招聘数据分析

scrapy爬虫之拉勾网招聘数据分析

第1关:Scrapy 爬取数据存到 MongoDB 数据库中

任务描述

爬虫爬取到的数据存入MongoDB数据库中。

相关知识

本关实训和 Scrapy爬虫进阶 第三关基本相同,除了pipelines.py数据存储文件有所不同。

存储数据到 MongoDB 数据库
  • settings.py配置文件
 
  1. MONGO_HOST = "127.0.0.1" # 主机IP
  2. MONGO_PORT = 27017 # 端口号
  3. MONGO_DB = "Test" # 库名
  4. MONGO_COLL = "t_test" # collection名
  • pipelines.py定义存储方式
 
  1. import pymongo #pymongo模块是Python和MongoDB沟通的模块,必须有,没有要pip安装一下。
  2. from lagou import settings
  3. class LagouPipeline(object):
  4. def __init__(self):
  5. #连接数据库MongoDB
  6. self.client = pymongo.MongoClient(host=settings.MONGO_HOST,port=settings.MONGO_PORT)
  7. self.db = self.client[settings.MONGO_DB]
  8. self.coll = self.db[settings.MONGO_COLL]
  9. def process_item(self, item, spider):
  10. postItem = dict(item) # 把item转化成字典形式
  11. self.coll.insert(postItem) # 向数据库插入一条记录
  12. return item
编程要求

在右侧编辑器补充pipelines.py的代码,把爬取到的内容保存到MongoDBlagou数据库的zhaopin集合中。(基于Scrapy爬虫进阶,本关实训内容比较简单,希望同学们能认真理解掌握)

测试说明

运行爬虫程序,完成后读取MongoDBlagou数据库zhaopin集合的一条内容,能显示正确说明爬取并存储成功。

上代码:

  1. # -*- coding: utf-8 -*-
  2. # Define your item pipelines here
  3. #
  4. # Don't forget to add your pipeline to the ITEM_PIPELINES setting
  5. # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
  6. import pymongo
  7. from AjaxProject import settings
  8. class AjaxprojectPipeline(object):
  9. #********** Begin **********#
  10. def __init__(self):
  11. # 连接数据库 MongoDB
  12. self.client = pymongo.MongoClient(host=settings.MONGO_HOST, port=settings.MONGO_PORT)
  13. self.db = self.client[settings.MONGO_DB]
  14. self.coll = self.db[settings.MONGO_COLL]
  15. def process_item(self, item, spider):
  16. postItem = dict(item) # 把 item 转化成字典形式
  17. self.coll.insert_one(postItem) # 向数据库插入一条记录
  18. return item
  19. #********** End **********#

 第2关:在 jupyter notebook 中导入数据

任务描述

本关任务:把position.csv中的数据导入jupyter notebook

相关知识

本关涉及知识:将csv文件导入 jupyter notebook

系统环境:Ubuntu16.4

搭建数据分析环境

注:课下自行安装,平台默认给出应有环境。

Anaconda官网 获得对应版本进行下载,我选择的是 Linux环境。基于Python3.6的版本,下载后的文件名为Anaconda3-5.2.0-Linux-x86_64.sh。( 百度网盘下载链接 ,提取密码:kohs)

  • 打开终端,进入下载目录,输入命令进行安装:sudo bash Anaconda3-5.2.0-Linux-x86_64.sh

  • 期间根据提示按下回车键或输入yes继续安装;

  • 提示安装完成,并会打开新的终端,在新终端中打开jupyter notebook,命令:jupyter notebook;浏览器中出现下图所示页面说明安装成功。

将 xls 表格文件导入到 jupyter notebook

在终端打开jupyter notebook,基于Python3新建一个 notebook

成功新建notebook后会跳转到另一个页面,常用图标、按钮的作用如下所示:

我们在命令栏输入命令(分三次输入,方便调试),导入xls文件。先导入基础包:

 
  1. # 加这行可以在浏览器中显示图像出来
  2. %matplotlib inline
  3. import numpy as np
  4. import pandas as pd
  5. import matplotlib.pyplot as plt
  6. import re
  7. path = r'step2/'
  8. filePath = path+r'Test.xls'
  9. display_column = ['food','morning','noon','afternoon']

导入xls表格文件:

 
  1. # 从xls表格文件中加载(`notebook`默认是`utf-8`编码,如果文件中的的中文是用`gbk`编码,要在这里声明编码方式,如:`encoding='gbk'`)
  2. df = pd.read_excel(filePath)
  3. # 重新设置列的顺序
  4. df = df.reindex(columns=display_column)

显示文件前5行:

 
  1. df.head()

点击运行按钮3次,效果如下图所示:

将 MongoDB 中的数据导入到 jupyter notebook

同导入csv文件一样,先导入基础包,设置一下显示顺序,再进行如下操作:

  • 连接数据库:
     
      
    1. import pymongo
    2. from pymongo import MongoClient
    3. # 连接 mongodb
    4. c = MongoClient()
  • 将数据转换成为DataFrame结构:
 
  1. cursor = c.lagou['zhaopin'].find()
  2. df = pd.DataFrame(list(cursor))
  3. # 删除 "_id"列
  4. df = df.drop("_id", axis=1)
  5. # 重新设置列的顺序
  6. df = df.reindex(columns=display_columns)
  7. # 将p_date的数据类型从timestamp 转换成 datetime
  8. df.p_date = pd.to_datetime(df['p_date'])
  9. df.head() #显示表的前5行
编程要求

根据提示,在右侧编辑器补充代码,把positions.csv中的数据导入jupyter notebook,按照 ["salarylow","salaryhigh","company","positionname","index_id","position"]的顺序进行显示。positions.csv所在路径为:step2/positions.csv

测试说明

平台会对你编写的代码进行测试:

显示导入数据的前5行,与预期比对是否一致。

上代码:

  1. #********** Begin **********#
  2. import numpy as np
  3. import pandas as pd
  4. import matplotlib.pyplot as plt
  5. import re
  6. path = r'step2/'
  7. filePath = path + r'positions.csv'
  8. display_column = ['salarylow','salaryhigh','company','positionname','index_id','position']
  9. df = pd.read_csv(filePath,encoding = 'gbk')
  10. df = df.reindex(columns=display_column)
  11. #********** End **********#
  12. d5 = df.head()
  13. print(d5) #显示前5行数据

 第3关:招聘学历要求饼状图

任务描述

本关任务:使用Pandas 结合 Matplotlib 对数据进行可视化展示(饼图)。

相关知识

为了完成本关任务,你需要掌握:1.了解Pandas对数据进行分析的方法(不了解Pandas的同学可以去学习一下 Pandas初体验 这个实训);2. Pandas 结合 Matplotlib 对数据进行可视化展示。

ubuntu下matplotlib生成图片正常显示中文

注:课下自行安装,平台默认给出应有环境。

  • 准备中文字体 从Windows操作系统复制:在C:\Windows\Fonts文件夹中,找到simhei.ttf字体,把它拷贝到matplotlibfonts/ttf目录,完整路径为:/home/hmm/anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/(和你上一关安装的anaconda3路径有关,根据自己安装的路径拷贝);

  • 修改配置文件:/home/hmm/anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc

搜索font.family,去掉注释,进行如下图的修改:

搜索axes.unicode_minus,去掉注释,进行如下图的修改:

  • 清空matplotlib使配置生效:

在终端输入命令:rm ~/.cache/matplotlib -R

  • 重启jupyter notebook,生成的图片,中文就可以正常显示了。
导入文档

我准备了表格文档Test.xls,如下所示(其中数字是指每个时间段的点菜次数):

我们的目的是:做一个饼图,根据点菜的比例,分析早上哪样菜最受欢迎。

  • 导入表格的方法和第二关的导入csv文件差不多。在jupyter notebook中写如下代码,导入数据分析的基本库(在做数据分析前,我们会约定俗成地引入 Numpy PandasMatplotlib 三个工具包,并使用其简称nppdplt。其中,numpy 是科学计算基础包;matplitlib是绘图工具):
 
  1. %matplotlib inline #这一句作用是将图片显示出来。不用再调用 plt.show() 方法显示了
  2. import numpy as np
  3. import pandas as pd
  4. import matplotlib.pyplot as plt
  5. import re
  • 现在开始导入表格文件,先指定文件的路径(该文件在本测试平台的路径为/step3/test.xls),然后设置列的顺序:
     
      
    1. path = r'/step3/'
    2. filePath = path+r'Test.xls'
    3. display_column = ['food','morning','noon','afternoon']
  • 准备工作都做好了,使用pd.read_excel()导入列表文件,然后按照我们刚才设置的列的顺序重新排列,最后一行是显示我们导入的数据:
     
      
    1. df = pd.read_excel(filePath)
    2. df = df.reindex(columns=display_column)
    3. display(df)

以上代码运行后效果如下:

Pandas 结合 Matplotlib 对数据进行可视化展示

数据已经导入成功,我们可以开始“画图”啦~

要画这个饼图,我们要有每样菜的菜名X、早上每样菜的点菜数量Y、早上所有菜的点菜数量sum、每样菜的点菜量占所有点菜量的比例Y/sum,这些数据我们要用Pandas分析出来,具体如下:

 
  1. X = list(df['food']) #列出食物名
  2. Y = list(df['morning']) #列出早上每样菜的点菜数量
  3. sum = df['morning'].sum() #求出早上‘morning’点菜的总数
  4. fig,ax = plt.subplots() #plt.subplots() 返回一个 Figure实例fig 和一个 AxesSubplot实例ax 。fig代表整个图像,ax代表坐标轴和画的图。这条命令可以用来设置画多个图,然而这里我们只画一个,所以括号里不用做设置
  5. ax.pie(Y/sum,autopct='%1.1f%%',labels=X) #参数(每一块的比例;控制饼图内百分比设置 '%1.1f'指小数点前后位数(没有用空格补齐);每一块饼图外侧显示的说明文字)
  6. fig.set_size_inches(7,7) #设置圆的大小,如果两个数字不相等会变成椭圆

代码运行后效果如下:

至此,我们成功完成了该饼图的绘制,能从图中得到结论:早上炸豆腐最受欢迎。

编程要求

仿照例子,分析positions.csv中的数据(positions.csv文件是爬虫爬下来的数据经过一定处理的,方便数据分析),画出招聘学历要求的饼状图,要求饼图外侧显示的说明文字,饼图内每部分显示所占比例,精确到小数点后一位,效果如下图所示:

由于测试平台不支持图片的直接显示,导入基础包时采用以下方式,

 
  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib
  4. #强制matplotlib不使用任何Xwindows后端(X Window图形用户接口)
  5. matplotlib.use('Agg')
  6. import matplotlib.pyplot as plt
  7. import re

提示(针对Pandas掌握不够深的同学):

  • 分析数据时,采用value_counts()方法,找出表格edu列中有多少个不同值,并计算出每个不同值有在该列中有多少重复值;
  • 然后将value_counts()获取到的数据转化为DataFrame格式;
  • 通过index.tolist()获取一列索引的值(得到有哪些学历要求:大专、本科、硕士、博士、不限);
  • 重复值通过list()方法便可获得。
测试说明

我会将你生成的图片与标准答案/step3/img/example.png进行比对,图片内容与标准答案一致将可通过测试。

上代码:

  1. #********** Begin **********#
  2. #1.导入基础包
  3. import numpy as np
  4. import pandas as pd
  5. import matplotlib
  6. matplotlib.use('Agg')
  7. import matplotlib.pyplot as plt
  8. import re
  9. # 防止中文乱码
  10. matplotlib.rcParams['font.sans-serif'] = ['SimHei']
  11. matplotlib.rcParams['font.family']='sans-serif'
  12. #2.导入文档数据
  13. path = r'step3/'
  14. filePath = path + r'positions.csv'
  15. df = pd.read_csv(filePath,encoding = 'gbk')
  16. #3.分析数据
  17. edu_count = df['edu'].value_counts()
  18. edu_labels = edu_count.index.tolist()
  19. edu_values = edu_count.tolist()
  20. #4.画图
  21. fig, ax = plt.subplots()
  22. ax.pie(edu_values, autopct='%1.1f%%', labels=edu_labels)
  23. fig.set_size_inches(7, 7)
  24. #********** End **********#
  25. plt.savefig(path+r'/yourimg/'+r'pie.png') #存储图片

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/654854
推荐阅读
相关标签
  

闽ICP备14008679号