简单twitter(推特)爬虫和NLTK词频分析(0基础入门)

转载请指明出处

目录

  • 一、项目简介
  • 二、简单介绍
    • 1、TWINT的用法和相关注意点
    • 2、NLTK的简单使用

一、项目简介

本代码是大创期间所作。

当时发现网上资料很少,我深深体会到摸着石头过河是什么感觉,因此现在将其分享出来。

不需要爬虫基础,语法简单

所用到的工具

  • TWINT用于twitter爬虫

    相比twitter官网提供的爬虫API,它有如下优点:

    • 免身份认证,开箱即用
    • 没有七天限制(只能爬七天内的tweet)
    • 结果自动存储,格式化简单
  • NLTK用于自然语言处理

  • PyMySQL 用于操作数据库

  • 其他:代理服务器(仅限中国大陆需要)

本项目地址:Twitter-spider(全代码注释,保证一看就懂,希望能点个star)

二、简单介绍

1、TWINT的用法和相关注意点

官网最简单的示例:

import twint# 配置
c = twint.Config()
# 要爬取的用户
c.Username = "realDonaldTrump"
# 关键词
c.Search = "great"# 启动
twint.run.Search(c)

只要简单的配置,就能够自动化爬取,完全不需要人工干预。

相关的配置参数请看官方文档

如果只是简单的想爬取含有关键词的所有tweet,可参考本项目用到的配置

# 爬虫主体
def spider(keyword, tweets):# 启动配置c = twint.Config()c.Search = keyword# 限制爬取条数c.Limit = Limit# 开启计数c.Count = True# 过滤含连接的tweet# c.Links = "exclude"# 只爬取热门tweet# c.Popular_tweets = True# 过滤转发c.Filter_retweets = True# 统一翻译为英语,不然后面分词时鱼龙混杂# 翻译相关参数详见官网c.Lang = "en"# 爬取时间段(示例:"2020-01-01 00:00:00")c.Since = Sincec.Until = Until# c.Year = "2020"# 开启存储(可保存在文件、数组等)c.Store_object = Truec.Store_object_tweets_list = tweets# 隐藏控制台输出c.Hide_output = True# 代理c.Proxy_host = '127.0.0.1'c.Proxy_port = 7890c.Proxy_type = "socks5"# 运行twint.run.Search(c)

其中要注意的是,爬取时间段中Since和Until都需要精确到秒(示例:“2020-01-01 00:00:00”),而不像官方介绍的那样,只需要精确到日期就可以(示例:“2020-01-01”),这个地方我也不清楚什么原因

其他部分,如文件存储、数据库存储等细节就不再赘述,源代码都有。

2、NLTK的简单使用

本项目还采用NLTK自然语言处理工具来将结果进行简单的词频统计

首先要先安装相关的语料库

import nltk
nltk.download()

在弹出的窗口中,选择所需要的语料库下载即可(本人是全部下载)

语料库可以下载到该项目的虚拟环境中

本项目处理步骤如下

  1. 句子分词
  2. 结果清洗(去掉无用单词、标点等干扰项)
  3. 词性标注
  4. 词性还原
  5. 词频分析

本项目相关的函数简单介绍(详情可看官方介绍)

  • word_tokenize(可将句子中的单词和标点划分出来)

    # 网络例子
    import nltk
    sentence = “hello, world"
    tokens = nltk.word_tokenize(sentence)
    结果:tokens = ['hello',',','world']
    

    因为分词后结果含有标点等单词干扰项,因此可以通过函数和停用词来过滤结果

    NLTK中自带停用词列表,它含有一些简单的单词,通常是我们不需要使用到的(例如:he、the等)

    # 项目例子
    # 过滤标点、表情和其他语言,并转换成小写,再过滤停用词
    def filter(word_tokens):stop_words = stopwords.words('english')filter_words = []for word in word_tokens:# 如果不用UTF-8,可能会把中文或日文误判为英文# 由于爬虫开启了翻译,即使不加也不会出现大问题if len(word) >= 3 and word.encode('UTF-8').isalpha():# 要先转换成小写,不然过滤不掉停用词word = word.lower()if word not in stop_words:filter_words.append(word)return filter_words
    
  • pos_tag(可将单词的词性标注出来)

    当有了词性,后面才能更准确地进行词性还原(例如:going词性为动词,因此还原成go)

    # 网络例子
    text = nltk.word_tokenize('what does the fox say')
    nltk.pos_tag(text)
    结果:[('what','WDT'),('does','VBZ'),('the','DT'),('fox','NNS'),('say','VBP')]
    

    其中,相关词性的含义(如WDT、VBZ等),可见官方说明

  • 词性还原(要先获取词性标记的结果,根据结果进行还原)

    # 项目例子
    # 获取单词的词性
    def get_pos(tag):if tag.startswith('J'):return wordnet.ADJelif tag.startswith('V'):return wordnet.VERBelif tag.startswith('N'):return wordnet.NOUNelif tag.startswith('R'):return wordnet.ADVelse:return None# 词性还原
    def reduce(tag_words):# 如果不指定词性(如动词、名词),还原效果变差wnl = WordNetLemmatizer()# real_words = [wnl.lemmatize(word, pos='n') for word in filter_words]real_words = []for tag in tag_words:# 先获取词性,再还原(有些词还原后长度会变短)pos = get_pos(tag[1]) or wordnet.NOUNword = wnl.lemmatize(tag[0], pos=pos)if len(word) >= 3:real_words.append(word)print(real_words)return real_words
    
  • FreqDist(词频统计)

    # 项目例子
    # 词频分析(real_words为词性还原的结果)
    freq_words = FreqDist(real_words)
    # 输出排名前五十的单词
    print(freq_words.most_common(50))
    

希望大家能对我多多支持!

Published by

风君子

独自遨游何稽首 揭天掀地慰生平