陳恒星


摘要:關鍵詞挖掘是網站搜索引擎優(yōu)化中的一項重要工作。文章介紹了Python爬蟲的工作原理,分析了進行百度關鍵詞挖掘的基本思路,設計了合理的關鍵詞挖掘算法,并基于python編程技術實現(xiàn)了相應的功能,從而使關鍵詞挖掘這樣一項繁瑣的工作變得快捷而高效。
關鍵詞:Python;關鍵詞挖掘;算法分析與實現(xiàn);
1 引言
在網站的搜索引擎優(yōu)化工作中關鍵詞的設計往往是最重要的一個環(huán)節(jié)之一。通過對搜索引擎工具的分析,我們可以看到相關搜索詞和下拉框往往是用戶搜索的主要入口,因此在這些地方出現(xiàn)的關鍵詞最能反應以往用戶的搜索意圖,但在以往獲取這些關鍵詞的途徑上是比較麻煩和費力的。而python作為一種高效的爬蟲工具在解決數據抓取和分析上是最合適的選擇。本文主要以百度搜索引擎為例,以關鍵詞挖掘作為主要工作目標,以python爬蟲作為技術手段,設計和實現(xiàn)了百度相關關鍵詞挖掘的算法。
2 Python爬蟲的工作原理
一般來說,網絡爬蟲是根據事先設置的若干初始網頁的URL地址開始,然后按照一定的策略爬取網頁,獲取初始網頁上的URL地址列表,然后每當抓取一個網頁時,爬蟲會提取該網頁新的URL地址并放入到未爬取的隊列中去,然后循環(huán)的從未爬取的隊列中取出一個URL地址再次進行新一輪的爬取,不斷的重復上述過程,直到隊列中的URL地址爬取完畢或者達到其他的限制條件,爬蟲才會結束。Python爬蟲則是采用Python編程語言實現(xiàn)的一種從網上抓取各類數據信息的自動化程序。
Python通過引用不同的庫文件實現(xiàn)網絡爬蟲功能,主要可以分為4個步驟,如下圖所示:
1、發(fā)起請求
在發(fā)起請求階段,python主要通過引用requests庫來實現(xiàn)??梢詷嬙煲粋€包含請求URL地址、偽裝請求頭headers、請求方式method、最長時間timeout的Request,然后向目標網址發(fā)送一個Request請求。
2、獲取響應內容
在獲取響應階段,如果服務器能正常響應,會返回一個Response對象,Response 的內容可能有 HTML,Json 字符串,二進制數據 (圖片,視頻等) 等類型。這個過程就是服務器接收客戶端的Request請求,經過解析發(fā)送給瀏覽器的網頁 HTML 文件。
3、解析內容
在解析返回內容的階段,主要通過第三方解析庫如Beautifulsoup,Xpath、pyquery等實現(xiàn)返回內容的解析。如果內容是HTML,可以用正則表達式(RE模塊)處理,也可以用網頁解析庫進行解析;如果是 Json,可以直接轉為 Json 對象解析;如果是二進制數據,可以以wb的方式寫入文件進一步處理。
4、保存數據
在數據保存階段,一般的保存的方式可以是文本或CVS格式的文檔,還可以是保存到數據庫(MySQL,Redis 、Mongdb),或者保存為指定格式的 jpeg,mp4 等文件。
3 關鍵詞挖掘算法分析
3.1關鍵詞挖掘的需求分析
在百度搜索引擎優(yōu)化的過程中,關鍵詞的選擇是一項很重要的工作。從搜索引擎優(yōu)化的角度來說,因此挖掘的關鍵詞遵循4個基本原則:
(1)與網站優(yōu)化密切相關的關鍵詞,因為這些詞才能直接反應網站的推廣目標,我們通常選擇網站主題相關的主詞;
(2)有商業(yè)價值的詞,在關鍵詞與網站相關的前提下,要盡量選擇具有營銷導向的詞,這些詞最能反應用戶對網站的需求導向,搜索該詞的用戶是最容易有轉化行為的潛在客戶;
(3)搜索指數高的詞,理論上來說,搜索指數越高的詞越能反應互聯(lián)網用戶對該詞的搜索需求,也是網站搜索引擎流量的主要來源;
(4)低競爭度的詞,在流量競爭激烈的情況下,選擇一些低競爭度的詞能讓網站搜索引擎優(yōu)化更容易有排名,有流量。
基于以上四點要求去選擇關鍵詞才能讓網站搜索引擎優(yōu)化更符合用戶的搜索需求。而搜索引擎平臺提供的“相關搜索”功能在一定程度上就反應了以往用戶的搜索需求。從而對”相關搜索”關鍵詞的挖掘就成了百度關鍵詞挖掘重要途徑。
3.2 相關關鍵詞抓取策略分析
在百度相關關鍵詞挖掘中,抓取詞的先后順序不同,會直接影響到相關詞的相關度,采用不同的抓取策略也會影響到關鍵詞挖掘的規(guī)模。本文的相關關鍵詞的抓取主要考慮以下兩種抓取策略:
1.深度優(yōu)先遍歷策略:網絡爬蟲從主詞開始,然后找到若干個百度相關詞,一個詞接一個詞跟蹤下去,處理完這條線路的所有相關詞之后再轉入下一個詞處理。以下圖為例:
遍歷路徑:黑茶網- 茶網-百分茶官網 ?黑茶價格 ?黑茶產區(qū)-黑茶產地在哪-麻黑茶產地在哪里 安化黑茶 黑茶網平臺
2.廣度優(yōu)先遍歷策略:網絡爬蟲從主詞開始,然后找到若干個百度相關詞 ,先處理該層的所有詞后,然后選擇其中的一個詞進入下一層的抓取,以此類推,直到都沒有相關詞就結束。還是以上面的圖為例:
遍歷路徑:黑茶網-黑茶價格-黑茶產區(qū)-安化黑茶-黑茶網平臺-茶網 ?黑茶產地在哪 麻黑茶產地在哪里 百分茶官網絡
由于百度相關詞的無窮性和不確定性,所以兩種抓取策略都應該控制挖掘的深度,同時由于抓取的深度越深抓取到的詞與主詞的相關性會越來差。因此本文最好采用廣度優(yōu)先遍歷策略。
3.3相關關鍵詞挖掘功能分析
針對百度的“相關搜索”進行關鍵詞挖掘,以“湖南黑茶網”為例,爬蟲程序以設定的主詞,按一定的爬取策略實現(xiàn)百度相關關鍵詞挖掘的功能如下:
(1)根據關鍵詞的挖掘需求設定爬蟲程序挖掘主詞的功能??梢愿鶕髟~拓展百度相關搜索詞,如確定“湖南黑茶網”的網站主詞為”黑茶”、”黑茶網”,”黑茶價格”。
(2)根據關鍵詞挖掘的規(guī)模和相關度要求,可以設定關鍵詞抓取深度的功能。一般來說,一個關鍵詞正常情況下爬蟲程序能夠獲取到10個相關搜索詞,但是如果只獲取一層深度的關鍵詞的話,則爬蟲能夠抓取的關鍵詞數量非常有限,因此爬蟲程序中需要能設定爬蟲循環(huán)抓取的深度。但事實上,爬蟲抓取的深度越深,有可能重復抓取到一些相同的詞,這樣爬蟲的效率就不高,同時隨著爬取深度加深,相關性就會越低,這樣抓取的關鍵詞與網站推廣的目標就會越來越遠。
(3)根據抓取原則對拓展詞進行分情況處理的功能。根據關鍵詞的挖掘的需求分析,一般可以把爬蟲抓取到的拓展到詞分為四種情況,一種是具有商業(yè)價值的詞,諸如關鍵詞中包含”價格”、“錢”、“買”,那么對這些詞做高價值的屬性標注;一種是爬蟲頻繁抓取到的詞,說明這些詞被搜索的次數多,更能反應用戶的搜索需要,同樣可以做這些詞的高搜索的屬性標注;一種是低競爭度的詞,可以通過該詞的競爭頁面數來衡量其競爭激烈程度。具體來說就是記錄“百度為您找到相關結果”的結果。這樣的結果數越小說明競爭度越低。一種是沒有相關詞的情況,則只要保留該詞,以避免下次拓展重復操作。
(4)對拓展詞排序整理的功能。爬蟲抓取到相關詞后保存到文本文件中,并標注詞的高價值詞、高搜索詞、低競爭詞等屬性,然后根據需要進行某些維度的排序。
4 基于python的關鍵詞挖掘算法實現(xiàn)
本文通過定義不同函數來實現(xiàn)關鍵詞挖掘。使用定義全局的字典和元組共享的方式來進行關鍵詞的過濾和臨時結果存儲,以消息隊列動態(tài)管理準備進行抓取的關鍵詞。使用雙元素元組來作為作為消息隊列的參數,其中一個為關鍵詞,另一個為當前的拓展是第幾次。主要代碼如下:
#程序入口
if __name__ == '__main__':
result = {} # 保存挖掘詞結果
seen = set()# 保存在隊列中的關鍵詞
k_queue = Queue()
loop =10 #挖掘詞的深度
ua = ' 偽裝headers '
with open('keys.txt') as kwfile:
for key in kwfile:
key = key.strip()
k_queue.put((key,1))
seen.add(key)
failed = open('fail.txt','w')
while True:
kw,cloop = kw_queue.get()
print('CurLoop:{} Checking:{}'.format(cloop,kw))
query = 'https://www.baidu.com/s?word={}'.format(kw)
try:
res = requests.get (query,timeout=10,user_agent=ua)
if res:
xgjgs,kw_list,jzsx = extract(res,kw)
filter(cloop,kw_list,xgjgs)
else:
failed.write('{}\n'.format(kw))
finally:
kw_queue.task_done()
sort_list = sorted(result.items(),key=lambda x:x[1],reverse=True)
save = open('bdkey.txt','w',encoding='utf-8')
for item in sort_list:
# 關鍵詞+次數+相關結果數+價值屬性的文件輸出方式
line = '%s\t%d\%s\t%s\tn' % (item[0],item[1],item[2],item[3])
save.write(line)
save.flush()
save.close()
#提取相關關鍵詞及其相關結果數、詞屬性
def extract(html,kw):
soup=BeautifulSoup(html,'lxml')
xgjgs=soup.select('span.nums_text')[0].text.strip()
xgList=re.findall(r'class="c-font-medium new-inc-rs-item”>(.*?)</a>',html,re.S|re.I)
jzsx=isJzsx(kw)
return xgjgs,xgList,jzsx
# 判斷詞的價值屬性
def isJzsx(kw)
if '錢' in kw:
jzsx='F'
elif '價格' in kw:
jzsx='T'
else:
jzsx='F'
#關鍵詞過濾和統(tǒng)計函數
def filter(current_loop,kwlist,xgjgs,jzsx):
for kw in kwlist:
if current_loop < loop and kw not in seen:
kw_queue.put((kw,current_loop+1))
seen.add(kw)
if kw in self.result:
result[kw]+= 1
else:
result[kw]= 1
result['xgjgs']=xgjgs
result['jzsx']=jzsx
5 結束語
總而言之,python編程語言在實現(xiàn)網絡爬蟲應用中有其他獨特的優(yōu)勢。而本文正是充分利用python語言來解決搜索引擎優(yōu)化關鍵詞挖掘這一復雜多樣的工作問題,把反復、無趣的工作變成了一種只要基于某些策略,自動化高效完成的爬蟲算法程序,切實的解決了搜索引擎優(yōu)化選詞難,盲目選詞的問題。但是爬蟲算法程序本身也要需要完善的地方,諸如怎樣更科學合理的判別關鍵詞的高價值性,爬蟲程序挖掘深度與關鍵詞相關性平衡等問題都有待進一步的研究和探索。
參考文獻
[1]曾曉娟;基于Python爬蟲技術的應用[J];辦公自動化;2018年20期
[2]闖躍龍;郭文平;面向非計算機專業(yè)學生的Python教學內容設計[J];臺州學院學報;2018年03期
[3]姚建盛;李淑梅;Python在科學計算中的應用[J];數字技術與應用;2016年11期
[4]錢程;陽小蘭;朱福喜;基于Python的網絡爬蟲技術[J];黑龍江科技信息;2016年36期
[5]李彥;基于Python的網絡爬蟲技術的研究[J];探索與觀察;2021年18期