#1.爬数据
from os import write
import requests #获取网页源码:
import urllib.request
from bs4 import BeautifulSoup #用来解析解析 HTML 文档
import time
#2.数据预处理
import jieba #分词、去停用词等
#3.文本特征工程(向量化)
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
import pandas as pd
import numpy as np
#1.爬数据
print("***\n***\n***\n这是一个爬虫,正在爬取百度贴吧的一个内容,请耐心等候:。。。")
#设置保存数据的文件
f = open(r'C:\Users\DELL\Desktop\大数据\大数据实验.txt','a+',encoding='utf-8') #打开文件,a+表示在文件末尾追加
end_time=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))#当前的时间
#f.write("【时间:"+end_time+"】\n【标题】阿巴阿巴"+'\n')
#获取网页源码:(得到解析 HTML 文档)(请在联网情况下进行)
#url="https://tieba.baidu.com/f?ie=utf-8&kw=%E7%89%A9%E7%90%86"
url = "https://tieba.baidu.com/f?kw=%E7%9D%A1%E8%A7%89&fr=fenter&prequery=%E7%9D%A1%E8%A7%89%E9%81%87%E5%88%B0%E9%9A%9C%E7%A2%8D"
r= requests.get(url)
print("状态码:",r.status_code,"若显示 2xx 表示连接成功,可继续下一步") #若打印 2xx 表示连接成功,可继续下一步
print("网页编码方式:",r.apparent_encoding)
html=urllib.request.urlopen(url).read() #得到html文本
#print(html)
#解析 HTML 文档
soup = BeautifulSoup(html,"html.parser") #soup = BeautifulSoup(html,"lxml") ,是lxml的问题, 在报错代码中把函数参数中所有的"lxml"改成"html.parser"
print(soup.prettify()) #.prettify()打印格式,就是将soup中的'\n'变为换行
print("------------------------------------------------------------------------------")
#从网页中提取想要的数据所在的节点
all = soup.find_all("a",class_="j_th_tit")#查找标签中的class_="j_th_tit",find_all返回数组
#print(all)
print("------------------------------------------------------------------------------")
ALL=str(all).split('</a>') #字符串化,去掉了</a>
ALL.pop()
print(ALL)
print('--------------------------------------------------------------------------------------------------------------')
L=[]
for s in ALL:
L.append(s.split('title="')[1]) #split() 返回的是一个数组, L.append()添加的是title后面的东西
print(L)
i=0
for s in L:
q,w = s.split('">',1) #q='>'前面的字符串,w = '>'后面的字符串,逗号后面1表示分割一次
#i+=1
#f.write('【标题'+str(i)+'】:'+ q +'\n')
f.write(q+'\n')
f.close()
#在这一步,我们在文件保存了我们爬到的数据 ,,放在了'C:\Users\DELL\Desktop\大数据\大数据实验.txt'
#2.去停用词 、名词等(文本预处理) 步骤:处理---》读文件-》处理 -》写入文件
#(1)去除非中文字符 ,将处理后的文档写入大数据实验文本数据0
f = open(r'C:\Users\DELL\Desktop\大数据\大数据实验.txt', 'r', encoding= 'utf-8', errors= 'ignore') #将文本格式编码为utf-8,防止编码错误
fw = open(r'C:\Users\DELL\Desktop\大数据\大数据实验文本数据0.txt','w', encoding='utf-8',errors= 'ignore')
for line in f: #逐行处理
constr = '' #记录每行处理后的数据
for uchar in line:
if uchar >= u'\u4e00' and uchar <= u'\u9fa5': #是中文字符
if uchar != ' ': #去除空格
constr += uchar
fw.write(constr+'\n') #写入处理后的数据,每行以空格隔开
f.close()
fw.close() #不要忘记
#2.去停用词 、名词等(文本预处理) 步骤:处理---》读文件-》处理 -》写入文件
#(1)去除非中文字符 ,将处理后的文档写入大数据实验文本数据0
f = open(r'C:\Users\DELL\Desktop\大数据1\疾风剑豪吧.txt', 'r', encoding= 'utf-8', errors= 'ignore') #将文本格式编码为utf-8,防止编码错误
fw = open(r'C:\Users\DELL\Desktop\大数据1\大数据实验文本数据0.txt','w', encoding='utf-8',errors= 'ignore')
for line in f: #逐行处理
constr = '' #记录每行处理后的数据
for uchar in line:
if uchar >= u'\u4e00' and uchar <= u'\u9fa5': #是中文字符
if uchar != ' ': #去除空格
constr += uchar
fw.write(constr+'\n') #写入处理后的数据,每行以空格隔开
f.close()
fw.close() #不要忘记
#准备去停用词
#(2)-------------------创建放 停用词的 数组stopwords[]
stopwords = []
stopwords = [] #注意,去停用词表中的 标点符号 应该用 行隔开 ,不能用 空格隔开,否则for word in open会将它看为一个字符串,数组中只有一个元组
for word in open(r"C:\Users\DELL\Desktop\大数据1\去停用词表.txt", "r",encoding='utf-8'): #这里让我把去 "停用词表.txt"另存为是编码方式改为wtf-8才不报错
stopwords.append(word.strip())
#-------------------创建结束-------------------------------------
#去停用词(3)
jieba.load_userdict(r'C:\Users\DELL\Desktop\大数据1\词典.txt') # 添加词典
print('-----------------------------去停用词 然后将去停用词后的字符串 存到大数据实验文本数据.txt ----------------------------------------------------')
f2 = open(r'C:\Users\DELL\Desktop\大数据1\大数据实验文本数据0.txt','r+',encoding='utf-8') #r+:表示用于读写
f1 = open(r'C:\Users\DELL\Desktop\大数据1\大数据实验文本数据.txt','a',encoding='utf-8') #a:表示用于追加
L=f2.readlines() #f.readlines()返回一个数组,一行为一个元素
for l1 in L: #每一行进行分词->取停用词->写入大数据实验文本数据.txt
a = ""
seg_lists = jieba.cut(l1,cut_all =True)#全模式,jieba.cut()返回一个可迭代的generator
for seg_list in seg_lists: #一个for循环,每一行的seg_list->a
#print(seg_list)
if seg_list.encode("utf-8") not in stopwords:
a+=seg_list+' '
f1.write(a) #写入大数据实验文本数据.txt
f2.close()
f1.close()
#3.文本 特征工程(统计每个词出先的频率)
# (1)(完成词频向量化)
#打开要向量化的文件
vectorizer_向量化 = CountVectorizer()
f2 = open(r'C:\Users\DELL\Desktop\大数据1\大数据实验文本数据.txt','r+',encoding='utf-8')
corpus = f2.readlines() #L2是一个数组
f2.close
print(corpus)
#向量化
X = vectorizer_向量化.fit_transform(corpus) #并返回文本矩阵
feature_name = vectorizer_向量化.get_feature_names()
print(X)
print(feature_name)
print(vectorizer_向量化.vocabulary_) #词汇表;字典型
transformer_TFIDF预处理 = TfidfTransformer()
tfidf = transformer_TFIDF预处理.fit_transform(X)
print(tfidf)
#tf-idf,
vectorizer=CountVectorizer() #该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
transformer=TfidfTransformer() #该类会统计每个词语的tf-idf权值
X=vectorizer.fit_transform(corpus) #将文本转为词频矩阵
print(X.toarray())
tfidf=transformer.fit_transform(X) #计算tf-idf,
word=vectorizer.get_feature_names() #获取词袋模型中的所有词语
weight=tfidf.toarray() #将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
# for i in range(len(weight)): #打印每类文本的tf-idf词语权重
# print("-------这里输出第",i,u"类文本的词语tf-idf权重------" )
# #for j in range(len(word)):
# print(list(zip(word,weight[i])))
# #根据语料库统计idf(每个词语的逆文档频率),并存持久化存储到文件中,以便下次输入一篇文档即可返回相应关键词
fw1 = open(r'C:\Users\DELL\Desktop\大数据1\大数据实验_周天立.txt','w', encoding='utf-8',errors= 'ignore')
n = 5# 前五位
i=1
m=1
for (title, w) in zip(word, weight):
# 排序
loc = np.argsort(-w)
print()
m=m+1
b = ""
b=b+ ""+'第'+str(m-1)+'句关键字如下:'+'\n'
fw1.write(b)
for i in range(n):
if(w[loc[i]]>0.4):
print(u'-{}: {} {}'.format(str(i + 1), word[loc[i]], w[loc[i]]))
a = ""
a= a+'-'+str(i + 1)+str(word[loc[i]])+' '+str(w[loc[i]])+'\t'
fw1.write(a)
fw1.write('\n')
print('\n')
fw.close() #不要忘记