前言
最近在出差,發(fā)現(xiàn)住的賓館居然有小強。所以出差無聊之際,寫了點爬蟲的代碼玩玩,問就是應景。本篇文章主要是爬取CSDN全站綜合熱榜的100個標題,然后分詞提取關鍵詞,統(tǒng)計一下詞頻。
我想了下,對于其他博主還是有用的,可以看看什么標題可以上熱榜,就分享一下吧。順便把我解決各類問題的方法,說一說。
環(huán)境
使用的IDE為:spyder(有看著界面不習慣的,忍一下,不關鍵)
頁面爬取使用chromedriver,至于原因我后面會說。
分詞器:jieba
爬取頁面地址:https://blog.csdn.net/rank/list
爬蟲代碼
這里說一下為什么沒有用requests直接獲取頁面源碼,主要是因為該頁面并不能直接請求出源碼。而是通過頁面滾動到最下方,才可以顯示出全部的100個排名的文章。
所以我的思路是,使用chromedriver,然后執(zhí)行js實現(xiàn)滾動頁面到最下方。
這里需要說明一下chromedriver的下載,需要根據(jù)你google瀏覽器的版本來。我的筆記本事mac,可以點擊左上角的Chrome,再點擊關于Google Chrome看看自己的瀏覽器版本。
分享一下chromedriver的下載地址:google chrome driver下載地址
簡單說明一下driver的原理,就是模擬瀏覽器打開url的操作,就像我們手點一樣,具體原理改天可以再聊聊。
不廢話了,上爬蟲工具代碼
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Thu Nov 4 17:15:06 2021 @author: huyi """ from selenium import webdriver import time # ============================================================================= # 爬取動態(tài)下滑加載網頁 # ============================================================================= def pa(url): driver = webdriver.Chrome('/usr/local/bin/chromedriver') driver.get(url) js = ''' let height = 0 let interval = setInterval(() => { window.scrollTo({ top: height, behavior: "smooth" }); height += 500 }, 500); setTimeout(() => { clearInterval(interval) }, 20000); ''' driver.execute_script(js) time.sleep(20) source = driver.page_source driver.close() return source
代碼說明
1、代碼主要是一個工具方法,使用diver打開瀏覽器。然后通過js代碼,模擬向下滾動的操作。
2、根據(jù)你的網絡條件,里面的超時時間你可以調整。避免還沒有滾動到最下面就結束了,因為我賓館的網比較卡,所以設置的比較大。
3、返回頁面源碼,為了后面的xpath解析。
驗證一下
OK,已經拿到了頁面源碼了。
關鍵詞提取代碼
我們把關鍵詞提取的方法也準備一下。不廢話,上代碼。
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Thu Nov 4 21:53:22 2021 @author: huyi """ import jieba.analyse def get_key_word(sentence): result_dic = {} words_lis = jieba.analyse.extract_tags( sentence, topK=3, withWeight=True, allowPOS=()) for word, flag in words_lis: if word in result_dic: result_dic[word] += 1 else: result_dic[word] = 1 return result_dic
代碼說明
1、簡單說明一下,方法取的是權重最高的3個詞,可以按照你的喜歡調整。
2、把相同的詞做一個計數(shù),方便把100的標題關鍵詞詞頻統(tǒng)計用。
主程序代碼
主程序主要是將源碼中的標題,使用lxml進行元素提取,獲取標題。然后詞頻統(tǒng)計后輸出結果文本。
不廢話,上代碼。
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Thu Nov 4 14:01:38 2021 @author: huyi """ from lxml import etree from tools.dynamic_page import pa from tools.analyse_word import get_key_word csdn_url = 'https://blog.csdn.net/rank/list' source = etree.HTML(pa(csdn_url)) titles = source.xpath("//div[@class='hosetitem-title']/a/text()") key_word_dic = {} for x in titles: if x: for k, v in get_key_word(x).items(): if k.lower() in key_word_dic: key_word_dic[k.lower()] += v else: key_word_dic[k.lower()] = v word_count_sort = sorted(key_word_dic.items(), key=lambda x: x[1], reverse=True) with open('result.txt', mode='w', encoding='utf-8') as f: for y in word_count_sort: f.write('{},{}\n'.format(y[0], y[1]))
代碼說明
1、xpath怎么取?google瀏覽器支持右鍵直接copy,但是還是建議了解一下xpath相關語法。
2、把英文單詞統(tǒng)一小寫,避免重復。
3、按照詞頻倒序排列輸出的,最多次數(shù)的在前面。
驗證結果
OK,不出意外,java是yyds。
總結
可以看到最后的統(tǒng)計里面有一些符號,怎么說?可以通過jieba停用詞去掉,看你怎么篩選了。
申明一下,本文案例僅研究探索使用,不是為了惡意攻擊。
如果本文對你有作用的話,請不要吝嗇你的贊,謝謝。
以上就是Python 詳解爬取并統(tǒng)計CSDN全站熱榜標題關鍵詞詞頻流程的詳細內容,更多關于Python 爬取CSDN的資料請關注服務器之家其它相關文章!
原文鏈接:https://huyi-aliang.blog.csdn.net/article/details/121154001