目录
动态可视化展示
看完记得点个赞哟!
国家社科基金项目数据库挖掘与分析
项目介绍
项目引入
我们发现在日常的生活中,总是有很多的繁琐的事情,但是又不知道如何去改善和解解压,小王在这里给大家提一个小小的建议:多听听音乐,可能就是不一样的心情啦。生活不只有眼前的苟且,还要有未来的诗和远方。
前期我写一个《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.视频动态展示
每文一语
谋大事者必先布大局