Scrapy抓手機App數據(今日頭條)
Scrapy第四篇:APP抓取 | 存入MongoDB
咳咳,大家別誤會哈,標題不想搞什麼大新聞,恰巧是「今日頭條」爬蟲而已。。。
以前抓的都是網頁端的數據,今天,我們來抓一抓手機App中的數據道理其實非常簡單,抓包調用Api,只不過依靠一個神器 — fiddler
我們要抓的是這個(其實也很巧,周五上課的時候偶爾刷刷看到的,評論2萬多很驚訝)
但是查看後才發現,只顯示兩頁數據,抓包結果也是如此,於是嘗試App
基本配置:
Python: 2.7.13
Pycharm: pycharm-community-2016.3.2.exe
手機:Andriod系統
電腦:win8系統
一、首先用fiddler抓包
1、搜索fiddler並下載安裝
2、一些設置
有點長就不啰嗦了,大家可以參考以下博文:
抓包工具Fidder詳解(主要來抓取Android中app的請求)
Fiddler工具使用-抓取https請求
幾個要點:
基本設置及https請求,獲取本機ip地址用ipconfig命令,特別注意手機抓包需要勾選上 Allow remote computers to connect,安裝證書,注意wifi連接是為了保證手機電腦連相同的網,手動設置代理伺服器
還有一些地方可能根據手機型號不一樣,設置不一的,大家自己靈活變通一下咯~
3、fiddler抓今日頭條
其實平時不玩頭條,所以先下載安裝一個App,登錄後並定位到該條新聞
定位到評論,下拉並抓包然後就是下面這樣
URL粘貼到瀏覽器,果然如此
由fiddler的response body部分,可以清晰地看到json數據的結構
通過抓包獲取的URL是這樣的:
http://lf.snssdk.com/article/v2/tab_comments/?group_id=6389542758708675073&item_id=6389542758708675073&aggr_type=1&count=20&offset=0&tab_index=0&iid=9659309930&device_id=25691803112&ac=wifi&channel=vivo&aid=13&app_name=news_article&version_code=609&version_name=6.0.9&device_platform=android&ab_version=116029%2C112577%2C120222%2C101786%2C120542%2C119380%2C110341%2C113607%2C119525%2C106784%2C113608%2C120243%2C119889%2C105610%2C120212%2C120459%2C104323%2C120641%2C112578%2C115571%2C120419%2C31646%2C121005%2C118216%2C114338&ab_client=a1%2Cc4%2Ce1%2Cf2%2Cg2%2Cf7&ab_group=100170&ab_feature=94563%2C102749&abflag=3&ssmix=a&device_type=vivo+V3Max+A&device_brand=vivo&language=zh&os_api=22&os_version=5.1.1&uuid=862545038604758&openudid=f96595e789672db8&manifest_version_code=609&resolution=1080*1920&dpi=480&update_version_code=6091&_rticket=1492784667138n
老長了呢,不過這個http://lf.snssdk.com 確實和網頁端不一樣。tab_comments即評論,group_id和item_id為每一條新聞特殊地址代號。count容易理解,一頁json數據包含20項評論。offset即為開始,後面就是一些亂七八糟的手機型號之類。
由上還可精簡,去掉一些不必要的欄位,最後變成這樣:
url=http://lf.snssdk.com/article/v2/tab_comments/?group_id=6389542758708675073&offset=+str(i)n
為了方便計數,開頭設置一個全局變數Num
spiders部分這裡就不貼代碼了,單層次頁面抓取,easy,你懂的
class Myspider(scrapy.Spider):n name=TouTiaon allowed_domains=[snssdk.com]n Num=1 n
settings部分模擬手機抓的包,
模擬請求,就像模擬瀏覽器一樣
# -*- coding: utf-8 -*-nnBOT_NAME = TouTiaonSPIDER_MODULES = [TouTiao.spiders]nNEWSPIDER_MODULE = TouTiao.spidersnnROBOTSTXT_OBEY = FalsenCONCURRENT_REQUESTS = 16nDOWNLOAD_DELAY = 2nCOOKIES_ENABLED = Falsennn#headers填抓包的信息,特別是User_agent這一塊nDEFAULT_REQUEST_HEADERS = {n Accept-Encoding:gzip,n Connection:keep-alive,n User_agent:Dalvik/2.1.0 (Linux; U; Android 5.1.1; vivo V3Max A Build/LMY47V)n}nnITEM_PIPELINES = {TouTiao.pipelines.ToutiaoPipeline: 300}n
二、存儲
1)首先存入Excel
既然我們上面已經設置了全局變數Num,在items裡面添加一個item[Num],完美(^_^)!
# -*- coding: utf-8 -*-nimport xlwtnnclass ToutiaoPipeline(object):n def __init__(self):n self.book=xlwt.Workbook()n self.sheet=self.book.add_sheet(sheet, cell_overwrite_ok=True)n head=[u名字, u點贊, u回復, u評論]n i=0n for h in head:n self.sheet.write(0, i, h)n i += 1nn def process_item(self,item,spider):n self.sheet.write(item[Num],0,item[name])n self.sheet.write(item[Num],1,item[like])n self.sheet.write(item[Num],2,item[reply])n self.sheet.write(item[Num],3,item[text])n self.book.save(TouTiao.xls)n
結果就是這樣:
說好的2.6萬的評論呢,為什麼只有1000多?
把App評論翻了個底兒朝天,仔細比對了下,沒有錯。把回複數量加上來也不對。
聰明的盆友可以告訴我一下為什麼么。。。
2)存入Mongodb
存入excel確實簡單,但數據量很大時打開會很卡,而且不是每次數據都這麼規整呢。
也該學點新東西了,聽說MongoDB這種非關係型資料庫很不錯,於是入坑。
首先官網下載(自己動手,豐衣足食嘿嘿~)
MongoDB基本語法 可參考:
爬蟲入門到精通-mongodb的基本使用
MongoDB安裝配置 可參考:圖解Windows下MongoDB的安裝過程及基本配置_百度經驗
踩過坑的人才知道,以上真的是最好的參考,沒有之一(我在這裡輾轉了加起來都快1天,說多了都是淚啊。。。)
安裝配置過程幾個坑,記錄補充下:
輸入如下命令,啟動MongoDB
啟動成功的幾個標誌:
1、看到 waiting for connections....
2、運行mongo.exe出現這樣(而不是閃退)3、在瀏覽器地址欄里輸入 http://127.0.0.1:27017 ,出現這樣
最後配置windows出錯困擾了好一會兒,查到一個帖子:
Mongodb安裝後在cmd下無法啟動,提示:服務名無效
改了一下,以管理員許可權打開cmd(不懂的盆友自己百度吧~)哎,感動,要哭,這一路bug太多了。。。
然後最後一步有些不一樣,可能因為我是win8系統(教程是win10)
不需要新建,直接在Path的變數值那一欄,前面加上D:MongoDBbin 即可
然後pipelines部分代碼就是這樣:
# -*- coding: utf-8 -*-n#導入settings中各種參數nfrom scrapy.conf import settingsnimport pymongonn#不要忘記在settings中修改一下ITEM_PIPELINESnclass MongoPipeline(object):n def __init__(self):n #pymongo.MongoClient連接到資料庫n connection=pymongo.MongoClient(settings[MONGODB_HOST],settings[MONGODB_PORT])n # 創建資料庫db1n db=connection[settings[MONGODB_NAME]]n # 連接到數據集toutiao,類型為dictn self.post=db[settings[MONGODB_DOCNAME]]nn def process_item(self,item,spider):n #插入數據到資料庫n #update方法實現有效去重n self.post.update({text:item[text]},{$set:dict(item)},upsert=True)n print u插入成功!n return item n
結果就是這樣:
這裡藉助了robomongo,一款MongoDB可視化軟體,使用方法非常簡單,大家也可以試試由於抓取的時間不相同,存入excel和MongoDB,數據有些差異
三、總結:
總結下本節我們都幹了什麼:
1、各種安裝配置問題和基礎知識:
fiddler、MongoDB
2、Scrapy手機App數據抓取——fiddler抓包
3、存儲:存入Excel,存入MongoDB
忘了說了,整個文件結構就是下面這樣。
存入MongoDB為主。存入excel的分別設置settings1、pipelines1,並置於與entrypoint同一目錄(方便替換,不影響運行嘿嘿~)
本來還想數據分析一塊講的,發現太多了,留到下次啦~
完整版代碼:github 地址
本篇就是這樣了~
推薦閱讀:
※python生成器到底有什麼優點?
※python中 字元串是怎麼比較大小的?
※蕭井陌培訓班效果如何?
※Python 設計模式初探