畢業(yè)設(shè)計:爬蟲及數(shù)據(jù)分析

微信里輸入CS_mastering搜索公眾號芬位,關(guān)注后回復(fù)爬蟲獲取資源

畢業(yè)設(shè)計分為四部分翔试。每一部分都會有具體代碼與注釋晚胡,也會有一些外延知識的提及與討論歼培,歡迎大家一起學(xué)習(xí)進步。

爬蟲簡單介紹

所謂爬蟲就是編寫代碼從網(wǎng)頁上爬取自己想要的數(shù)據(jù)婉烟,代碼的質(zhì)量決定了你能否精確的爬取想要得到的數(shù)據(jù)琐凭,得到數(shù)據(jù)后能否直觀正確的分析逗嫡。

Python無疑是所有語言中最適合爬蟲的育瓜。Python本身很簡單,可是真正用好它需要學(xué)習(xí)大量的第三方庫插件栽烂。比如matplotlib庫躏仇,是一個仿照matalab的強大的繪圖庫恋脚,用它可以將爬下來的數(shù)據(jù)畫出餅圖、折線圖焰手、散點圖等等糟描,甚至是3D圖來直觀的展示。

Python第三方庫的安裝可以手動安裝书妻,但是更為簡便的是在命令行直接輸入一行代碼即可自動搜索資源并安裝船响。而且非常智能,可以識別自己電腦的類型找到最合適的版本躲履。

Pip install +你所需要的第三方庫

或者是easy install +你所需要的第三方庫

這里建議大家使用pip安裝见间,因為pip可以安裝也可以卸載,而另一種方法只能安裝工猜。如果遇到你想使用新的版本的第三方庫米诉,使用pip的優(yōu)勢就會顯現(xiàn)出來。

第一部分:交互界面設(shè)計

交互界面.png

為了增加工作量篷帅,我設(shè)計了一個交互界面來湊數(shù)史侣。其實很簡單,用的是python自帶的第三方庫Tkinter魏身。注意惊橱,引用這個庫的時候呢,必須大寫箭昵。我就因為這個大小寫問題税朴,糾結(jié)了一下午才發(fā)現(xiàn)出錯誤。

def web():
    root = Tk()
    Label(root,text='請輸入網(wǎng)址').grid(row=0,column=0)           #對Label內(nèi)容進行表格式布局
    Label(root,text='請輸入User-Agent :').grid(row=1,column=0)
    v1=StringVar()    #設(shè)置變量
    v2=StringVar()   
    e1 = Entry(root,textvariable=v1)            #用于儲存 輸入的內(nèi)容
    e2 = Entry(root,textvariable=v2)
    e1.grid(row=0,column=1,padx=10,pady=5)      #進行表格式布局                
    e2.grid (row=1,column=1,padx=10,pady=5)
    url = e1.get()                              #將從輸入框中得到的網(wǎng)址賦值給url
    head = e2.get()

我這只是簡單的設(shè)計一個交互界面宙枷,python有更為豐富的框架可以讓界面更加友好以及美觀掉房。

第二部分:python爬蟲

(這部分代碼參考簡書ID方志朋的文章)

我這里爬蟲所爬取的是一位知名博主的博客,并對其所有的文章進行結(jié)巴分詞慰丛。從而提取關(guān)鍵詞卓囚,分析這位博主使用當(dāng)下比較熱的與互聯(lián)網(wǎng)相關(guān)的詞匯的頻率。

工作臺數(shù)據(jù).png

思路是這樣的诅病。

先編寫一個函數(shù)download()獲取url哪亿,接著編寫一個函數(shù)parse_descrtion()解析從
url中獲取的html,最后結(jié)巴分詞贤笆。

def download(url):                          #通過給定的url爬出數(shù)據(jù)
    if url is None:
        return None
    try:
        response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36', })
    if (response.status_code == 200):
        return response.content
    return None
    except:
        return None

 

def  parse_descrtion(html):                                                         
    if html is None:
        return None
    soup = BeautifulSoup(html, "html.parser")         #html字符串創(chuàng)建BeautifulSoup
    links = soup.find_all('a', href=re.compile(r'/forezp/article/details'))
    for link in links:
        titles.add(link.get_text())



