站在上帝的角度挖掘数据——Python抓取10W+社科基金项目并可视化分析

目录

动态可视化展示

项目介绍

项目引入

项目资源

代码案例

国家社科基金项目数据库资源挖掘

数据可视化代码合集

项目类别占比分析

项目总结

每文一语


动态可视化展示

看完记得点个赞哟!

国家社科基金项目数据库挖掘与分析

 

项目介绍

项目引入

我们发现在日常的生活中,总是有很多的繁琐的事情,但是又不知道如何去改善和解解压,小王在这里给大家提一个小小的建议:多听听音乐,可能就是不一样的心情啦。生活不只有眼前的苟且,还要有未来的诗和远方。

前期我写一个《Python爬取全网文字并词云分析(全程一键化!)》在文末提到了一个网站,也就是国家社科基金项目数据库,最近又有小伙伴来找我,问我可不可以获取一些数据,进行可视化分析,这样就可以确定研究的相关的方向,之前只是有词云展示,仅仅对标题进行可视化研究。听完她的建议,感觉确实不错,那么要做就要做最好的,我准备把这个数据库里面的全部抓取出来,做宏观的可视化研究,这里只是做一个案例展示,当然你也可以根据你要选择的方向来进行数据分析和可视化,代码是智能的,只需要输入相关的参数即可。

 

 国家社科基金项目数据库可以用来查询,当然是查询了,不过具体的用处我相信需要这个的小伙伴肯定比我要内行,下面我们来看看这个里面的数据吧,数据太多干脆全部爬取下来,要是一页一页的复制,不知道要做到猴年马月,用Python爬取也就20多分钟而已,数据量总共100000条左右。主要维度太多,手动是不可能的,不然怎么说Python是神器了,哈哈哈。

 

项目资源

 

资源数据点击这里下载

代码资源合集点击此处下载

 

代码案例

国家社科基金项目数据库资源挖掘

首先导入需要的第三方库,这里有很多新的知识,比如模拟点击可以制约反爬,请求头的随机产生,延时请求等模板块。


  
  
  1. import requests
  2. from lxml import etree
  3. from fake_useragent import UserAgent
  4. import pandas as pd
  5. from urllib.parse import quote
  6. from selenium import webdriver
  7. from selenium.webdriver.chrome.options import Options
  8. import time

然后通过网络爬虫定位数据标签,这里有点不大合适的就是,因为那个数据库里面是定期更新的,有很多的项目还没有一些固定的值,所有我们在爬取的时候需要做到把没有数据的值,变换为None,也要写入到CSV文件,这样才是正确的数据。

比如我采用此方法定位


  
  
  1. text_1 = html_.xpath( '//div[@class="jc_a"]//tr//td[1]/span')
  2. get_info[ '项目批准号'] = text_1[index].text

做好数据定位了,我们就需要把数据进行存储,这里给代码


  
  
  1. df = pd.DataFrame(get_info_list) # 写入到pd里面,赋给df
  2. if count == 0:
  3. df.to_csv( '{}.csv'.format(title), mode= 'a+', index= False, encoding= 'utf-8')
  4. print( "第1页数据写入!!!") # 写入第一行表头加数据,表头默认
  5. count += 1
  6. get_info_list.clear()
  7. else:
  8. df.to_csv( '{}.csv'.format(title), mode= 'a+', index= False, header= False, encoding= 'utf-8')
  9. a += 1 # 写入后面的其他数据,不写入数据表头,所以为False
  10. print( "第{}页数据写入!!!".format(a))
  11. get_info_list.clear()

需要注意的是,这里的数据量是比较大的,我们不要按照传统的固定模式,把数据存在列表内存里面,然后一下全部写入,虽然也可以,但是我不建议你这样做,按照一次一页数据就写入,这样耗损的资源也较少,代码的优化型也还不错。

主函数


  
  
  1. if __name__ == '__main__':
  2. print( "\t\t\t如果想要使用默认参数输入0即可!")
  3. title = input( "请输入储存数据的路径及名称如桌面:C:\\Users\\48125\\Desktop\\\n")
  4. xmname = input( "请输入项目名称:")
  5. xmtype = input( "请输入项目类别:")
  6. xktpye = input( "请输入学科类别:")
  7. times = input( "请输入立项时间:")
  8. xmtype1 = quote(xmtype, 'utf-8')
  9. xktpye1 = quote(xktpye, 'utf-8')
  10. xmname = quote(xmname, 'utf-8')
  11. url = ( "http://fz.people.com.cn/skygb/sk/index.php/index/seach/?" \
  12. "pznum=&xmtype={}" \
  13. "&xktype={}" \
  14. "&xmname={}&lxtime={}" \
  15. "&xmleader=&zyzw=0&gzdw=&dwtype=0&szdq=0&ssxt=0&cgname=&cgxs=0&cglevel=0&jxdata=0&" \
  16. "jxnum=&cbs=&cbdate=0&zz=&hj=".format(xmtype1, xktpye1, xmname, times))
  17. page = dj(url)
  18. print( "该种类一共有{}页数数据".format(page))
  19. pages = int(input( "请输入你要爬取的页数:"))
  20. Data(title, pages, xmtype, xktpye, xmname, times)

 

