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

老長了呢,不過這個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、在瀏覽器地址欄里輸入 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 設計模式初探

TAG:scrapy | Python | 爬虫 |