赞
踩
将爬虫爬取到的数据存入MongoDB
数据库中。
本关实训和 Scrapy爬虫进阶 第三关基本相同,除了pipelines.py
数据存储文件有所不同。
settings.py
配置文件MONGO_HOST = "127.0.0.1" # 主机IP
MONGO_PORT = 27017 # 端口号
MONGO_DB = "Test" # 库名
MONGO_COLL = "t_test" # collection名
pipelines.py
定义存储方式import pymongo #pymongo模块是Python和MongoDB沟通的模块,必须有,没有要pip安装一下。
from lagou import settings
class LagouPipeline(object):
def __init__(self):
#连接数据库MongoDB
self.client = pymongo.MongoClient(host=settings.MONGO_HOST,port=settings.MONGO_PORT)
self.db = self.client[settings.MONGO_DB]
self.coll = self.db[settings.MONGO_COLL]
def process_item(self, item, spider):
postItem = dict(item) # 把item转化成字典形式
self.coll.insert(postItem) # 向数据库插入一条记录
return item
在右侧编辑器补充pipelines.py
的代码,把爬取到的内容保存到MongoDB
的lagou
数据库的zhaopin
集合中。(基于Scrapy爬虫进阶
,本关实训内容比较简单,希望同学们能认真理解掌握)
运行爬虫程序,完成后读取MongoDB
的lagou
数据库zhaopin
集合的一条内容,能显示正确说明爬取并存储成功。
上代码:
- # -*- coding: utf-8 -*-
-
- # Define your item pipelines here
- #
- # Don't forget to add your pipeline to the ITEM_PIPELINES setting
- # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
- import pymongo
- from AjaxProject import settings
- class AjaxprojectPipeline(object):
- #********** Begin **********#
- def __init__(self):
- # 连接数据库 MongoDB
- self.client = pymongo.MongoClient(host=settings.MONGO_HOST, port=settings.MONGO_PORT)
- self.db = self.client[settings.MONGO_DB]
- self.coll = self.db[settings.MONGO_COLL]
-
- def process_item(self, item, spider):
- postItem = dict(item) # 把 item 转化成字典形式
- self.coll.insert_one(postItem) # 向数据库插入一条记录
- return item
- #********** End **********#
本关任务:把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
;浏览器中出现下图所示页面说明安装成功。
在终端打开jupyter notebook
,基于Python3
新建一个 notebook
。
成功新建notebook
后会跳转到另一个页面,常用图标、按钮的作用如下所示:
我们在命令栏输入命令(分三次输入,方便调试),导入xls
文件。先导入基础包:
# 加这行可以在浏览器中显示图像出来
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import re
path = r'step2/'
filePath = path+r'Test.xls'
display_column = ['food','morning','noon','afternoon']
导入xls
表格文件:
# 从xls表格文件中加载(`notebook`默认是`utf-8`编码,如果文件中的的中文是用`gbk`编码,要在这里声明编码方式,如:`encoding='gbk'`)
df = pd.read_excel(filePath)
# 重新设置列的顺序
df = df.reindex(columns=display_column)
显示文件前5
行:
df.head()
点击运行按钮3
次,效果如下图所示:
同导入csv
文件一样,先导入基础包,设置一下显示顺序,再进行如下操作:
import pymongo
from pymongo import MongoClient
# 连接 mongodb
c = MongoClient()
DataFrame
结构:cursor = c.lagou['zhaopin'].find()
df = pd.DataFrame(list(cursor))
# 删除 "_id"列
df = df.drop("_id", axis=1)
# 重新设置列的顺序
df = df.reindex(columns=display_columns)
# 将p_date的数据类型从timestamp 转换成 datetime
df.p_date = pd.to_datetime(df['p_date'])
df.head() #显示表的前5行
根据提示,在右侧编辑器补充代码,把positions.csv
中的数据导入jupyter notebook
,按照 ["salarylow","salaryhigh","company","positionname","index_id","position"]
的顺序进行显示。positions.csv
所在路径为:step2/positions.csv
。
平台会对你编写的代码进行测试:
显示导入数据的前5
行,与预期比对是否一致。
上代码:
- #********** Begin **********#
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- import re
- path = r'step2/'
- filePath = path + r'positions.csv'
- display_column = ['salarylow','salaryhigh','company','positionname','index_id','position']
- df = pd.read_csv(filePath,encoding = 'gbk')
- df = df.reindex(columns=display_column)
- #********** End **********#
- d5 = df.head()
- print(d5) #显示前5行数据
本关任务:使用Pandas
结合 Matplotlib
对数据进行可视化展示(饼图)。
为了完成本关任务,你需要掌握:1.了解Pandas
对数据进行分析的方法(不了解Pandas
的同学可以去学习一下 Pandas初体验 这个实训);2. Pandas
结合 Matplotlib
对数据进行可视化展示。
注:课下自行安装,平台默认给出应有环境。
准备中文字体 从Windows
操作系统复制:在C:\Windows\Fonts
文件夹中,找到simhei.ttf
字体,把它拷贝到matplotlib
的fonts/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
、Pandas
、Matplotlib
三个工具包,并使用其简称np
,pd
,plt
。其中,numpy
是科学计算基础包;matplitlib
是绘图工具):%matplotlib inline #这一句作用是将图片显示出来。不用再调用 plt.show() 方法显示了
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import re
/step3/test.xls
),然后设置列的顺序:
path = r'/step3/'
filePath = path+r'Test.xls'
display_column = ['food','morning','noon','afternoon']
pd.read_excel()
导入列表文件,然后按照我们刚才设置的列的顺序重新排列,最后一行是显示我们导入的数据:
df = pd.read_excel(filePath)
df = df.reindex(columns=display_column)
display(df)
以上代码运行后效果如下:
数据已经导入成功,我们可以开始“画图”啦~
要画这个饼图,我们要有每样菜的菜名X
、早上每样菜的点菜数量Y
、早上所有菜的点菜数量sum
、每样菜的点菜量占所有点菜量的比例Y/sum
,这些数据我们要用Pandas
分析出来,具体如下:
X = list(df['food']) #列出食物名
Y = list(df['morning']) #列出早上每样菜的点菜数量
sum = df['morning'].sum() #求出早上‘morning’点菜的总数
fig,ax = plt.subplots() #plt.subplots() 返回一个 Figure实例fig 和一个 AxesSubplot实例ax 。fig代表整个图像,ax代表坐标轴和画的图。这条命令可以用来设置画多个图,然而这里我们只画一个,所以括号里不用做设置
ax.pie(Y/sum,autopct='%1.1f%%',labels=X) #参数(每一块的比例;控制饼图内百分比设置 '%1.1f'指小数点前后位数(没有用空格补齐);每一块饼图外侧显示的说明文字)
fig.set_size_inches(7,7) #设置圆的大小,如果两个数字不相等会变成椭圆
代码运行后效果如下:
至此,我们成功完成了该饼图的绘制,能从图中得到结论:早上炸豆腐最受欢迎。
仿照例子,分析positions.csv
中的数据(positions.csv
文件是爬虫爬下来的数据经过一定处理的,方便数据分析),画出招聘学历要求的饼状图,要求饼图外侧显示的说明文字,饼图内每部分显示所占比例,精确到小数点后一位,效果如下图所示:
由于测试平台不支持图片的直接显示,导入基础包时采用以下方式,
import numpy as np
import pandas as pd
import matplotlib
#强制matplotlib不使用任何Xwindows后端(X Window图形用户接口)
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import re
提示(针对Pandas
掌握不够深的同学):
value_counts()
方法,找出表格edu
列中有多少个不同值,并计算出每个不同值有在该列中有多少重复值;value_counts()
获取到的数据转化为DataFrame
格式;index.tolist()
获取一列索引的值(得到有哪些学历要求:大专、本科、硕士、博士、不限);list()
方法便可获得。我会将你生成的图片与标准答案/step3/img/example.png
进行比对,图片内容与标准答案一致将可通过测试。
上代码:
-
- #********** Begin **********#
- #1.导入基础包
- import numpy as np
- import pandas as pd
- import matplotlib
- matplotlib.use('Agg')
- import matplotlib.pyplot as plt
- import re
-
- # 防止中文乱码
- matplotlib.rcParams['font.sans-serif'] = ['SimHei']
- matplotlib.rcParams['font.family']='sans-serif'
-
- #2.导入文档数据
- path = r'step3/'
- filePath = path + r'positions.csv'
- df = pd.read_csv(filePath,encoding = 'gbk')
- #3.分析数据
- edu_count = df['edu'].value_counts()
- edu_labels = edu_count.index.tolist()
- edu_values = edu_count.tolist()
- #4.画图
- fig, ax = plt.subplots()
- ax.pie(edu_values, autopct='%1.1f%%', labels=edu_labels)
- fig.set_size_inches(7, 7)
- #********** End **********#
- plt.savefig(path+r'/yourimg/'+r'pie.png') #存储图片
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。