做業要求來自於:html
一.把爬取的內容保存取MySQL數據庫mysql
import pandas as pdsql
import pymysql數據庫
from sqlalchemy import create_engine瀏覽器
conInfo = "mysql+pymysql://user:passwd@host:port/gzccnews?charset=utf8"app
engine = create_engine(conInfo,encoding='utf-8')運維
df = pd.DataFrame(allnews)dom
df.to_sql(name = 'news', con = engine, if_exists = 'append', index = False)大數據
二.爬蟲綜合大做業網站
選擇一個熱點或者你感興趣的主題。
選擇爬取的對象與範圍。
瞭解爬取對象的限制與約束。
爬取相應內容。
作數據分析與文本分析。
造成一篇文章,有說明、技術要點、有數據、有數據分析圖形化展現與說明、文本分析圖形化展現與說明。
文章公開發布。
三.爬蟲注意事項
1.設置合理的爬取間隔,不會給對方運維人員形成壓力,也能夠防止程序被迫停止。
import time
import random
time.sleep(random.random()*3)
2.設置合理的user-agent,模擬成真實的瀏覽器去提取內容。
首先打開你的瀏覽器輸入:about:version。
用戶代理:
收集一些比較經常使用的瀏覽器的user-agent放到列表裏面。
而後import random,使用隨機獲取一個user-agent
定義請求頭字典headers={'User-Agen':}
發送request.get時,帶上自定義了User-Agen的headers
3.須要登陸
發送request.get時,帶上自定義了Cookie的headers
headers={'User-Agen':
'Cookie': }
4.使用代理IP
經過更換IP來達到不斷高 效爬取數據的目的。
headers = {
"User-Agent": "",
}
proxies = {
"http": " ",
"https": " ",
}
response = requests.get(url, headers=headers, proxies=proxies)
正文:
1、爬取的網站:中國傳媒大學南廣學院
爬取範圍:中國傳媒大學南廣學院的新聞
爬取要求:對新聞信息進行詞雲分析,新聞時間與事件點擊量排序,詞頻統計。
2、詳細爬取過程:
1.首先須要對每一個新聞頁面信息的爬取:alist
代碼以下:
def alist(url): ''' 獲取頁面的各類新聞,而後逐條進入 :param url: listUrl :return: newsList ''' res=requests.get(listUrl) res.encoding='utf-8' soup = BeautifulSoup(res.text,'html.parser') newsList=[] for news in soup.select('li'):#獲取li元素 if len(news.select('.text-list'))>0:#若是存在新聞題目 newsUrl = news.select('a')[0]['href']#獲取新聞的連接 newsDesc = news.select('span')[0].text#獲取時間 newsDict = anews(newsUrl)#經過進入連接獲取詳細信息 newsDict['time'] = newsDesc newsList.append(newsDict)#把每一個新聞的信息放進字典擴展到列表裏 return newsList
2.而後再獲取新聞頁面的url進入新聞詳細頁面,對新聞詳細頁面信息的爬取:anews
代碼以下:
def anews(url): ''' 進入後爬取主要內容 :param url: url :return: newsDetail ''' newsDetail = {} res = requests.get(url) res.encoding = 'utf-8' soup = BeautifulSoup(res.text,'html.parser') newsDetail['newsTitle'] = soup.select('.zw-title h2')[0].text#題目 newsDetail['newsClick'] = soup.select('.liulan')[0].text # 點擊次數 a = len(soup.select('.zw-text p'))#獲取存放內容的p標籤 c = ""#後面用來進行每一個p標籤的內容相加 for i in range(0,a):#獲取每一個p標籤的文本內容 if soup.select('.zw-text p')[i].text != "\n\n":#剔除空內容 b = ( soup.select('.zw-text p')[i].text) c = c+b#文本內容銜接 newsDetail['newstext'] = c#將文本內容放進字典 return newsDetail
3.對新聞新信息進行簡單數據處理:更新時間與點擊量的排序
代碼以下:
newsdf = pd.DataFrame(allnews) print(newsdf) print(newsdf.sort_values(by=['time'],ascending=False))#按更新時間降序排列 print(newsdf.sort_values(by=['newsClick'],ascending=False))#按點擊量降序排列
4.對新聞文本信息進行數據清洗
代碼以下:
# 加載停用詞表 stopwords = [line.strip() for line in open('stops_chinese1.txt', encoding='utf-8').readlines()] # 分詞 zhuanhua = str(allnews)#將字典轉化爲string格式 wordsls = jieba.lcut(zhuanhua) wcdict = {} for word in wordsls: # 不在停用詞表中 if word not in stopwords: # 不統計字數爲一的詞 if len(word) == 1: continue else: wcdict[word] = wcdict.get(word, 0) + 1
5.對文本信息進行詞頻排序:
代碼以下:
wcls=list(wcdict.items()) wcls.sort(key=lambda x:x[1],reverse=True) #輸出詞頻最大TOP20 for i in range(20): print(wcls[i])
6. 生成詞雲
代碼以下:
cut_text = " ".join(wcdict)#join返回經過指定字符鏈接序列中元素後生成的新字符串 mywc = WordCloud(font_path = 'msyh.ttc').generate(cut_text) plt.imshow(mywc) plt.axis("off") plt.show()
7. 設置合理的爬取間隔
代碼以下:
for i in range(3): print(i) time.sleep(random.random()*3)#沉睡隨機數的3倍秒數
8. 保存到csv與sql文件
代碼以下:
newsdf.to_csv(r'F:\做業\大三下\大數據\homework8\cucn.csv',encoding='utf_8_sig')#保存成csv格式,爲避免亂碼,設置編碼格式爲utf_8_sig with sqlite3.connect(r'F:\做業\大三下\大數據\homework8\cucnsql.sqlite') as db:#保存文件爲sql newsdf.to_sql('gzccnewsdb',db)
3、運行截圖:
詞雲生成以下圖所示:
保存成csv文件截圖: