基于爬取百合网的数据,用matplotlib生成图表

爬取百合网的数据链接:http://www.cnblogs.com/YuWeiXiF/p/8439552.html

总共爬了22779条数据。第一次接触matplotlib库,以下代码参考了matplotlib官方文档:https://matplotlib.org/users/index.html。

数据查询用到了两个方法:getSexNumber(@sex varchar(2),@income varchar(30))、gethousingNumber(@sex varchar(2),@housing varchar(6))来简化查询语句的长度,代码如下:

 1 go
 2 create function getSexNumber(@sex varchar(2),@income varchar(30))
 3 returns int
 4 as
 5 begin
 6     return(select count(id) from users where sex = @sex and income = @income)
 7 end
 8 go
 9 go
10 create function gethousingNumber(@sex varchar(2),@housing varchar(6))
11 returns int
12 as
13 begin
14     return(select count(id) from users where sex = @sex and housing = @housing)
15 end
16 go

 以下代码为SQL Server 数据库操作:

 1 #__author: "YuWei"
 2 #__date: 2018/2/11
 3 import numpy as np
 4 import matplotlib.pyplot as plt
 5 import pymssql
 6
 7 def db(sql):
 8     """
 9     数据库相关操作
10
11     :param sql: sql语句
12     :return: 查询的结果集,list封装
13     """
14     conn = pymssql.connect(host=‘localhost‘, user=‘sa‘, password=‘123456c‘, database=‘Baihe‘, charset="utf8")
15     cur = conn.cursor()
16     cur.execute(sql)
17     row = cur.fetchone() # 指向结果集的第一行,
18     data = [] # 返回的list
19     while row:
20         rows = list(row)
21         for i in range(len(rows)): # 针对rows的每项编码
22             try:
23                 rows[i] = rows[i].encode(‘latin-1‘).decode(‘gbk‘)
24             except AttributeError:pass
25         data.append(rows) # 向data加数据
26         row = cur.fetchone() #
27     print(data)
28     cur.close()
29     conn.close()
30     return data
生成各工资段人数占总人数比图:
 1 def builder_income_ratio():
 2     """
 3     生成各工资段人数占总人数比图
 4
 5     :return: 无
 6     """
 7     data_list = db("select income,count(id) from users group by income")
 8     income_data_list = [] # 数据
 9     income_labels_list = [] # 图例
10     for data in data_list:
11         income_data_list.append(data[1])
12         income_labels_list.append(data[0])
13     income_data_list.remove(income_data_list[6]) # 删掉不要的数据
14     income_labels_list.remove(income_labels_list[6]) # 删掉不要的数据
15     # 画饼图
16     plt.pie(income_data_list,labels=income_labels_list,colors=[‘c‘,‘m‘,‘r‘,‘g‘],startangle=30,
17             shadow=True,explode=(0, 0, 0.1, 0, 0, 0, 0.1, 0, 0.1, 0, 0, 0),autopct=‘%.1f%%‘)
18     plt.title(‘各工资段人数占总人数比‘) # 标题
19     plt.show() # 显示

执行效果如下:

生成各工资段男,女人数图:

 1 def builder_sex_ratio():
 2     """
 3     生成各工资段男,女人数图
 4
 5     :return: 无
 6     """
 7     data_list = db("select income,dbo.getSexNumber(‘男‘,income) as 男 ,dbo.getSexNumber(‘女‘,income) as 女 "
 8                     "from users group by income")
 9     men = [] # 男
10     women = [] # 女
11     labels =[] # 图例
12     for data in data_list:
13         labels.append(data[0])
14         men.append(data[1])
15         women.append(data[2])
16     men.remove(men[6]) # 删掉不要的数据
17     women.remove(women[6]) # 删掉不要的数据
18     labels.remove(labels[6]) # 删掉不要的数据
19     max_line = 12 # 12个
20     fig,ax = plt.subplots()
21     line = np.arange(max_line) # [0,1,2,3,4,5,6,7,8,9,10,11]
22     bar_width = 0.4 # 条形之间的宽度
23     # 画条形图
24     ax.bar(line, men, bar_width,alpha=0.3, color=‘b‘,label=‘男‘)
25     ax.bar(line+bar_width, women, bar_width,alpha=0.3, color=‘r‘,label=‘女‘)
26     ax.set_xlabel(‘工资段‘)
27     ax.set_ylabel(‘人数‘)
28     ax.set_title(‘各工资段男,女人数图‘)
29     ax.set_xticks(line + bar_width / 2) # 保证条形居中
30     ax.set_xticklabels(labels)
31     # 画两条线
32     plt.plot([0.04, 1.04, 2.04, 3.04, 4.04, 5.04, 6.04, 7.04, 8.04, 9.04, 10.04, 11.04], men, label=‘男‘)
33     plt.plot([0.4, 1.4, 2.4, 3.4, 4.4, 5.4, 6.4, 7.4, 8.4, 9.4, 10.4, 11.4], women, label=‘女‘)
34     ax.legend()
35     fig.tight_layout()
36     # fig.savefig("1.png") # 生成图片
37     plt.show()

