美文网首页
基于中间人截获的抖音爬虫

基于中间人截获的抖音爬虫

作者: Q_12138 | 来源:发表于2018-09-11 22:56 被阅读0次

    最近刚好有一个爬抖音的小需求(根据某关键字爬全部信息),网上找的都不是很满足自己的需求(或者说网页改版了),自己写了个比较通用(laji)的,有破解了抖音签名的能发我一份就更好了(不知羞耻脸)。

    环境 :python3.x + requests + mitmproxy

    首先配置好mitmproxy(不知道如何配置的看这里),抖音是HTTPs请求,所以也配好证书,抓包分析,这里不得不提到的一点是windows是用不了mitmproxy命令的,好在作者考虑到了,给了mitmweb,以及mitmdump,这里选择mitmweb便于分析:

    抓包分析
    这里抓包有个小技巧,我们是按照关键字搜索,所以一般链接里面会有search字段,搜索search就好。
    点开还有search标记的链接,果然就是我们想要的数据:
    请求数据
    用工具重新请求:
    请求后的数据
    ok,想要的字段都在里面了。链接刷新几次果然就GG了:
    多次请求后返回的数据
    经多次验证,有三个字段是必须且不知道怎么生成的,好吧,我要的数据也不是很多,暂时通过这种中间截获在再解析的方式就够了。那么怎么拿到截获的数据呢?总不能每次都保存网页吧?这就是我选择mitmproxy的原因了,它是基于python的,且很容易进行中间的数据处理。详细说明请看这里
    这里我们需要用到response事件进行截获后的数据处理就可以了,具体代码:
    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') #点赞数
                    result['comment_count'] = item.get('statistics').get('comment_count') #评论次数
                    result['share_count'] = item.get('statistics').get('share_count') #分享次数
                    result['info'] = item.get('desc') #视频说明
                    if mongo.find(result) is None:
                        mongo.insert(result)
                        self.save_to_csv(result)
    

    代码很简单,找到正常请求完的url所对应的数据进行解析就好,,最好不要像我上面那样都写在一起,这会导致手机页面卡在那等我处理完,可以拿出来解析,但是问题不大(主要是我懒)。
    然后照着上面教程,加个 addons.py

    import spider
    
    addons = [
       spider.Spider()
    ]
    

    cmd到当前目录,运行mitmdump -s addons.py,拿着手机不停滑动,大功告成。

    数据
    目前只实现半自动的,有兴趣的小伙伴可以试试加上appium实现全自动。
    github链接

    相关文章

      网友评论

          本文标题:基于中间人截获的抖音爬虫

          本文链接:https://www.haomeiwen.com/subject/ndxpgftx.html