Scrapy抓手機App數(shù)據(jù)(存入MongoDB )

Scrapy第四篇:APP抓取 | 存儲入MongoDB

</br>
咳咳,大家別誤會哈,標題并不想搞什么大新聞,恰巧是“今日頭條”爬蟲而已。。。

以前抓的都是網(wǎng)頁端的數(shù)據(jù),今天,我們來抓一抓手機App中的數(shù)據(jù)
道理其實非常簡單,抓包調(diào)用Api,只不過依靠一個神器 — fiddler
</br>
我們要抓的是這個(其實也很巧,周五上課的時候偶爾刷刷看到的,評論2萬多很驚訝) 但是查看后才發(fā)現(xiàn),只顯示兩頁數(shù)據(jù),抓包結果也是如此,于是嘗試App


</br>

基本配置

Python: 2.7.13
Pycharm: pycharm-community-2016.3.2.exe
手機:Andriod系統(tǒng)
電腦:win8系統(tǒng)
</br>
</br>

一、首先用fiddler抓包

1、搜索fiddler并下載安裝
2、一些設置
有點長就不啰嗦了,大家可以參考以下博文:
抓包工具Fidder詳解(主要來抓取Android中app的請求)
Fiddler工具使用-抓取https請求

幾個要點:
基本設置及https請求,獲取本機ip地址用ipconfig命令,特別注意手機抓包需要勾選上 Allow remote computers to connect,安裝證書,注意wifi連接是為了保證手機電腦連相同的網(wǎng),手動設置代理服務器
還有一些地方可能根據(jù)手機型號不一樣,設置不一的,大家自己靈活變通一下咯~
</br>
3、fiddler抓今日頭條
其實平時不玩頭條,所以先下載安裝一個App,登錄后并定位到該條新聞

定位到評論,下拉并抓包

然后就是下面這樣


URL粘貼到瀏覽器,果然如此


由fiddler的response body部分,可以清晰地看到json數(shù)據(jù)的結構



</br>
通過抓包獲取的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=1492784667138

</br>

老長了呢,不過這個http://lf.snssdk.com確實和網(wǎng)頁端不一樣。tab_comments即評論,group_id和item_id為每一條新聞特殊地址代號。count容易理解,一頁json數(shù)據(jù)包含20項評論。offset即為開始,后面就是一些亂七八糟的手機型號之類。

由上還可精簡,去掉一些不必要的字段,最后變成這樣:

url='http://lf.snssdk.com/article/v2/tab_comments/?group_id=6389542758708675073&offset='+str(i)

</br>
為了方便計數(shù),開頭設置一個全局變量Num
spiders部分這里就不貼代碼了,單層次頁面抓取,easy,你懂噠~

class Myspider(scrapy.Spider):
    name='TouTiao'
    allowed_domains=['snssdk.com'] 
    Num=1

</br>
settings部分模擬手機抓的包,模擬請求,就像模擬瀏覽器一樣

# -*- coding: utf-8 -*-
BOT_NAME = 'TouTiao'
SPIDER_MODULES = ['TouTiao.spiders']
NEWSPIDER_MODULE = 'TouTiao.spiders'

ROBOTSTXT_OBEY = False
CONCURRENT_REQUESTS = 16
DOWNLOAD_DELAY = 2
COOKIES_ENABLED = False

#headers填抓包的信息,特別是User_agent這一塊
DEFAULT_REQUEST_HEADERS = {
'Accept-Encoding':'gzip',
'Connection':'keep-alive',
'User_agent':'Dalvik/2.1.0 (Linux; U; Android 5.1.1; vivo V3Max A Build/LMY47V)'}

ITEM_PIPELINES = {'TouTiao.pipelines.ToutiaoPipeline': 300}

</br>
</br>

二、存儲

1)首先存入Excel
既然我們上面已經(jīng)設置了全局變量Num,在items里面添加一個item['Num'],簡直完美(_)!

# -*- coding: utf-8 -*-
import xlwt

