最近剛好有一個(gè)爬抖音的小需求(根據(jù)某關(guān)鍵字爬全部信息),網(wǎng)上找的都不是很滿足自己的需求(或者說網(wǎng)頁改版了),自己寫了個(gè)比較通用(laji)的浮定,有破解了抖音簽名的能發(fā)我一份就更好了(不知羞恥臉)揽涮。
環(huán)境 :python3.x + requests + mitmproxy
首先配置好mitmproxy(不知道如何配置的看這里)狸窘,抖音是HTTPs請求钟些,所以也配好證書烟号,抓包分析,這里不得不提到的一點(diǎn)是windows是用不了mitmproxy命令的厘唾,好在作者考慮到了褥符,給了mitmweb龙誊,以及mitmdump抚垃,這里選擇mitmweb便于分析:
這里抓包有個(gè)小技巧,我們是按照關(guān)鍵字搜索趟大,所以一般鏈接里面會有search字段鹤树,搜索search就好。
點(diǎn)開還有search標(biāo)記的鏈接逊朽,果然就是我們想要的數(shù)據(jù):
用工具重新請求:
ok罕伯,想要的字段都在里面了。鏈接刷新幾次果然就GG了:
經(jīng)多次驗(yàn)證叽讳,有三個(gè)字段是必須且不知道怎么生成的追他,好吧,我要的數(shù)據(jù)也不是很多岛蚤,暫時(shí)通過這種中間截獲在再解析的方式就夠了邑狸。那么怎么拿到截獲的數(shù)據(jù)呢?總不能每次都保存網(wǎng)頁吧涤妒?這就是我選擇mitmproxy的原因了单雾,它是基于python的,且很容易進(jìn)行中間的數(shù)據(jù)處理。詳細(xì)說明請看這里
這里我們需要用到response事件進(jìn)行截獲后的數(shù)據(jù)處理就可以了硅堆,具體代碼:
import mitmproxy.http
from mitmproxy import ctx, http
import urllib
import json
class Spider(object):
def __init__(self):
pass
def response(self, flow: mitmproxy.http.HTTPFlow):
url = urllib.parse.unquote(flow.request.url)
ctx.log.info(url)
if 'api.amemv.com/aweme/v1/general/search/?' in url or 'api.amemv.com/aweme/v1/search/' in url:
response = flow.response.get_text()
self.parse_response(response)
else:
return
def parse_response(self,response):
response = json.loads(response)
items = response.get('aweme_list')
if items:
for item in items:
result = {}
unique_id = item.get('author').get('unique_id')
if unique_id:
result['id'] = unique_id #抖音號
else:
result['id'] = item.get('author').get('short_id')
result['nickname'] = item.get('author').get('nickname') #用戶名
result['url'] = item.get('share_url') #小視頻鏈接
result['like_num'] = item.get('statistics').get('digg_count') #點(diǎn)贊數(shù)
result['comment_count'] = item.get('statistics').get('comment_count') #評論次數(shù)
result['share_count'] = item.get('statistics').get('share_count') #分享次數(shù)
result['info'] = item.get('desc') #視頻說明
if mongo.find(result) is None:
mongo.insert(result)
self.save_to_csv(result)
代碼很簡單屿储,找到正常請求完的url所對應(yīng)的數(shù)據(jù)進(jìn)行解析就好,渐逃,最好不要像我上面那樣都寫在一起够掠,這會導(dǎo)致手機(jī)頁面卡在那等我處理完,可以拿出來解析朴乖,但是問題不大(主要是我懶)祖屏。
然后照著上面教程,加個(gè) addons.py
import spider
addons = [
spider.Spider()
]
cmd到當(dāng)前目錄买羞,運(yùn)行mitmdump -s addons.py袁勺,拿著手機(jī)不停滑動畜普,大功告成期丰。
目前只實(shí)現(xiàn)半自動的,有興趣的小伙伴可以試試加上appium實(shí)現(xiàn)全自動吃挑。
github鏈接