def jiebaSet():
    strs=''
    if titles.__len__()==0:
        return
    for item in titles:
        strs=strs+item;
    tags = jieba.analyse.extract_tags(strs, topK=100, withWeight=True)
    for item in tags:
        print(item[0] + '\t' + str(int(item[1] * 1000)))

第一個函數(shù)沒什么好說的蝇棉。

第二個函數(shù)用到了beautifulsoup,通過對網(wǎng)頁的分析芥永,從而尋找所有的滿足條件為
href=re.compile(r'/forezp/article/details')的a標(biāo)簽里的內(nèi)容篡殷。

第三個函數(shù)就是結(jié)巴分詞。接下來對結(jié)巴分詞作簡單的介紹埋涧。

支持三種分詞模式板辽。

精確模式:試圖將句子最精確地切開奇瘦,適合文本分析。

全模式:把句子中所有的可以成詞的詞語都掃描出來劲弦,速度非扯辏快,但是不能解決歧義邑跪。

搜索引擎模式:在精確模式的基礎(chǔ)上次坡,對長詞再次切分,提高召回率画畅,適合用于搜索引擎分詞砸琅。

舉個例子,結(jié)巴分詞“我來到北京清華大學(xué)”這句話夜赵。

【全模式】:我/來到/北京/清華/清華大學(xué)/華大/大學(xué)

【精確模式】:我/來到/北京/清華大學(xué)

第三部分:連接mongoDB數(shù)據(jù)庫

client = pymongo.MongoClient("localhost", 27017)

這句是使用給定主機位置和端口明棍。pymongo的Connection()方法不建議使用,官方推薦新方法MongoClient()寇僧。

db = client['local']

這句是將創(chuàng)建好mongoDB后默認(rèn)存在的兩個數(shù)據(jù)庫中的其中一個“l(fā)ocal”賦給db摊腋,這樣
db在以后的程序里就代表數(shù)據(jù)庫local。

posts = db.pymongo_test
post_id = posts.insert(data)

將local里默認(rèn)的一個集合“pymongo_test”賦值給posts嘁傀,并且用insert方法單個插入數(shù)據(jù)兴蒸。最后回到結(jié)巴分詞里的一個循環(huán)程序里,將數(shù)據(jù)依次插入细办。

以上是有關(guān)連接數(shù)據(jù)庫的核心代碼橙凳,接下來介紹如何啟動mongoDB數(shù)據(jù)庫。(我一開始編程怎么都連接不上笑撞,后來發(fā)現(xiàn)是數(shù)據(jù)庫自身沒有啟動岛啸,唉,編程里發(fā)生的傻逼事情實在是太多了茴肥。)

微軟徽標(biāo)+R坚踩,輸入cmd,找“mongodb”的路徑瓤狐,然后運行mongod開啟命令瞬铸,同時用--dbpath指定數(shù)據(jù)存放地點為“db”文件夾。

啟動mongoDB

我這里是放在了E盤础锐,大家根據(jù)需要自己設(shè)置嗓节。最后要看下是否開啟成功,從圖中的信息中獲知皆警,mongodb采用27017端口拦宣,那么我們就在瀏覽器輸http://localhost:27017,打開后mongodb告訴我們在27017上Add 1000可以用http模式查看mongodb的管理信息。

第四部分:數(shù)據(jù)分析

最后一部分就是數(shù)據(jù)分析了鸵隧,我這里用了兩個工具桐愉。

