Segmentfault的熱門標籤,可視化展現?

結論

JavaScript居首位,HTML5緊隨其後,Python位列第三。javascript

注:數據來源於569頁標籤頁面的11,380 條記錄html

圖片描述
圖片描述

涉及知識點

  • python爬蟲前端

    • requests庫
    • BeautifulSoup
  • elasticsearch儲存java

    - 批量bulk數據
  • kibana可視化python

    - 作圖展現

實現步驟

  1. 數據採集
  2. 批量入庫
  3. 繪製圖表

緣起

瀏覽segmentfault時,看到熱門標籤,我就是思考了一下這個熱門到底有多熱。因而點擊到全部標籤查看,發現只能肉眼一個個對比,F12看了下,中規中矩的html文本,requests+bs4能夠處理,乾脆我爬一下看看吧。。。額,手頭正好有一套elasticsearch+kibana的環境,我導進去看吧 emmmm....mysql

數據採集

使用python爬取標籤信息,包括:tag名稱,tag的解釋說明,tag的url,tag的關注人數
嗯,夠簡單,我喜歡。linux

def get_tag(page_num):
    result = requests.get('http://segmentfault.com/tags/all?page=%s'%page_num)
    return result.content

不得不說,segmentfault對爬蟲是真正的友好啊,headers什麼的都不用填寫,直接簡單粗暴。熟悉python的同窗對這種操做,恐怕就是跟 print "Hello World"差很少吧。。ios

def process_tag(content):
    soup = BeautifulSoup(content,'lxml')
    sections = soup.find_all('section')
    info = {}
    values = []
    for section in sections:
        tag = section.div.h2.a.text
        tag_instruction = section.div.p.text
        follows = section.div.div.strong.text
        url = 'https://segmentfault.com'+section.div.h2.a['href']
        info['url'] = urllib.unquote(url)
        info['tag'] = tag
        info['tag_instruction'] = tag_instruction
        info['follows'] = int(follows)
        deepcopy_info = copy.deepcopy(info)
        values.append({
            "_index": 'segmentfault',
            "_type": 'tag',
            # "_op_type": "create",
            "_source": deepcopy_info
        })
    return values

上面一段代碼仍是有些須要注意的地方。git

  1. BeautifulSoup的使用,tag的獲取,節點屬性等等,認真閱讀文檔我相信你們都沒有問題。
  2. 列表和字典copy的問題,這裏面要注意python的copy並不會爲此開闢新的內存,你能夠想象爲windows下的快捷方式,或者linux下的軟連接。因此此處咱們使用deepcopy,使之開闢新的內存存儲這個copy.
  3. bulk數據,這個咱們接下來講明。

批量入庫

由於手頭有elasticsearch因此就導入了進來,關於elasticsearch的安裝和使用,社區裏也有資源,有空我也會整理一篇文章。程序員

python比較友好的地方就是各類包很是的全面,elasticsearch這個庫提供了一套API接口,用來增刪改查。這裏說一下,我有一個夢想,就是但願從業環境更加的純粹,JD上的要求不要這麼過度,當面試官問我問題的時候,我能夠微笑着告訴他,沒看過源碼,對底層架構不熟悉,對原理的瞭解來自於各個博客的東拼西湊,熟練運用各類API接口,可是你不要讓我說出來幾個,由於我須要看文檔。而後面試官微笑着說,我很滿意,給你2K,若是接受明天能夠來擰螺絲。

咳咳咳,言歸正傳。
elasticsearch的插入數據有兩種方式:

  1. 逐條插入
  2. 批量插入

代碼中實現的是批量插入。即爬取一個頁面,一個頁面中有20條tag信息,將這20條數據打包bulk.

數據長這個樣子
圖片描述

segmentfault站點下的569個標籤頁面一共採集到11380條數據
圖片描述

單線程下爬取和寫入耗時269.183s
圖片描述

繪製圖表

經過kibana對elasticsearch的數據進行可視化,讓數據變得直觀,產生意義。
另外kibana 5以上新增長了詞雲這個功能,就是咱們文章開頭展現的那張圖表。

kibana做圖不涉及代碼編寫,可是各個指標跟維度須要梳理好關係,以及什麼樣的數據組合有意義。這個能夠單獨拿出來做爲一篇文章,我也會抽出時間整理的。

扯淡

看的出來,社區以javascript的問題衆多,以及Html5,Css3也分別位於第二位和第七位,看來最愛提問的是前端同窗們。我想這個前端各類層出不窮的框架,以及js這個弱類型語言有很大的關係,而且一般這類問題比較具象,也較容易描述。

git這個版本控制工具的問題也很多,但是svn的身影我沒有看到,看出來趨勢了吧。

數據庫方面問題最多的仍是mysql。

在各類技術名詞的標籤下,還冒出一個程序員標籤,排名第12位。emmmm,,,知道了你是個程序員,不用強調啦。

GitHub

雖然程序很簡單,可是當我完成下面的TODO也會繼續更新下,我是個追求完美的程序員,儘管完美的事很難,當咱們也要爲之奮鬥啊!

https://github.com/wkatios/se...

TODO

  1. 爬蟲對數據的抓取和寫入數據庫操做是一種比較耗費網絡的行爲,並不是CPU密集型,能夠改用多線程,或者協程,提升速度。
  2. 多維度的數據抓取,好玩的事情一般須要更多的數據源和數據類型支持。
相關文章
相關標籤/搜索