转载请指明出处
目录
- 一、项目简介
- 二、简单介绍
-
- 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()
在弹出的窗口中,选择所需要的语料库下载即可(本人是全部下载)
语料库可以下载到该项目的虚拟环境中
本项目处理步骤如下:
- 句子分词
- 结果清洗(去掉无用单词、标点等干扰项)
- 词性标注
- 词性还原
- 词频分析
本项目相关的函数简单介绍(详情可看官方介绍):
-
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))
希望大家能对我多多支持!