执行效果如下:

生成男,女平均身高图:

 1 def builder_age_ratio():
 2     """
 3     生成男,女平均身高图
 4
 5     :return:
 6     """
 7     data_list = db("select sex,avg(height) as 平均升高 from users group by sex")
 8     sex = [] # 性别
 9     number = [] # 人数
10     for data in data_list:
11         sex.append(data[0])
12         number.append(data[1])
13     # 画条形图
14     plt.bar(sex[0], number[0], label="男", color=‘g‘,width=0.03)
15     plt.bar(sex[1], number[1], label="女", color=‘r‘,width=0.03)
16     plt.legend()
17     plt.xlabel(‘性别‘)
18     plt.ylabel(‘身高‘)
19     plt.title(‘男女平均身高图‘)
20     plt.show()

执行效果如下:

生成有房与无房的人数比例图:

 1 def builder_housing_sum_ratio():
 2     """
 3     生成有房与无房的人数比例图
 4
 5     :return:
 6     """
 7     data_list = db("select housing,count(id) from users group by housing")
 8     housing_data_list = []
 9     housing_labels_list = []
10     for data in data_list:
11         housing_data_list.append(data[1])
12         housing_labels_list.append(data[0])
13     # 画饼图
14     plt.pie(housing_data_list, labels=housing_labels_list, colors=[‘g‘, ‘r‘], startangle=30,
15             shadow=True, explode=(0, 0), autopct=‘%.0f%%‘)
16     plt.title(‘有房与无房的人数比例图‘)
17     plt.show()

执行效果如下:

生成有无房男女人数图:

 1 def builder_housing_ratio():
 2     """
 3     生成有无房男女人数图
 4
 5     :return:
 6     """
 7     data_list = db("select dbo.gethousing(‘女‘,housing),dbo.gethousing(‘男‘,housing) from users group by housing")
 8     homey = [] # 有房
 9     homem = [] # 无房
10     for data in data_list:
11         homey.append(data[0])
12         homem.append(data[1])
13     max_line = 2 # 两个
14     fig, ax = plt.subplots()
15     line = np.arange(max_line) # [0,1]
16     bar_width = 0.1 # 条形之间的宽度
17     # 画条形
18     ax.bar(line,homey , bar_width, alpha=0.3,color=‘b‘,label=‘女‘)
19     ax.bar(line+bar_width, homem, bar_width,alpha=0.3,color=‘r‘,label=‘男‘)
20     ax.set_xlabel(‘有无房‘)
21     ax.set_ylabel(‘人数‘)
22     ax.set_title(‘有无房男女人数图‘)
23     ax.set_xticks(line + bar_width / 2) # 保持居中
24     ax.set_xticklabels([‘有房‘,‘无房‘])
25     ax.legend()
26     fig.tight_layout()
27     plt.show()

执行效果如下:

原文地址:https://www.cnblogs.com/YuWeiXiF/p/8445749.html

时间: 2024-12-19 10:22:36

基于爬取百合网的数据,用matplotlib生成图表的相关文章

python3 爬取百合网的女人们和男人们

学Python也有段时间了,目前学到了Python的类.个人感觉Python的类不应称之为类,而应称之为数据类型,只是数据类型而已!只是数据类型而已!只是数据类型而已!重要的事情说三篇. 据书上说一个.py(常量.全局变量.函数.数据类型)文件为一个模块,那么就有了一种感觉:常量.全局变量.函数.数据类型是同一"级别的".在此不多说了,收回自己的心思来看爬虫吧! 1.进百合网官网,单击"搜索".单击"基本搜索",这时会跳向另一个页面,该页面为登录

使用python爬取东方财富网机构调研数据

