1. 程式人生 > >輿情監控系統——step1.爬取微信公眾號文章

輿情監控系統——step1.爬取微信公眾號文章

小明醬於2018年元旦更新,寫的還是很糙,如果你在爬蟲問題中遇到問題,歡迎交流哦,評論區隨時為你開放!
實習兩週過去了,目前任務量還不是很大。我的老闆很nice,是個軍校生,給我安排的任務也比我預想的要貼近我的研究方向,做的是微信公眾號文章的輿情監控系統,以下是該系統總體設計流程圖:

輿情監控系統

目前第一週是爬取微信公眾號的文章,主要功能如下:

  • 按照搜尋公眾號id和關鍵字兩種方法爬取文章的標題、內容、釋出時間、 公眾號名稱
  • 以正確編碼格式儲存到資料庫中
  • 實現將新增資料新增入資料庫
  • 在關鍵字檢索方式中按照時間順序將文章排序,實現翻頁爬取

以上功能均已實現,真心覺得在專案中學習才是最高效的方法,但同時也有不求甚解的毛病,希望自己能夠深入把握下一週新學的知識,做一個總結,不能僅停留在外掛式的程式設計。

主體思路

  • 通過微信合作方搜狗搜尋引擎(http://weixin.sogou.com/),傳送相應請求來間接抓取,可以實現兩種檢索方式,如下圖:搜文章和搜公眾號。

輸入公眾號ID,獲取爬蟲起始地址

http://weixin.sogou.com/weixin?type=1&s_from=input&query=+公眾號ID+&ie=utf8&_sug_=n&_sug_type_=

搜尋指定公眾號

  • 所用環境:python 3.5 | scrapy爬蟲框架 | Mac osX | mySQL資料庫

根據網頁結構設計爬取規則

在這個階段我徘徊了很久,看到很多demo設計了花裡胡哨的反扒策略,讓我慌張了很久,多謝漫步大佬給我的講解,他的嫌棄讓我進步。

  • 按照公眾號id爬取該公眾號最新的十條文章
    簡單的三級爬取
    在搜尋引擎上使用微信公眾號英文名進行“搜公眾號”操作(因為公眾號英文名是公眾號唯一的,而中文名可能會有重複,同時公眾號名字一定要完全正確,不然可能搜到很多東西,這樣我們可以減少資料的篩選工作,只要找到這個唯一英文名對應的那條資料即可)

1.第一級:找到指定公眾號,獲取公眾號主頁連結

這裡寫圖片描述

2.第二級:跳轉到主頁,找到每條文章的連結

這裡寫圖片描述

3.第三級:進入每條文章頁面進行資訊爬取,三條綠框中的資訊,還有頁面主體內容

這裡寫圖片描述

主體思路就是這個,其中利用chrome進行檢查部分就不在細說,都是常規操作

  • 按照關鍵字爬取相關文章——二級爬取,思路同上,但是出現嚴重問題:
    當我按照時間排序來獲取具有時效性的文章時,通過篩選會得到一個URL

這裡寫圖片描述

URL:

http://weixin.sogou.com/weixin?type=2&ie=utf8&query=%E6%98%A5%E8%8A%82&tsn=1&ft=&et=&interation=&wxid=&usip=

但是我將該URL複製到瀏覽器中時,他會返回到微信搜尋的主頁,啊哦那該怎麼辦呢?我們先來看下開發者工具

這裡寫圖片描述

以上引數剛好和URL對應上了,重點關注tsn它代表訪問的是一天內的文章,我們應該做如下請求:

return [scrapy.FormRequest(url='http://weixin.sogou.com/weixin',
                           formdata={'type':'2',
                                     'ie':'utf8',
                                     'query':key,
                                     'tsn':'1',
                                     'ft':'',
                                     'et':'',
                                     'interation':'',
                                     'sst0': str(int(time.time()*1000)),
                                     'page': str(self.page),
                                     'wxid':'',
                                     'usip':''},
                            method='get']

以上問題就解決了~

儲存細節

資料儲存的量還是很大的,需要很多樣本來訓練模型,現在儲存到資料庫中,但是有一個細節值得引起我的注意就是資料的編碼問題,現在公眾號的文章中很多emoji字元,因此會出現以下錯誤:

pymysql.err.InternalError: (1366, "Incorrect string value: '\\xF0\\x9F\\x93\\xBD \\xC2...' for column 'article' at row 1")

與反爬蟲作鬥爭

主要是遇到了驗證碼的問題,但是如果爬取速度不是很快的話,是可以避免的,因此採用如下兩個策略:

  • 在設定中delay引數設定為隨機數字

import random
DOWNLOAD_DELAY = random.randint(1, 3)

總結

遇到的問題

  1. 頁面元素匹配,今後要多學習BeautifulSoup
  2. 翻頁的邏輯問題,這個只能多自習自習,想想換頁的邏輯
  3. 資料庫儲存編碼問題,新換了Navicat,感覺一百分,這次配置好了以後就放心用吧
  4. 代理IP,通過網上的程式碼爬取的IP都不能用,浪費了很多時間
  5. 那個萬惡的tsn,又學會一招

一笑了之

爬蟲的基本思路是非常明確的,但是我其實還並沒有完全掌握爬蟲,還有很多方面需要繼續學習,正如漫步所說的,我太心急了,以至於想要快速達到目的,而忽略了對原理和基礎的把握,這是萬萬不行的,因此在寒假的時候我期待自己能把以下方面的知識學好:

  • 極客學院前端第二階段
  • 爬蟲第二遍學習並參與專案實戰
  • 吳恩達機器學習
  • 韓家煒資料探勘

尤其第二點是非常非常重要的,學習會才能證明你會爬蟲,而不是你單單東拼西湊幾個程式碼片能運行了,你就獲得了很多東西,同時也希望志同道合的小夥伴加我微信,共同進步!哈哈我的微訊號歡迎私聊哦~