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地址
本篇就是這樣了~