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

目录

动态可视化展示

项目介绍

项目引入

项目资源

代码案例

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

数据可视化代码合集

项目类别占比分析

项目总结

每文一语


动态可视化展示

看完记得点个赞哟!

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

 

项目介绍

项目引入

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

前期我写一个《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.视频动态展示

每文一语

谋大事者必先布大局

  • 35
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 48
    评论
评论 48
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王小王-123

您觉得舒心就点一点吧~~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值