#1.爬數(shù)據(jù)
fromosimportwrite
importrequests#獲取網(wǎng)頁源碼:
importurllib.request
frombs4importBeautifulSoup#用來解析解析HTML文檔
importtime
#2.數(shù)據(jù)預(yù)處理
importjieba#分詞、去停用詞等
#3.文本特征工程(向量化)
fromsklearn.feature_extraction.textimportCountVectorizer
fromsklearn.feature_extraction.textimportTfidfTransformer
importpandasaspd
importnumpyasnp
#1.爬數(shù)據(jù)
print("***n***n***n這是一個爬蟲,正在爬取百度貼吧的一個內(nèi)容,請耐心等候:。。。")
#設(shè)置保存數(shù)據(jù)的文件
f=open(r'C:UsersDELLDesktop大數(shù)據(jù)大數(shù)據(jù)實驗.txt','a+',encoding='utf-8')#打開文件,a+表示在文件末尾追加
end_time=time.strftime('%Y-%m-%d%H:%M:%S',time.localtime(time.time()))#當(dāng)前的時間
#f.write("【時間:"+end_time+"】n【標(biāo)題】阿巴阿巴"+'n')
#獲取網(wǎng)頁源碼:(得到解析HTML文檔)(請在聯(lián)網(wǎng)情況下進(jìn)行)
#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("狀態(tài)碼:",r.status_code,"若顯示2xx表示連接成功,可繼續(xù)下一步")#若打印2xx表示連接成功,可繼續(xù)下一步
print("網(wǎng)頁編碼方式:",r.apparent_encoding)
html=urllib.request.urlopen(url).read()#得到html文本
#print(html)
#解析HTML文檔
soup=BeautifulSoup(html,"html.parser")#soup=BeautifulSoup(html,"lxml"),是lxml的問題,在報錯代碼中把函數(shù)參數(shù)中所有的"lxml"改成"html.parser"
print(soup.prettify())#.prettify()打印格式,就是將soup中的'n'變?yōu)閾Q行
print("------------------------------------------------------------------------------")
#從網(wǎng)頁中提取想要的數(shù)據(jù)所在的節(jié)點
all=soup.find_all("a",class_="j_th_tit")#查找標(biāo)簽中的class_="j_th_tit",find_all返回數(shù)組
#print(all)
print("------------------------------------------------------------------------------")
ALL=str(all).split('</a>')#字符串化,去掉了</a>
ALL.pop()
print(ALL)
print('--------------------------------------------------------------------------------------------------------------')
L=[]
forsinALL:
L.append(s.split('title="')[1])#split()返回的是一個數(shù)組,L.append()添加的是title后面的東西
print(L)
i=0
forsinL:
q,w=s.split('">',1)#q='>'前面的字符串,w='>'后面的字符串,逗號后面1表示分割一次
#i+=1
#f.write('【標(biāo)題'+str(i)+'】:'+q+'n')
f.write(q+'n')
f.close()
#在這一步,我們在文件保存了我們爬到的數(shù)據(jù),,放在了'C:UsersDELLDesktop大數(shù)據(jù)大數(shù)據(jù)實驗.txt'
#2.去停用詞、名詞等(文本預(yù)處理)步驟:處理---》讀文件-》處理-》寫入文件
#(1)去除非中文字符,將處理后的文檔寫入大數(shù)據(jù)實驗文本數(shù)據(jù)0
f=open(r'C:UsersDELLDesktop大數(shù)據(jù)大數(shù)據(jù)實驗.txt','r',encoding='utf-8',errors='ignore')#將文本格式編碼為utf-8,防止編碼錯誤
fw=open(r'C:UsersDELLDesktop大數(shù)據(jù)大數(shù)據(jù)實驗文本數(shù)據(jù)0.txt','w',encoding='utf-8',errors='ignore')
forlineinf:#逐行處理
constr=''#記錄每行處理后的數(shù)據(jù)
forucharinline:
ifuchar>=u'u4e00'anduchar<=u'u9fa5':#是中文字符
ifuchar!='':#去除空格
constr+=uchar
fw.write(constr+'n')#寫入處理后的數(shù)據(jù),每行以空格隔開
f.close()
fw.close()#不要忘記
#2.去停用詞、名詞等(文本預(yù)處理)步驟:處理---》讀文件-》處理-》寫入文件
#(1)去除非中文字符,將處理后的文檔寫入大數(shù)據(jù)實驗文本數(shù)據(jù)0
f=open(r'C:UsersDELLDesktop大數(shù)據(jù)1疾風(fēng)劍豪吧.txt','r',encoding='utf-8',errors='ignore')#將文本格式編碼為utf-8,防止編碼錯誤
fw=open(r'C:UsersDELLDesktop大數(shù)據(jù)1大數(shù)據(jù)實驗文本數(shù)據(jù)0.txt','w',encoding='utf-8',errors='ignore')
forlineinf:#逐行處理
constr=''#記錄每行處理后的數(shù)據(jù)
forucharinline:
ifuchar>=u'u4e00'anduchar<=u'u9fa5':#是中文字符
ifuchar!='':#去除空格
constr+=uchar
fw.write(constr+'n')#寫入處理后的數(shù)據(jù),每行以空格隔開
f.close()
fw.close()#不要忘記
#準(zhǔn)備去停用詞
#(2)-------------------創(chuàng)建放停用詞的數(shù)組stopwords[]
stopwords=[]
stopwords=[]#注意,去停用詞表中的標(biāo)點符號應(yīng)該用行隔開,不能用空格隔開,否則forwordinopen會將它看為一個字符串,數(shù)組中只有一個元組
forwordinopen(r"C:UsersDELLDesktop大數(shù)據(jù)1去停用詞表.txt","r",encoding='utf-8'):#這里讓我把去"停用詞表.txt"另存為是編碼方式改為wtf-8才不報錯
stopwords.append(word.strip())
#-------------------創(chuàng)建結(jié)束-------------------------------------
#去停用詞(3)
jieba.load_userdict(r'C:UsersDELLDesktop大數(shù)據(jù)1詞典.txt')#添加詞典
print('-----------------------------去停用詞然后將去停用詞后的字符串存到大數(shù)據(jù)實驗文本數(shù)據(jù).txt----------------------------------------------------')
f2=open(r'C:UsersDELLDesktop大數(shù)據(jù)1大數(shù)據(jù)實驗文本數(shù)據(jù)0.txt','r+',encoding='utf-8')#r+:表示用于讀寫
f1=open(r'C:UsersDELLDesktop大數(shù)據(jù)1大數(shù)據(jù)實驗文本數(shù)據(jù).txt','a',encoding='utf-8')#a:表示用于追加
L=f2.readlines()#f.readlines()返回一個數(shù)組,一行為一個元素
forl1inL:#每一行進(jìn)行分詞->取停用詞->寫入大數(shù)據(jù)實驗文本數(shù)據(jù).txt
a=""
seg_lists=jieba.cut(l1,cut_all=True)#全模式,jieba.cut()返回一個可迭代的generator
forseg_listinseg_lists:#一個for循環(huán),每一行的seg_list->a
#print(seg_list)
ifseg_list.encode("utf-8")notinstopwords:
a+=seg_list+''
f1.write(a)#寫入大數(shù)據(jù)實驗文本數(shù)據(jù).txt
f2.close()
f1.close()
#3.文本特征工程(統(tǒng)計每個詞出先的頻率)
#(1)(完成詞頻向量化)
#打開要向量化的文件
vectorizer_向量化=CountVectorizer()
f2=open(r'C:UsersDELLDesktop大數(shù)據(jù)1大數(shù)據(jù)實驗文本數(shù)據(jù).txt','r+',encoding='utf-8')
corpus=f2.readlines()#L2是一個數(shù)組