导航

大数据分析作业

Posted on 2021-07-19 18:28  深蓝的大树  阅读(189)  评论(0编辑  收藏  举报
 
#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()   #不要忘记