最近有一个需求,需要爬取东方财富网的机构调研数据.数据所在的网页地址为: 机构调研 网页如下所示: 可见数据共有8464页,此处不能直接使用scrapy爬虫进行爬取,因为点击下一页时,浏览器只是发起了javascript网络访问,然后将服务器返回的数据插入网页,无法通过网址直接获取对应页的的页面数据. 通过chrome的开发者工具,我们可以看到点击下一页按钮背后发起的网页访问: 在点击下一页时,浏览器向地址发起了访问.我们分析一下这个地址的结构: http://data.eastmoney.co

Python爬取天气网历史天气数据

我的第一篇博客,哈哈哈,记录一下我的Python进阶之路! 今天写了一个简单的爬虫. 使用python的requests 和BeautifulSoup模块,Python 2.7.12可在命令行中直接使用pip进行模块安装.爬虫的核心是利用BeautifulSoup的select语句获取需要的信息. pip install requests pip install bs4 以武汉市2017年5~7月的历史为例爬取天气网中武汉市的历史天气数据. 7月对应的网址为http://lishi.tianqi

python爬虫案例-爬取当当网数据

输入关键字,爬取当当网中商品的基本数据,代码如下: 1 # Author:K 2 import requests 3 from lxml import etree 4 from fake_useragent import UserAgent 5 import re 6 import csv 7 8 9 def get_page(key): 10 for page in range(1,50): 11 url = 'http://search.dangdang.com/?key=%s&act=in

Node.js爬虫-爬取慕课网课程信息

第一次学习Node.js爬虫,所以这时一个简单的爬虫,Node.js的好处就是可以并发的执行 这个爬虫主要就是获取慕课网的课程信息,并把获得的信息存储到一个文件中,其中要用到cheerio库,它可以让我们方便的操作HTML,就像是用jQ一样 开始前,记得 npm install cheerio 为了能够并发的进行爬取,用到了Promise对象 //接受一个url爬取整个网页,返回一个Promise对象 function getPageAsync(url){ return new Promise(

[PHP] 网盘搜索引擎-采集爬取百度网盘分享文件实现网盘搜索(二)

前情提要:最近使用PHP实现了简单的网盘搜索程序,并且关联了微信公众平台,名字是网盘小说.用户可以通过公众号输入关键字,公众号会返回相应的网盘下载地址.就是这么一个简单的功能,类似很多的网盘搜索类网站,我这个采集和搜索程序都是PHP实现的,全文和分词搜索部分使用到了开源软件xunsearch. 上一篇([PHP] 网盘搜索引擎-采集爬取百度网盘分享文件实现网盘搜索)中我重点介绍了怎样去获取一大批的百度网盘用户,这一篇介绍怎样获得指定网盘用户的分享列表.同样的原理,也是找到百度获取分享列表的接口,

python爬虫实例详细介绍之爬取大众点评的数据

python 爬虫实例详细介绍之爬取大众点评的数据 一. Python作为一种语法简洁.面向对象的解释性语言,其便捷性.容易上手性受到众多程序员的青睐,基于python的包也越来越多,使得python能够帮助我们实现越来越多的功能.本文主要介绍如何利用python进行网站数据的抓取工作.我看到过利用c++和Java进行爬虫的代码,c++的代码很复杂,而且可读性.可理解性较低,不易上手,一般是那些高手用来写着玩加深对c++的理解的,这条路目前对我们不通.Java的可读性还可以,就是代码冗余比较多,

爬取豆瓣网评论最多的书籍

相信很多人都有书荒的时候,想要找到一本合适的书籍确实不容易,所以这次利用刚学习到的知识爬取豆瓣网的各类书籍,传送门https://book.douban.com/tag/?view=cloud. 首先是这个程序的结构,html_downloader是html下载器,html_outputer是导出到Excel表,html_parser是解析页面,make_wordcloud是制作词云,spided_main是程序入口,url_manager是URL管理器 主要实现思路是先请求下载需要的html,

Scrapy爬虫(5)爬取当当网图书畅销榜

??本次将会使用Scrapy来爬取当当网的图书畅销榜,其网页截图如下: ??我们的爬虫将会把每本书的排名,书名,作者,出版社,价格以及评论数爬取出来,并保存为csv格式的文件.项目的具体创建就不再多讲,可以参考上一篇博客,我们只需要修改items.py文件,以及新建一个爬虫文件BookSpider.py. ??items.py文件的代码如下,用来储存每本书的排名,书名,作者,出版社,价格以及评论数. import scrapy class BookspiderItem(scrapy.Item):