10011311341 呂濤、10011311356
李紅
目的:通過熟悉使用火車頭采集器,在網絡上采取3萬條笑話并進行排重,以此來熟悉web文本挖掘的一些知識。
過程:本次學習,主要分成兩個部分。第一部分是笑話文本的采集,第二部分是笑話排重。以下是具體過程:
第一部分 笑話抽取
火車頭采笑話基本流程:
新建分組?新建任務?采集網址設置?采集內容設置?抓數據。
一、新建分組及任務
根據需要設立“課程”分組,以便于以后學習過程中練習使用,又建立了子分組“笑話抽取”。本次采集笑話主要是兩個網站“中文幽默王”及“開心驛站”,由于不同的網站html各種功能框架不同,而不同框架結構的采集規則又不同,所以將其分成了兩個任務建立“開心驛站”和“中文幽默王”。如圖1所示
圖1 分組及任務
二、采集網址及內容規則設置
由于本次采集作為課程練習使用,所以不牽扯到發布,因此,任務編輯上面僅設置第一步“采集網址規則”和第二步“采集內容規則”,如圖2所示
圖2 編輯任務
下面學習過程介紹均以開心驛站為例敘述
第一步:采集網址規則
首先要先添加起始網址http://www.kxx.cc/ 接下來的笑話網址采集就分為兩種方式。
第一種就是在“添加開始采集地址”窗體中設置“批量/多頁”項,設置“等差數列”方式,即采集的笑話從第一頁到最后一頁,這些頁數是成公差為1的等差數列,如圖3所示
圖3 批量/多頁設置
將“開心驛站”上面各類笑話設置完全,效果圖如圖3所示
圖4 起始網址效果圖
當然,如果僅此設置的話,我們一頁只能采到一條笑話,實際上,“開心驛站”上面的一頁可以顯示16條笑話,這樣我們還要設置一下“多級網址采集規則”。可以手動分析頁面html格式,然后填寫規則,這里采用最簡單的可視化Xpath方式獲取地址。如圖5所示
圖5
Xpath方式獲取地址
我們可以看出多級網址獲取方式為get如圖6所示
圖6 多級網址設置效果圖
第二種就是不在設置“批量/多頁”,而是直接設置“多級網址獲取”,首先獲得“開心驛站”上面各個分類的默認打開地址。
例如“校園笑話”http://www.kxx.cc/xiaohua/list4-1.html,這些網址的獲取,我們同樣采用的是最簡單的可視化地址Xpath方式獲得。Xpath獲得的網址里面有可能不是我們想要的網址,比如list10-1和list13-1分別為圖片和視頻,所以我們可以進行“結果網址過濾”如圖7所示
圖7 結果網址過濾設置
接下來就是“列表分頁獲取”設置,這個就是對每個分類的默認頁進行下一頁的采集,根據html里面的格式,我們如圖8所示設置
圖8 列表分頁獲取設置
至于每一頁要采集到16條笑話的網址,這個就和第一種方式是一樣的。就此略過。
第二步 采集內容規則
首先我們要設計自己想要的記錄屬性,采集笑話,需要“標題”“內容”“分類”三個屬性,如圖9所示內容標簽定義
圖9 內容標簽定義
具體到各個標簽的規則定義如下圖10-13:
圖10 前后截取方式抽取標題
圖11
可視化抽取內容
需要注意的是,在內容抽取過程中可能會遇到一些html標簽殘留,或者是雙引號,感嘆號以及省略號等等不顯示,這時候我們可以根據需要進行html標簽排除和一些字符的替換。
圖12
可視化提取分類
圖13 規則測試
三、抓數據
通過以上“網址采集規則”和“內容采集規則”的設置,就可以開始任務了。經過一段時間,數據采集完成,我們可以對任務進行右單擊選擇“打開Data下任務文件夾”,就可以看到默認為Access的數據文件,當然也可以轉換為Excel格式。由于排重的時候我們是以Excel格式進行數據輸入的,所以我們將其轉換為Excel格式。
第二部分 笑話排重
算法思想:本次笑話排重,主要是從內容上判斷。采用MD5摘要算法,我們選取第一個句話前后7個字符進行MD5碼運算,就是中文“。”和英文“.”前面4個后面兩個再加本身7個字符進行MD5運算,沒有中文句號和英文句號的暫時定為不重復。然后對比比每條笑話的前七個字符的MD5碼。根據“select
*,count(distinct Md5)from mo1 group by Md5”將和現有的笑話重復的笑話排除掉。
算法描述:MD5對以512位為單位的輸入進行變換最終以32位為單位4個的壓縮信息組輸出。根據運算結果的唯一性,我們可以每條笑話的第一個句號的前7個字符進行相同MD5運算,比對之后進行確認是否相同。
MD5過程描述如圖14
圖14 MD5過程
算法實現:
1、input
import MySQLdb
import xlrd
conn = MySQLdb.connect(host='localhost' , user = 'root'
,passwd='root' ,db = 'joke' ,use_unicode=True
,charset='utf8')
cursor = conn.cursor()
data = xlrd.open_workbook('E:\joke1.xls')
table = data.sheets()[0]
cursor.execute("select *,count(distinct Md5)from mo1 group by
Md5;")
rows = cursor.fetchall()
for row in rows:
k = row[0]
a =
int(table.cell(k,0).value)
b =
table.cell(k,1).value
c =
table.cell(k,2).value
d =
table.cell(k,3).value
e =
table.cell(k,4).value
f =
table.cell(k,5).value
g =
table.cell(k,6).value
sql = "INSERT INTO jo1
values(%s,%s,%s,%s,%s,%s,%s)"
cursor.execute(sql,(a,b,c,d,e,f,g))
cursor.close()
conn.commit()
2、MD5算法代碼實現
# -*- coding: UTF-8 -*-
import xlrd
import re
import hashlib
import MySQLdb
data = xlrd.open_workbook('E:\joke1.xls')
table = data.sheets()[0]
conn = MySQLdb.connect(host='localhost' , user = 'root'
,passwd='root' ,db = 'joke' ,use_unicode=True
,charset='utf8')
cursor = conn.cursor()
for n in range(1,table.nrows):
a =
table.cell(n,4).value
print n
md
=''
for i in
range(len(a)):
s = ''
if a[i] == u'.':
a[i]
if i ==
len(a)-1:
j = len(a)
elif i ==
len(a)-2:
j = len(a)
else:
j = i+3
for k in
range(j-7,j):
s = s+a[k]
m =
hashlib.md5(s.encode("utf8"))
md =
m.hexdigest()
break
elif a[i] == u'。':
a[i]
if i ==
len(a)-1:
j = len(a)
elif i ==
len(a)-2:
j = len(a)
else:
j = i+3
for k in
range(j-7,j):
s = s+a[k]
m =
hashlib.md5(s.encode("utf8"))
md =
m.hexdigest()
break
if md == '':
md = str(n)
sql = "INSERT INTO mo1
values(%s,%s)"
cursor.execute(sql,(n,md))
cursor.close()
conn.commit()
報告總結
本次課程作業進行過程當中,遇到了很多問題,有些解決了有些目前還沒有,火車頭是門學問,各種規則的書寫學習路還很漫長,在以后的學習過程中慢慢積累經驗。
排重的算法上也還有不足,在今后的學習當中應該再接再厲。
總之,本次課程學習,學到了很多東西。特別是在學習方法上,自己吃不透的地方可以向別人請教,可以通過別的渠道獲取知識。學習是個任道重遠的事情,自己的能力也有觸及不到的地方,日后的工作也會更多的依賴團隊的合作,所以,要更加注重合作的重要性。