📜  使用Python抓取 Google Ngram Viewer(1)

📅  最后修改于: 2023-12-03 14:49:50.474000             🧑  作者: Mango

使用Python抓取Google Ngram Viewer

Google Ngram Viewer是一项由Google提供的免费服务,旨在帮助用户分析图书和其他出版物的词汇使用率。它利用了Google Books的数据,其中包含了从200年前至今的数百万本书籍。

在本文中,我们将教您如何使用Python抓取和处理Google Ngram数据。

环境设置

首先,我们需要安装一些必要的库。在命令行中运行以下命令:

pip install pandas matplotlib requests beautifulsoup4

这将安装pandas,matplotlib,requests和beautifulsoup4模块。

创建脚本
导入模块

我们需要首先导入我们刚刚安装的模块。请在脚本的顶部添加以下代码:

import pandas as pd
import matplotlib.pyplot as plt
import requests
from bs4 import BeautifulSoup
构造网址

接下来,我们需要构造Google Ngram Viewer的URL。我们需要告诉网站我们要搜索的单词、起始年份和结束年份。这些参数可以在URL中设置。以下是基本URL:

https://books.google.com/ngrams/graph?content={}&year_start={}&year_end={}&corpus=26&smoothing=3

我们需要替换花括号内的参数。例如,要搜索“Python”这个单词,搜索开始年份为1900年,结束年份为2008年,URL如下:

https://books.google.com/ngrams/graph?content=Python&year_start=1900&year_end=2008&corpus=26&smoothing=3
抓取数据

我们可以使用requests发送GET请求来抓取数据。以下是一个简单的函数,用于抓取数据:

def get_data(word, start_year, end_year):
    url = 'https://books.google.com/ngrams/graph?content={}&year_start={}&year_end={}&corpus=26&smoothing=3'.format(word, start_year, end_year)
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')
    script_tag = soup.find('script')
    data = script_tag.string.strip().replace('\n', '').replace('\t', '')
    data = data[data.find('var data = ') + len('var data = '):data.find(';\n  var chart')]
    data = eval(data)
    return data

这个函数使用BeautifulSoup在Google Ngram Viewer页面中定位和提取数据。

处理数据

我们需要处理从网站抓取的数据。以下是一个可以转换为pandas数据帧的简单函数,我们稍后会用到它:

def process_data(data):
    years = range(data[0][0], data[0][-1] + 1)
    df = pd.DataFrame(index=years, columns=['year'])
    
    for i in range(len(data)):
        if data[i][0] in years:
            df.loc[data[i][0], 'year'] = data[i][0]
            for j in range(1, len(data[i])):
                df.loc[data[0][j], data[i][0]] = data[i][j]

    df = df.interpolate(limit_direction='both')
    df.fillna(0, inplace=True)
    df.set_index('year', inplace=True)
    return df

这将使用pandas创建一个数据帧,其中每行包含年份和单词使用率。

绘制图表

最后,我们可以使用matplotlib绘制数据的图表。以下是一个简单的函数,用于绘制柱形图:

def plot(dataframe):
    dataframe.plot(kind='bar', figsize=(20, 10), width=0.8, legend=False)
    plt.title('Word Usage Over Time')
    plt.xlabel('Year')
    plt.ylabel('Usage')
    plt.show()
完整脚本

现在,让我们将所有内容组合到一起。以下是一个完整的脚本,可以输入单词、起始年份和结束年份,并输出柱形图。

import pandas as pd
import matplotlib.pyplot as plt
import requests
from bs4 import BeautifulSoup

def get_data(word, start_year, end_year):
    url = 'https://books.google.com/ngrams/graph?content={}&year_start={}&year_end={}&corpus=26&smoothing=3'.format(word, start_year, end_year)
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')
    script_tag = soup.find('script')
    data = script_tag.string.strip().replace('\n', '').replace('\t', '')
    data = data[data.find('var data = ') + len('var data = '):data.find(';\n  var chart')]
    data = eval(data)
    return data

def process_data(data):
    years = range(data[0][0], data[0][-1] + 1)
    df = pd.DataFrame(index=years, columns=['year'])
    
    for i in range(len(data)):
        if data[i][0] in years:
            df.loc[data[i][0], 'year'] = data[i][0]
            for j in range(1, len(data[i])):
                df.loc[data[0][j], data[i][0]] = data[i][j]

    df = df.interpolate(limit_direction='both')
    df.fillna(0, inplace=True)
    df.set_index('year', inplace=True)
    return df

def plot(dataframe):
    dataframe.plot(kind='bar', figsize=(20, 10), width=0.8, legend=False)
    plt.title('Word Usage Over Time')
    plt.xlabel('Year')
    plt.ylabel('Usage')
    plt.show()

if __name__ == '__main__':
    word = input('Enter a word: ')
    start_year = int(input('Enter start year: '))
    end_year = int(input('Enter end year: '))
    data = get_data(word, start_year, end_year)
    df = process_data(data)
    plot(df)

现在,您可以使用Python抓取Google Ngram Viewer数据并创建交互式图表。