还记得之前的文章里面需要我们去浏览器手动点击一下末页,看看有多少也页数,然后输入,这次的程序升级了,采用模拟点击的方法自动获取页数,当然是模拟人操作浏览器点击末页,这样是比较方便的,而且在一些反爬措施,模拟简单也是可选的一个利器,但是各有各的好处与局限性,模拟点击相对于直接请求网页的速度要慢一点,如果是做数据采集的话,就不是最优的选择了,这就需要我们去开启另一扇大门了。

部门代码如下


  
  
  1. chrome_options = Options()
  2. chrome_options.add_argument( '--headless')
  3. driver = webdriver.Chrome(options=chrome_options)
  4. driver.get(url) # 打开网页
  5. # driver.maximize_window() #最大化窗口
  6. time.sleep( 2) # 加载等待

学而不思则罔,思而不学则殆,其他的留给你自己思考哟!

 

数据可视化代码合集

如果说做数据可视化我最先选择的是pyecharts,当然这也要看具体的商业场景,如果有兴趣的小伙伴可以移步到我的Python绘制柱状图之可视化神器pyecharts(一)

数据可视化之美专栏一起探索数据可视化的美感和魅力!

项目类别占比分析


  
  
  1. from pyecharts import options as opts
  2. from pyecharts.charts import Pie
  3. import pymysql
  4. conn = pymysql.connect(
  5. host= 'localhost',
  6. user= 'root',
  7. password= '2211',
  8. database= '科研项目',
  9. port= 3306,
  10. charset= 'utf8'
  11. )
  12. cur = conn.cursor()
  13. sql = "select `项目类别`,COUNT(*) as `数量` from `data` GROUP BY `项目类别` ORDER BY `数量` DESC LIMIT 8;"
  14. cur.execute(sql)
  15. data = cur.fetchall()
  16. x=[]
  17. y=[]
  18. for i in list(data):
  19. if i[ 0]== None:
  20. x.append( "其他")
  21. y.append(i[ 1])
  22. else:
  23. x.append(i[ 0])
  24. y.append(i[ 1])
  25. print(x)
  26. print(y)
  27. c = (
  28. Pie()
  29. .add(
  30. "",
  31. [list(z) for z in zip(x, y)],
  32. center=[ "35%", "50%"],
  33. )
  34. .set_global_opts(
  35. title_opts=opts.TitleOpts(title= "项目类别分析"),
  36. legend_opts=opts.LegendOpts(pos_left= "15%"),
  37. )
  38. .set_series_opts(label_opts=opts.LabelOpts(formatter= "{b}: {c}"))
  39. .render( "项目类别占比分析.html")
  40. )


  
  
  1. import pyecharts.options as opts
  2. from pyecharts.charts import Line
  3. import pymysql
  4. conn = pymysql.connect(
  5. host= 'localhost',
  6. user= 'root',
  7. password= '2211',
  8. database= '科研项目',
  9. port= 3306,
  10. charset= 'utf8'
  11. )
  12. cur = conn.cursor()
  13. sql = "select `立项时间`,COUNT(*) as `数量` from `data` GROUP BY `立项时间` ORDER BY `立项时间`;"
  14. cur.execute(sql)
  15. data = cur.fetchall()
  16. x=[]
  17. y=[]
  18. for i in list(data):
  19. if i[ 0]== None:
  20. print( None)
  21. else:
  22. x.append(i[ 0])
  23. y.append(i[ 1])
  24. print(x)
  25. print(y)
  26. def line_base():
  27. c = (
  28. Line(init_opts=opts.InitOpts(width= "1400px", height= "600px")) # 画布大小
  29. .add_xaxis(x) # 添加x轴
  30. .add_yaxis( '立项时间', y, is_symbol_show= False, color=[ 'green']) # 添加第一个y轴
  31. .set_global_opts(
  32. title_opts=opts.TitleOpts(title= '国家社科基金项目', subtitle= "立项时间追踪"),
  33. # 设置x轴的label字体的走向,由于x轴过多,显示不全,在这调整旋转角度
  34. xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate= 90)),
  35. # 下面这是调整是否可以缩放的
  36. datazoom_opts=opts.DataZoomOpts(is_show= True),
  37. )
  38. )
  39. return c
  40. # 生成html文件, 或者在jupyter 里面直接出图
  41. line_base().render( "立项时间追踪折线图.html")

 

其他的代码我就不做展示了,如果有需要可点击这里下载

直接展示相关可视化图例

 

 

 

项目总结

1.采用智能的参数提示爬取需要的数据信息

2.炫酷可视化之pyecharts

3.模拟点击之selenium

4.Python底层原生态代码设计

5.数据库之MySQL

6.视频动态展示

每文一语

谋大事者必先布大局

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值