数据分析-(学术前沿趋势分析)-task1

数据分析-(学术前沿趋势分析)-task1

分析

统计2019年以后,计算机,各方向,论文数量;并可视化展示。

知识点

  1. 拿到数据集,先看下大小、特征量;
  2. 用pandas看下数据结构(展示前几行,有个大致轮廓)
  3. 按目标处理数据,目标要选特征,组合处理
  4. 可视化(matplotlib.pie 图)

个人需要补充的点

  1. 正则化不熟练

    1. 学习:https://www.runoob.com/python3/python3-reg-expressions.html
    2. 在线正则表达式测试的⽹网站:https://tool.oschina.net/regex/
    3. re.sub(pattern, repl, string, count=0, flags=0)
      pattern : 正则中的模式字符串串。
      repl : 替换的字符串,也可为一个函数。
      string : 要被查找替换的原始字符串。
      count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
      flags : 编译时用的匹配模式,数字形式。
      其中pattern、repl、string为必选参数
      正则中的模式字符串串 pattern 的格式为 “任意字符” + “(” + “任意字符” + “)”。
      替换的字符串串 repl 为第2个分组的内容。
      要被查找替换的原始字符串串 string 为原始的爬取的数据。
  2. pandas转数据不熟练

    • https://zhuanlan.zhihu.com/p/99889912
    • https://www.zhihu.com/question/56310477/answer/873227129
  3. matplotlib不熟悉

    • https://mp.weixin.qq.com/s/boiNbVSO5vq-qP7LWKIQgw

Q&A

  1. 连接问题

requests.exceptions.ConnectionError: (‘Connection aborted.’, ConnectionAbortedError(10053, ‘你的主机中的软件中止了一个已建立的连接。’, None, 10053, None))
只有所有的响应体数据被读取完毕连接才会被释放为连接池;所以确保将 stream 设置为 False 或读取 Response 对象的 content 属性。除非stream=False或者response.content /response.text被操作,不然该请求不会被释放。同其他的自动管理内存的语言一样,不论垃圾回收还是引用计数,都存在一个问题就是内存释放比较缓慢,于是在代码中手动关闭了连接。
增加

        requests.adapters.DEFAULT_RETRIES = 5
        s = requests.session()
        # 设置连接活跃状态为False
        s.keep_alive = False
        response = requests.post(url, data=data, headers=headers,stream=False,timeout= 10)
        # 关闭请求  释放内存
        response.close()
  1. BeautifulSoup使用问题

BeautifulSoup(html,‘lxml’)出错
pip install lxml
改为soup = BeautifulSoup(website_url,‘html.parser’)未解决,疑问!

code

# 论文数量统计(数据统计任务),统计2019年全年,计算机各个方向论文数量;

import json
import pandas as pd
import requests
from bs4 import BeautifulSoup
import re
import matplotlib.pyplot as plt
import seaborn as sns

# 1.read data
data = []
"arxiv-metadata-oai-snapshot"
with open("arxiv-metadata-oai-2019.json", 'r')as f:
    for line in f:
        data.append(json.loads(line))

data = pd.DataFrame(data)
# print(data.shape)
# print(data.head())
# print('111')
#
# 2.prepare
cate = data["categories"].describe()
# '''
# count:一列数据的元素个数;
# unique:一列数据中元素的种类;
# top:一列数据中出现频率最高的元素;
# freq:一列数据中出现频率最高的元素的个数;
# '''
# print(cate)
# print('----------')
unique_categories = set([i for l in [x.split(' ') for x in data["categories"]] for i in l])
# print(len(unique_categories))


# 3.处理时间特征,找2019年以后的paper,时间格式转换为DataFrame格式
data["year"] = pd.to_datetime(data["update_date"]).dt.year
del data["update_date"]
data = data[data["year"] >= 2019]
data.groupby(['categories', 'year'])
# #以 categories 进行排序,如果同一个categories 相同则使用 year 特征进行排序
data.reset_index(drop=True, inplace=True)
# print(data)

# 4.所有2019年以后的论文,选择计算机领域内文章:
website_url = requests.get('https://arxiv.org/category_taxonomy').text
# 从HTML或XML文件中提取数据的Python库
soup = BeautifulSoup(website_url, 'lxml')
root = soup.find('div', {
     'id': 'category_taxonomy_list'})
tags = root.find_all(["h2", "h3", "h4", "p"], recursive=True)

# 初始化 str 和 list 变量
level_1_name = ""
level_2_name = ""
level_2_code = ""
level_1_names = []
level_2_codes = []
level_2_names = []
level_3_codes = []
level_3_names = []
level_3_notes = []

# 进行
for t in tags:
    if t.name == "h2":
        level_1_name = t.text
        level_2_code = t.text
        level_2_name = t.text
    elif t.name == "h3":
        raw = t.text
        level_2_code = re.sub(r"(.*)\((.*)\)", r"\2", raw)  # 正则表达式:模式字符串:(.*)\((.*)\);被替换字符串"\2";被处理字符串:raw
        level_2_name = re.sub(r"(.*)\((.*)\)", r"\1", raw)
    elif t.name == "h4":
        raw = t.text
        level_3_code = re.sub(r"(.*) \((.*)\)", r"\1", raw)
        level_3_name = re.sub(r"(.*) \((.*)\)", r"\2", raw)
    elif t.name == "p":
        notes = t.text
        level_1_names.append(level_1_name)
        level_2_names.append(level_2_name)
        level_2_codes.append(level_2_code)
        level_3_names.append(level_3_name)
        level_3_codes.append(level_3_code)
        level_3_notes.append(notes)

# 根据以上信息生成dataframe格式的数据
df_taxonomy = pd.DataFrame({
     
    'group_name': level_1_names,
    'archive_name': level_2_names,
    'archive_id': level_2_codes,
    'category_name': level_3_names,
    'categories': level_3_codes,
    'category_description': level_3_notes

})

# 按照 "group_name" 进行分组,在组内使用 "archive_name" 进行排序
df_taxonomy.groupby(["group_name", "archive_name"])
# print(df_taxonomy)
# print('----')

# 5.分析可视化

_df = data.merge(df_taxonomy, on="categories", how="left").drop_duplicates(["id", "group_name"]).groupby(
    "group_name").agg({
     "id": "count"}).sort_values(by="id", ascending=False).reset_index()
# print(_df)
# print('=====')

fig = plt.figure(figsize=(15, 12))
explode = (0, 0, 0, 0.2, 0.3, 0.3, 0.2, 0.1)
plt.pie(_df["id"], labels=_df["group_name"], autopct='%1.2f%%', startangle=160, explode=explode)
plt.tight_layout()
plt.show()

group_name = "Computer Science"
cats = data.merge(df_taxonomy, on="categories").query("group_name == @group_name")
cats.groupby(["year", "category_name"]).count().reset_index().pivot(index="category_name", columns="year", values="id")

你可能感兴趣的:(爬虫,python,数据分析)