class ToutiaoPipeline(object):
    def __init__(self):
        self.book=xlwt.Workbook()
        self.sheet=self.book.add_sheet('sheet', cell_overwrite_ok=True)
        head=[u'名字', u'點贊', u'回復', u'評論']
        i=0
        for h in head:
            self.sheet.write(0, i, h)
            i += 1

    def process_item(self,item,spider):
        self.sheet.write(item['Num'],0,item['name'])
        self.sheet.write(item['Num'],1,item['like'])
        self.sheet.write(item['Num'],2,item['reply'])
        self.sheet.write(item['Num'],3,item['text'])
        self.book.save('TouTiao.xls')

</br>
結果就是這樣:


說好的2.6萬的評論呢,為什么只有1000多?
把App評論翻了個底兒朝天,仔細比對了下,沒有錯。把回復數(shù)量加上來也不對。
聰明的盆友可以告訴我一下為什么么。。。


</br>
</br>
2)存入Mongodb
存入excel確實簡單,但數(shù)據(jù)量很大時打開會很卡,而且不是每次數(shù)據(jù)都這么規(guī)整呢。
也該學點新東西了,聽說MongoDB這種非關系型數(shù)據(jù)庫很不錯,于是入坑。

首先官網(wǎng)下載(自己動手,豐衣足食~)
MongoDB基本語法可參考:
爬蟲入門到精通-mongodb的基本使用
MongoDB安裝配置可參考:
圖解Windows下MongoDB的安裝過程及基本配置_百度經(jīng)驗

踩過坑的人才知道,以上真的是最好的參考,沒有之一
(我在這里輾轉了加起來都快1天,說多了都是淚啊。。。)


</br>
安裝配置過程幾個坑,記錄補充下:

輸入如下命令,啟動MongoDB


啟動成功的幾個標志

1、看到 waiting for connections....


2、運行mongo.exe出現(xiàn)下面這樣(而不是閃退)


3、在瀏覽器地址欄里輸入http://127.0.0.1:27017/,出現(xiàn)這樣


</br>
最后配置windows出錯

</br>
困擾了好一會兒,查到一個帖子:Mongodb安裝后在cmd下無法啟動,提示:服務名無效
改了一下,以管理員權限打開cmd(不懂的盆友自己百度吧~)
哎,感動,要哭,這一路bug太多了。。。


然后最后一步有些不一樣,可能因為我是win8系統(tǒng)(教程是win10)
不需要新建,直接在Path的變量值那一欄,前面加上D:\MongoDB\bin 即可

</br>
然后pipelines部分代碼就是這樣:
# -- coding: utf-8 --
#導入settings中各種參數(shù)
from scrapy.conf import settings
import pymongo

#不要忘記在settings中修改一下ITEM_PIPELINES
class MongoPipeline(object):
    def __init__(self):
        #pymongo.MongoClient連接到數(shù)據(jù)庫
        connection=pymongo.MongoClient(settings['MONGODB_HOST'],settings['MONGODB_PORT'])
        # 創(chuàng)建數(shù)據(jù)庫'db1'
        db=connection[settings['MONGODB_NAME']]
        # 連接到數(shù)據(jù)集'toutiao',類型為dict
        self.post=db[settings['MONGODB_DOCNAME']]

    def process_item(self,item,spider):
        #插入數(shù)據(jù)到數(shù)據(jù)庫
        #update方法實現(xiàn)有效去重
        self.post.update({'text':item['text']},{'$set':dict(item)},upsert=True)
        print u'插入成功!'
        return item  

</br>
結果就是這樣:


這里借助了robomongo,一款MongoDB可視化軟件,使用方法非常簡單,大家也可以試試。由于抓取的時間不相同,存入excel和MongoDB,數(shù)據(jù)有些差異。

</br>
</br>

三、總結:

總結下本節(jié)我們都干了什么:
1、各種安裝配置問題和基礎知識:fiddler、MongoDB
2、Scrapy手機App數(shù)據(jù)抓取——fiddler抓包
3、存儲:存入Excel,存入MongoDB

忘了說了,整個文件結構就是下面這樣。
以存入MongoDB為主。存入excel的分別設置settings1、pipelines1,并置于與entrypoint同一目錄(方便替換,不影響運行嘿嘿~)

本來還想數(shù)據(jù)分析一塊講的,發(fā)現(xiàn)太多了,留到下次啦~


</br>
完整版代碼:github地址
本篇就是這樣了~

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容