目录
动态可视化展示
项目介绍
项目引入
项目资源
代码案例
国家社科基金项目数据库资源挖掘
数据可视化代码合集
项目类别占比分析
项目总结
每文一语
看完记得点个赞哟!
国家社科基金项目数据库挖掘与分析
我们发现在日常的生活中,总是有很多的繁琐的事情,但是又不知道如何去改善和解解压,小王在这里给大家提一个小小的建议:多听听音乐,可能就是不一样的心情啦。生活不只有眼前的苟且,还要有未来的诗和远方。
前期我写一个《Python爬取全网文字并词云分析(全程一键化!)》在文末提到了一个网站,也就是国家社科基金项目数据库,最近又有小伙伴来找我,问我可不可以获取一些数据,进行可视化分析,这样就可以确定研究的相关的方向,之前只是有词云展示,仅仅对标题进行可视化研究。听完她的建议,感觉确实不错,那么要做就要做最好的,我准备把这个数据库里面的全部抓取出来,做宏观的可视化研究,这里只是做一个案例展示,当然你也可以根据你要选择的方向来进行数据分析和可视化,代码是智能的,只需要输入相关的参数即可。
国家社科基金项目数据库可以用来查询,当然是查询了,不过具体的用处我相信需要这个的小伙伴肯定比我要内行,下面我们来看看这个里面的数据吧,数据太多干脆全部爬取下来,要是一页一页的复制,不知道要做到猴年马月,用Python爬取也就20多分钟而已,数据量总共100000条左右。主要维度太多,手动是不可能的,不然怎么说Python是神器了,哈哈哈。
资源数据点击这里下载
代码资源合集点击此处下载
首先导入需要的第三方库,这里有很多新的知识,比如模拟点击可以制约反爬,请求头的随机产生,延时请求等模板块。
import requests
from lxml import etree
from fake_useragent import UserAgent
import pandas as pd
from urllib.parse import quote
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
然后通过网络爬虫定位数据标签,这里有点不大合适的就是,因为那个数据库里面是定期更新的,有很多的项目还没有一些固定的值,所有我们在爬取的时候需要做到把没有数据的值,变换为None,也要写入到CSV文件,这样才是正确的数据。
比如我采用此方法定位
text_1 = html_.xpath('//div[@class="jc_a"]//tr//td[1]/span')
get_info['项目批准号'] = text_1[index].text
做好数据定位了,我们就需要把数据进行存储,这里给代码
df = pd.DataFrame(get_info_list) # 写入到pd里面,赋给df
if count == 0:
df.to_csv('{}.csv'.format(title), mode='a+', index=False, encoding='utf-8')
print("第1页数据写入!!!") # 写入第一行表头加数据,表头默认
count += 1
get_info_list.clear()
else:
df.to_csv('{}.csv'.format(title), mode='a+', index=False, header=False, encoding='utf-8')
a += 1 # 写入后面的其他数据,不写入数据表头,所以为False
print("第{}页数据写入!!!".format(a))
get_info_list.clear()
需要注意的是,这里的数据量是比较大的,我们不要按照传统的固定模式,把数据存在列表内存里面,然后一下全部写入,虽然也可以,但是我不建议你这样做,按照一次一页数据就写入,这样耗损的资源也较少,代码的优化型也还不错。
主函数
if __name__ == '__main__':
print("\t\t\t如果想要使用默认参数输入0即可!")
title = input("请输入储存数据的路径及名称如桌面:C:\\Users\\48125\\Desktop\\\n")
xmname = input("请输入项目名称:")
xmtype = input("请输入项目类别:")
xktpye = input("请输入学科类别:")
times = input("请输入立项时间:")
xmtype1 = quote(xmtype, 'utf-8')
xktpye1 = quote(xktpye, 'utf-8')
xmname = quote(xmname, 'utf-8')
url = ("http://fz.people.com.cn/skygb/sk/index.php/index/seach/?" \
"pznum=&xmtype={}" \
"&xktype={}" \
"&xmname={}&lxtime={}" \
"&xmleader=&zyzw=0&gzdw=&dwtype=0&szdq=0&ssxt=0&cgname=&cgxs=0&cglevel=0&jxdata=0&" \
"jxnum=&cbs=&cbdate=0&zz=&hj=".format(xmtype1, xktpye1, xmname, times))
page = dj(url)
print("该种类一共有{}页数数据".format(page))
pages = int(input("请输入你要爬取的页数:"))
Data(title, pages, xmtype, xktpye, xmname, times)
还记得之前的文章里面需要我们去浏览器手动点击一下末页,看看有多少也页数,然后输入,这次的程序升级了,采用模拟点击的方法自动获取页数,当然是模拟人操作浏览器点击末页,这样是比较方便的,而且在一些反爬措施,模拟简单也是可选的一个利器,但是各有各的好处与局限性,模拟点击相对于直接请求网页的速度要慢一点,如果是做数据采集的话,就不是最优的选择了,这就需要我们去开启另一扇大门了。
部门代码如下
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)
driver.get(url) # 打开网页
# driver.maximize_window() #最大化窗口
time.sleep(2) # 加载等待
学而不思则罔,思而不学则殆,其他的留给你自己思考哟!
如果说做数据可视化我最先选择的是pyecharts,当然这也要看具体的商业场景,如果有兴趣的小伙伴可以移步到我的Python绘制柱状图之可视化神器pyecharts(一)
数据可视化之美专栏一起探索数据可视化的美感和魅力!
from pyecharts import options as opts
from pyecharts.charts import Pie
import pymysql
conn = pymysql.connect(
host='localhost',
user='root',
password='2211',
database='科研项目',
port=3306,
charset='utf8'
)
cur = conn.cursor()
sql = "select `项目类别`,COUNT(*) as `数量` from `data` GROUP BY `项目类别` ORDER BY `数量` DESC LIMIT 8;"
cur.execute(sql)
data = cur.fetchall()
x=[]
y=[]
for i in list(data):
if i[0]==None:
x.append("其他")
y.append(i[1])
else:
x.append(i[0])
y.append(i[1])
print(x)
print(y)
c = (
Pie()
.add(
"",
[list(z) for z in zip(x, y)],
center=["35%", "50%"],
)
.set_global_opts(
title_opts=opts.TitleOpts(title="项目类别分析"),
legend_opts=opts.LegendOpts(pos_left="15%"),
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
.render("项目类别占比分析.html")
)
import pyecharts.options as opts
from pyecharts.charts import Line
import pymysql
conn = pymysql.connect(
host='localhost',
user='root',
password='2211',
database='科研项目',
port=3306,
charset='utf8'
)
cur = conn.cursor()
sql = "select `立项时间`,COUNT(*) as `数量` from `data` GROUP BY `立项时间` ORDER BY `立项时间`;"
cur.execute(sql)
data = cur.fetchall()
x=[]
y=[]
for i in list(data):
if i[0]==None:
print(None)
else:
x.append(i[0])
y.append(i[1])
print(x)
print(y)
def line_base():
c = (
Line(init_opts=opts.InitOpts(width="1400px", height="600px")) # 画布大小
.add_xaxis(x) # 添加x轴
.add_yaxis('立项时间', y, is_symbol_show=False, color=['green']) # 添加第一个y轴
.set_global_opts(
title_opts=opts.TitleOpts(title='国家社科基金项目', subtitle="立项时间追踪"),
# 设置x轴的label字体的走向,由于x轴过多,显示不全,在这调整旋转角度
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=90)),
# 下面这是调整是否可以缩放的
datazoom_opts=opts.DataZoomOpts(is_show=True),
)
)
return c
# 生成html文件, 或者在jupyter 里面直接出图
line_base().render("立项时间追踪折线图.html")
其他的代码我就不做展示了,如果有需要可点击这里下载
直接展示相关可视化图例
1.采用智能的参数提示爬取需要的数据信息
2.炫酷可视化之pyecharts
3.模拟点击之selenium
4.Python底层原生态代码设计
5.数据库之MySQL
6.视频动态展示
谋大事者必先布大局