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

微信里輸入CS_mastering搜索公眾號(hào),關(guān)注后回復(fù)爬蟲(chóng)獲取資源

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

爬蟲(chóng)簡(jiǎn)單介紹

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

Python無(wú)疑是所有語(yǔ)言中最適合爬蟲(chóng)的。Python本身很簡(jiǎn)單,可是真正用好它需要學(xué)習(xí)大量的第三方庫(kù)插件。比如matplotlib庫(kù),是一個(gè)仿照matalab的強(qiáng)大的繪圖庫(kù),用它可以將爬下來(lái)的數(shù)據(jù)畫(huà)出餅圖、折線圖、散點(diǎn)圖等等,甚至是3D圖來(lái)直觀的展示。

Python第三方庫(kù)的安裝可以手動(dòng)安裝,但是更為簡(jiǎn)便的是在命令行直接輸入一行代碼即可自動(dòng)搜索資源并安裝。而且非常智能,可以識(shí)別自己電腦的類型找到最合適的版本。

Pip install +你所需要的第三方庫(kù)

或者是easy install +你所需要的第三方庫(kù)

這里建議大家使用pip安裝,因?yàn)閜ip可以安裝也可以卸載,而另一種方法只能安裝。如果遇到你想使用新的版本的第三方庫(kù),使用pip的優(yōu)勢(shì)就會(huì)顯現(xiàn)出來(lái)。

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

交互界面.png

為了增加工作量,我設(shè)計(jì)了一個(gè)交互界面來(lái)湊數(shù)。其實(shí)很簡(jiǎn)單,用的是python自帶的第三方庫(kù)Tkinter。注意,引用這個(gè)庫(kù)的時(shí)候呢,必須大寫。我就因?yàn)檫@個(gè)大小寫問(wèn)題,糾結(jié)了一下午才發(fā)現(xiàn)出錯(cuò)誤。

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

我這只是簡(jiǎn)單的設(shè)計(jì)一個(gè)交互界面,python有更為豐富的框架可以讓界面更加友好以及美觀。

第二部分:python爬蟲(chóng)

(這部分代碼參考簡(jiǎn)書(shū)ID方志朋的文章)

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

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

思路是這樣的。

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

def download(url):                          #通過(guò)給定的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)))

第一個(gè)函數(shù)沒(méi)什么好說(shuō)的。

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

第三個(gè)函數(shù)就是結(jié)巴分詞。接下來(lái)對(duì)結(jié)巴分詞作簡(jiǎn)單的介紹。

支持三種分詞模式。

精確模式:試圖將句子最精確地切開(kāi),適合文本分析。

全模式:把句子中所有的可以成詞的詞語(yǔ)都掃描出來(lái),速度非常快,但是不能解決歧義。

搜索引擎模式:在精確模式的基礎(chǔ)上,對(duì)長(zhǎng)詞再次切分,提高召回率,適合用于搜索引擎分詞。

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

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

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

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

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

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

db = client['local']

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

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

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

以上是有關(guān)連接數(shù)據(jù)庫(kù)的核心代碼,接下來(lái)介紹如何啟動(dòng)mongoDB數(shù)據(jù)庫(kù)。(我一開(kāi)始編程怎么都連接不上,后來(lái)發(fā)現(xiàn)是數(shù)據(jù)庫(kù)自身沒(méi)有啟動(dòng),唉,編程里發(fā)生的傻逼事情實(shí)在是太多了。)

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

啟動(dòng)mongoDB

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

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

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

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

云圖效果

另一個(gè)就是使用matplotlib第三方庫(kù)繪圖更直觀更系統(tǒng)的表現(xiàn)數(shù)據(jù)。第一個(gè)工具很簡(jiǎn)單,大家進(jìn)入網(wǎng)站就會(huì)使用,現(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,]#每個(gè)標(biāo)簽占多大,會(huì)自動(dòng)去算百分比
colors = ['red','yellowgreen','lightskyblue']
explode = (0.05,0,0)#將某部分爆炸出來(lái), 使用括號(hào),將第一塊分割出來(lái),數(shù)值的大小是分割出來(lái)的與其他兩塊的間隙

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,文本的位置離遠(yuǎn)點(diǎn)有多遠(yuǎn),1.1指1.1倍半徑的位置

#autopct,圓里面的文本格式,%3.1f%%表示小數(shù)有三位,整數(shù)有一位的浮點(diǎn)數(shù)
#shadow,餅是否有陰影
#startangle,起始角度,0,表示從0開(kāi)始逆時(shí)針轉(zhuǎn),為第一塊。一般選擇從90度開(kāi)始比較好看
#pctdistance,百分比的text離圓心的距離
#patches, l_texts, p_texts,為了得到餅圖的返回值,p_texts餅圖內(nèi)部文本的,l_texts餅圖外label的文本
#改變文本的大小
#方法是把每一個(gè)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給人的整體感覺(jué)就是代碼簡(jiǎn)潔,功能強(qiáng)大。針對(duì)數(shù)據(jù)分析有其獨(dú)特的功能和精確的分析能力。

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

在目前的大數(shù)據(jù)時(shí)代,python語(yǔ)言的使用頻率也在日漸上升,其用途也會(huì)越來(lái)越廣。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容