一個是用artword在線工具,地址:[https://wordart.com]

云圖效果

另一個就是使用matplotlib第三方庫繪圖更直觀更系統(tǒng)的表現(xiàn)數(shù)據(jù)掰派。第一個工具很簡單,大家進入網(wǎng)站就會使用左痢,現(xiàn)在主要介紹第二種工具的使用靡羡。

先介紹餅圖的使用。

plt.figure(figsize=(6,9))     #調(diào)節(jié)圖形大小俊性,寬略步,高
labels = [u'springboot',u'Cloud',u'spring']    #定義餅狀圖的標(biāo)簽,標(biāo)簽是列表
sizes = [47.2,30.5,22.3,]#每個標(biāo)簽占多大定页,會自動去算百分比
colors = ['red','yellowgreen','lightskyblue']
explode = (0.05,0,0)#將某部分爆炸出來趟薄, 使用括號,將第一塊分割出來典徊,數(shù)值的大小是分割出來的與其他兩塊的間隙

patches,l_text,p_text = plt.pie(sizes,explode=explode,labels=labels,colors=colors,
labeldistance = 1.1,autopct = '%3.1f%%',shadow = startangle = 90,pctdistance = 0.6)#labeldistance杭煎,文本的位置離遠點有多遠,1.1指1.1倍半徑的位置

#autopct卒落,圓里面的文本格式羡铲,%3.1f%%表示小數(shù)有三位,整數(shù)有一位的浮點數(shù)
#shadow儡毕,餅是否有陰影
#startangle也切,起始角度,0腰湾,表示從0開始逆時針轉(zhuǎn)雷恃,為第一塊。一般選擇從90度開始比較好看
#pctdistance费坊,百分比的text離圓心的距離
#patches, l_texts, p_texts倒槐,為了得到餅圖的返回值,p_texts餅圖內(nèi)部文本的葵萎,l_texts餅圖外label的文本
#改變文本的大小
#方法是把每一個text遍歷导犹。調(diào)用set_size方法設(shè)置它的屬性
for t in l_text:
    t.set_size(15)
for t in p_text:
    t.set_size(15)
#設(shè)置x,y軸刻度一致羡忘,這樣餅圖才能是圓的
plt.axis('equal')
plt.legend()
plt.show()
餅圖.png

然后是條形圖的使用谎痢。

people = ('springboot', 'Cloud', 'spring')
y_pos = np.arange(len(people))
performance = 3 + 10 * np.random.rand(len(people))
performance = (307,189,144)
error = np.random.rand(len(people))
plt.barh(y_pos, performance, xerr=error, align='center', alpha=0.4)
plt.yticks(y_pos, people)
plt.xlabel('time')
plt.ylabel('name')
plt.title('blog bar chart')
plt.show()
條形圖.png

總結(jié)

python給人的整體感覺就是代碼簡潔,功能強大卷雕。針對數(shù)據(jù)分析有其獨特的功能和精確的分析能力节猿。

我們學(xué)院軟件工程一位大神去了今日頭條,干的就是python工程師,本科就拿到了28W的年薪滨嘱。

在目前的大數(shù)據(jù)時代峰鄙,python語言的使用頻率也在日漸上升,其用途也會越來越廣太雨。

還在等什么吟榴,趕緊學(xué)python去吧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末囊扳,一起剝皮案震驚了整個濱河市吩翻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锥咸,老刑警劉巖狭瞎,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異搏予,居然都是意外死亡熊锭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門雪侥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碗殷,“玉大人,你說我怎么就攤上這事校镐∫诒猓” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵鸟廓,是天一觀的道長从祝。 經(jīng)常有香客問我,道長引谜,這世上最難降的妖魔是什么牍陌? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮员咽,結(jié)果婚禮上毒涧,老公的妹妹穿的比我還像新娘。我一直安慰自己贝室,他們只是感情好契讲,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著滑频,像睡著了一般捡偏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上峡迷,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天银伟,我揣著相機與錄音你虹,去河邊找鬼。 笑死彤避,一個胖子當(dāng)著我的面吹牛傅物,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播琉预,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼董饰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了圆米?” 一聲冷哼從身側(cè)響起尖阔,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎榨咐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谴供,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡块茁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了桂肌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片数焊。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖崎场,靈堂內(nèi)的尸體忽然破棺而出佩耳,到底是詐尸還是另有隱情,我是刑警寧澤谭跨,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布干厚,位于F島的核電站,受9級特大地震影響螃宙,放射性物質(zhì)發(fā)生泄漏蛮瞄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一谆扎、第九天 我趴在偏房一處隱蔽的房頂上張望挂捅。 院中可真熱鬧,春花似錦堂湖、人聲如沸闲先。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伺糠。三九已至,卻和暖如春酱讶,著一層夾襖步出監(jiān)牢的瞬間退盯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留渊迁,地道東北人慰照。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像琉朽,于是被迫代替她去往敵國和親毒租。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容