精华内容
下载资源
问答
  • 抖音爬虫从0到1-第一弹:环境配置 抖音爬虫从0到1-第二弹:获取抖音用户数据 文章目录前言一、分析请求用户数据的api1. 用户数据抓包2. 用户数据包分析2.1. 首先我们看一下请求头二、获取用户数据1.构造请求api2. ...
     相关文章: 
    


    抖音 x-gorgon 03 免费生成接口 抖音6.3.0版本

    抖音爬虫从0到1-第一弹:环境配置

    抖音爬虫从0到1-第二弹:获取抖音用户数据


    前言

    前面介绍了分析了抖音请求header中的X-gorgon的获取方法,同时在分析获取抖音用户数据的时候,我们发现爬取抖音用户的数据需要使用用户的user_id和sec_user_id,我们通过抓包工具获取用户的id以及sec_user_id,然后通过用户的关注列表和follow列表获取更多的用户的user_id和sec_user_id,下面我将介绍一下如何根据user_id和sec_user_id来获取抖音用户的详细数据。


    一、分析请求用户数据的api

    1. 用户数据抓包

    首先在搭建好的环境中通过Fiddle抓取用户数据包。
    用户数据抓包

    数据包

    2. 用户数据包分析

    2.1. 请求信息分析

    请求头

    • 请求头字段
    字段字段值
    请求方法GET
    请求的apiGET后面的
    请求的协议api后面的,系http1.1
    请求的目的主机域名aweme-eagle.snssdk.com
    连接信息keep-alive
    Cookie你自己的cookies
    Accept-Encoding 编码信息gzip
    X-SS-QUERIES请求的query
    token你自己的token
    sdk版本1
    User-Agent用户代理
    X-Khronos咱也不知道是啥,但是本质上就是个时间戳
    X-Gorgon加密验证的部分,获取方法如前文
    X-Pods咱也不知道是啥,但是貌似没有用
    • 请求的api分析

    api
    我们知道了请求的api以及请求头里面都包含了哪些信息,我们就可以通过手动构造对应的请求参数来爬取用户的数据了。我已经在前面的文章获取到了1W+ 的用户的uid以及sec_user_id的数据了,然后我们就可以通过这些数据来爬取用户的详细数据(数据可以在微信公众号里面获取)。

    2.2. 响应信息分析

    响应数据0
    响应数据1
    响应数据2
    响应数据3

    二、获取用户数据

    1.构造请求api

    在文章抖音爬虫从0到1-第二弹:获取抖音用户数据 我们已经介绍了爬取抖音关注列表的api及其构造方法,其实获取用户详细信息和获取用户的关注列表的api基本一致,主要都是需要我们自行填充用户的user_id以及用户的sec_user_id还有一大堆的时间戳信息,其他的信息都是不变的。下面我们构造获取用户详细信息的api
    对应的api构造函数

    def construct_api(user_id, _rticket, ts, sec_user_id):
          """
          api 构造函数
          :param user_id: 用户的id
          :param _rticket: 时间戳
          :param ts: 时间戳
          :param sec_user_id: 用户的加密的id
          :return: api
          """
          api = "https://aweme-eagle.snssdk.com" \
                "/aweme/v1/user/?" \
                "user_id={}" \
                "&retry_type=no_retry" \
                "&iid=18468154xxxx40845" \
                "&device_id=4701xxxx7444" \
                "&ac=wifi&channel=wandoujia_aweme1" \
                "&aid=1128&app_name=aweme" \
                "&version_code=630" \
                "&version_name=6.3.0" \
                "&device_platform=android" \
                "&ssmix=a&device_type=HUAWEI+NXT-AL10" \
                "&device_brand=HUAWEI&language=zh" \
                "&os_api=26&os_version=8.0.0" \
                "&openudid=b202a2xxxx8c1538a" \
                "&manifest_version_code=630" \
                "&resolution=1080*1812" \
                "&dpi=480&update_version_code=6302" \
                "&_rticket={}" \
                "&js_sdk_version=1.16.3.5" \
                "&ts={}" \
                "&sec_user_id={}" \
                "".format(user_id, _rticket, ts, sec_user_id)
          return api
    

    2.构造请求头

    上文我们已经分析了请求头,请求头的构造也比较方便,大部分内容都是固定的,需要我们填充的主要还是几个时间戳以及对应的X-Gorgon,其中X-Gorgon的构造方法比较复杂,在文章“抖音 x-gorgon 03 免费生成接口 抖音6.3.0版本”中我已经提供了一个生成X-Gorgon的接口,但是要注意填入正确的Cookie和Token你才能获得可用的X-Gorgon,否则你的Gorgon就是不可用的。下图是请求头里面的主要信息:
    请求头
    下面我写了一个构造请求头的函数:

    def construct_header(user_id, sec_user_id, cookie, query, token, user_agent, _rticket, ts):
          """
          构造请求头,需要传入的参数如下
          :param user_id: 要爬取的用户的uid
          :param sec_user_id: 要爬取的用户的加密的id
          :param cookie: cookie
          :param query: 请求的query
          :param token: 你的token
          :param user_agent: 请求的user_agent
          :param _rticket: 时间戳(毫秒级)
          :param ts: 时间戳(秒级)
          :return: 构造好的请求头:headers
          """
          api = construct_api(user_id, _rticket, ts, sec_user_id)
    
          headers = {
                "Host": "aweme-eagle.snssdk.com",
                "Connection": "keep-alive",
                "Cookie": cookie,
                "Accept-Encoding": "gzip",
                "X-SS-QUERIES": query,
                "X-SS-REQ-TICKET": _rticket,
                "X-Tt-Token": token,
                "sdk-version": "1",
                "User-Agent": user_agent
          }
          x_gorgon = get_gorgon(api, cookie, token, query)
          headers["X-Khronos"] = ts
          headers["X-Gorgon"] = x_gorgon
          print(headers)
          return headers
    
    
    def get_gorgon(url, cookies, token, query):
          """
          获取headers里面的X-Gorgon
          :param url: 请求的api
          :param cookies: 你的cookie
          :param token: 你的token
          :param query: 你的query
          :return: gorgon
          """
          # 发起请求获取X-Gorgon
          headers = {
                "dou-url": url,  # 填写对应的请求的api
                "dou-cookies": cookies,  # 填写你的cookies
                "dou-token": token,  # 填写你的token
                "dou-queries": query  # 填写你的请求的queries
          }
          gorgon_host = "http://8.131.59.252:8080"
          res = requests.get(gorgon_host, headers=headers)
          gorgon = ""
          if res.status_code == 200:
                print("请求成功")
                res_gorgon = json.loads(res.text)
                if res_gorgon.get("status") == 0:
                      print("成功获取 X-Gorgon")
                      print(res_gorgon.get("X-gorgon"))  # 你就可以用来爬数据了
                      gorgon = res_gorgon.get("X-gorgon")
                else:
                      print("获取 X-Gorgon 失败")
                      print(res_gorgon.get("reason"))
                      raise ValueError(res_gorgon.get("reason"))
    
          else:
                print("请求发送错误/可能是你的网络错误,也可能是我的错误,但是大概率是你那边的错误")
                raise ValueError("请求发送错误/可能是你的网络错误,也可能是我的错误,但是大概率是你那边的错误")
          return gorgon
    

    3. 请求头弄好了我们就可以获取用户数据了

    def get_user_detail_info(cookie, query, token, user_agent, user_id, sec_user_id):
          """
          爬取用户数据
          :param cookie: 你自己的cookie
          :param query: 你自己的query
          :param token: 你自己的token
          :param user_agent: 你自己的User-Agent
          :param user_id: 用户的uid
          :param sec_user_id: 用户的加密的uid
          :return: response
          """
          _rticket = str(time.time() * 1000).split(".")[0]
          ts = str(time.time()).split(".")[0]
          
          api = construct_api(user_id, _rticket, ts, sec_user_id)
          headers = construct_header(user_id, sec_user_id, cookie, query, token, user_agent, _rticket, ts)
          print(api)
          req = request.Request(api)
          for key in headers:
                req.add_header(key, headers[key])
    
          with request.urlopen(req) as f:
                data = f.read()
          return gzip.decompress(data).decode()
    

    4. 解析用户数据

    根据上面对响应数据的分析,其对应的响应数据是json格式的,而且数据特别多,分析了一下,我找了一些对我比较有用的数据:

    # 用户的抖音号
    unique_id=345345345O
    # 用户的user_id
    uid=103600654544
    # 用户的 sec_user_id
    sec_uid=MS4wLjABAAAA2_HUlxau0riJ8UBMwyd_bUtA8yzKdWepfg9nUc5wQy0
    # 头像地址
    avatar_uri=26e880003aefb8cddd496
    # 用户的昵称
    nickname=成都潮人榜
    # 用户的签名
    signature=谢谢关注❤
    # 用户的出生日期
    birthday=1995-01-01
    # 用户的国家
    country=中国
    # 用户的省份
    province=四川
    # 用户的城市
    city=成都
    # 用户所在的区域
    district=武侯
    # 用户的粉丝数
    follower_count=929219
    # 用户的关注数
    following_count=15
    # 发布的抖音数量
    aweme_count=453
    # 发布的动态数量
    dongtai_count=480
    # 用户点赞的视频数
    favoriting_count=322
    # 总共被点赞的次数
    total_favorited=14900700
    

    5. 下面就可以爬取数据了

    if __name__ == '__main__':
        cookie = "" # 你自己的cookie
        token = "" # 你自己的token
        query = "" # 你自己的query
        user_agent = "" # 你自己的user-agent
    
        user_id = 103600654544
        sec_user_id = "MS4wLjABAAAA2_HUlxau0riJ8UBMwyd_bUtA8yzKdWepfg9nUc5wQy0"
    
        res = get_user_detail_info(cookie,query, token, user_agent, user_id, sec_user_id)
        print(res)
    

    三、总结

    以上就是爬取用户信息的全部内容,完整代码可以关注公众号获取。码字不易,还请点赞关注,有任何问题请留言,或者关注下方微信公众号获取抖音安装包以及Fiddle安装包等。

    last but not least

    任何问题,或者想要获取对应的抖音APK抓包软件或者相关代码,可以关注下方公众号留言,我会及时倾尽所有问您解答
    公众号是:kedalongkeai

    last and least

    如果文章对你有用并且恰好您也手头富裕,可以考虑捐赠一毛钱,我可以升级服务器。
    嘻嘻嘻

    展开全文
  • 一、爬虫与反爬简介 爬虫就是我们利用某种程序代替人工批量读取、获取网站上的资料信息。而反爬则是跟爬虫的对立面,是竭尽全力阻止非人为的采集网站信息,二者相生相克,水火不容,到目前为止大部分的网站都还是...

    一、爬虫与反爬简介

    爬虫就是我们利用某种程序代替人工批量读取、获取网站上的资料信息。而反爬则是跟爬虫的对立面,是竭尽全力阻止非人为的采集网站信息,二者相生相克,水火不容,到目前为止大部分的网站都还是可以轻易的爬取资料信息。

    PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

    python免费学习资料以及群交流解答点击即可加入

    爬虫想要绕过被反的策略就是尽可能的让服务器人你不是机器程序,所以在程序中就要把自己伪装成浏览器访问网站,这可以极大程度降低被反的概率,那如何做到伪装浏览器呢?

    1.可以使用请求头(headers)来掩饰自己,其中最常用的就是User Agent(中文名为用户代理),是Http协议中的一部分,属于头域的组成部分,User Agent也简称 UA 。它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识;表示当前访问服务器的身份信息,如果同一个身份过于频繁的访问服务器会被识别为机器身份,遭到反爬的打击,所以需要频繁的更改User-Agent信息;一般User-Agent字段包括以下几个信息:浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识 版本信息;

    2.使用不同的User-Agent来规避反爬策略

    比如:

    • Accept:客户端支持的数据类型,用逗号隔开,是有顺序的,分号前面是主类型,分号后是子类型;

    • Accept-Encoding:指定浏览器可以支持的web服务器返回内容压缩编码类型;

    • Accept-Language:浏览器可接受的自然语言的类型;

    • Connection:设置HTTP连接的持久化,通常都是Keep-Alive;

    • Host:服务器的域名或IP地址,如果不是通用端口,还包含该端口号;

    • Referer:指当前请求的URL是在什么地址引用的;

    user_agent_list = [
        "Opera/9.80 (X11; Linux i686; U; hu) Presto/2.9.168 Version/11.50",
        "Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11",
        "Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.8.131 Version/11.11",
        "Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/5.0 Opera 11.11",
        "Opera/9.80 (X11; Linux x86_64; U; bg) Presto/2.8.131 Version/11.10",
        "Opera/9.80 (Windows NT 6.0; U; en) Presto/2.8.99 Version/11.10",
        "Opera/9.80 (Windows NT 5.1; U; zh-tw) Presto/2.8.131 Version/11.10",
        "Opera/9.80 (Windows NT 6.1; Opera Tablet/15165; U; en) Presto/2.8.149 Version/11.1",
        "Opera/9.80 (X11; Linux x86_64; U; Ubuntu/10.10 (maverick); pl) Presto/2.7.62 Version/11.01",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36",
        "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0",
        "Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16",
        "Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14",
        "Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14",
        "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14",
        "Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02",
        "Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00",
        "Opera/9.80 (Windows NT 5.1; U; zh-sg) Presto/2.9.181 Version/12.00",
        "Opera/12.0(Windows NT 5.2;U;en)Presto/22.9.168 Version/12.00",
        "Opera/12.0(Windows NT 5.1;U;en)Presto/22.9.168 Version/12.00",
        "Mozilla/5.0 (Windows NT 5.1) Gecko/20100101 Firefox/14.0 Opera/12.0",
        "Opera/9.80 (Windows NT 6.1; WOW64; U; pt) Presto/2.10.229 Version/11.62",
        "Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62",
        "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
        "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; de) Presto/2.9.168 Version/11.52",
        "Opera/9.80 (Windows NT 5.1; U; en) Presto/2.9.168 Version/11.51",
        "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; de) Opera 11.51",
        "Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50",
    ]
    referer_list = ["https://www.test.com/", "https://www.baidu.com/"]

    获取随机数,即每次采集都会根据随机数提取随机用户代理、引用地址(注:若有多个页面循环采集,最好采集完单个等待个几秒钟再继续采集,减小服务器的压力。):

    import random
    import re, urllib.request, lxml.html
    import requests
    import time, random
    
    def get_randam(data):
        return random.randint(0, len(data)-1)
    def crawl():
        headers = {
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
            'Accept-Encoding': 'gzip, deflate',
            'Accept-Language': 'zh-CN,zh;q=0.9',
            'Connection': 'keep-alive',
            'host': 'test.com',
            'Referer': 'https://test.com/',
        }
        random_index = get_randam(user_agent_list)
        random_agent = user_agent_list[random_index]
        headers['User-Agent'] = random_agent
        random_index_01 = get_randam(referer_list)
        random_agent_01 = referer_list[random_index_01]
        headers['Referer'] = random_agent_01
        session = requests.session()
        url = "https://www.test.com/"
        html_data = session.get(url, headers=headers, timeout=180)
        html_data.raise_for_status()
        html_data.encoding = 'utf-8-sig'
        data = html_data.text
        data_doc = lxml.html.document_fromstring(data)
        ...(对网页数据进行解析、提取、存储等)
        time.sleep(random.randint(3, 5))

    3.使用代理IP来规避反爬:同一个ip大量请求了对方服务器,有更大的可能性会被识别为爬虫,ip就有可能被暂时被封。

    根据代理ip的匿名程度,代理ip可以分为下面四类:

    • 透明代理(Transparent Proxy)Transparent Proxy):透明代理虽然可以直接“隐藏”你的IP地址,但是还是可以查到你是谁。

    • 匿名代理(Anonymous Proxy):匿名代理比透明代理进步了一点:别人只能知道你用了代理,无法知道你是谁。

    • 混淆代理(Distorting Proxies):与匿名代理相同,如果使用了混淆代理,别人还是能知道你在用代理,但是会得到一个假的IP地址,伪装的更逼真

    • 高匿代理(Elite proxy或High Anonymity Proxy):可以看出来,高匿代理让别人根本无法发现你是在用代理,所以是最好的选择。 在使用的使用,毫无疑问使用高匿代理效果最好

    下面我采用免费的高匿代理IP进行采集:

    #代理IP: https://www.xicidaili.com/nn
    import requests
    proxies = {
    "http": "http://117.30.113.248:9999",
    "https": "https://120.83.120.157:9999"
    }
    r=requests.get("https://www.baidu.com", proxies=proxies)
    r.raise_for_status()
    r.encoding = 'utf-8-sig'
    print(r.text)

    注意:踩坑经历,之前误把proxies里面的key设置成大写的HTTP/HTTPS,导致请求不走代理,过了几个月才发现这个问题,头皮发麻啊

    二、总结

    之前也经常写一些采集亚马逊的爬虫,但是采集没多久就被识别出来是程序爬虫,会默认跳到一个robotecheck页面,也就是叫你输入一个图片验证码,只是为了验证到底是不是人为在访问他们的网站。

    • amazon的防爬虫机制在只有ip (没有cookie) 的时候防ip,在有cookie的时候,是防ip+cookie,也即对于一个ip,一个cookie被防了可以换一个cookie。

    • 有cookie的时候触发防爬虫robotcheck的可能性小很多,触发的机制个人猜测是有叠加效应的,即一次使用同一个ip+header短时间内访问多次(1秒内访问至少3次以上)是不会触发robotecheck的,大概在积累了8到9次的短时间多访问(理由是上面很多实验都是在第9个请求后开始出现block),才会激发。而这个忍耐度在有cookie的时候会放得更宽。 所以我们在爬取某网站时,最好要做到IP轮询变换,cookie会话最好也要有,再来就是频率不要太快太频,只要控制好个度,我相信被反爬的概率会大大降低。

     

    展开全文
  • 一、爬虫与反爬简介 爬虫就是我们利用某种程序代替人工批量读取、获取网站上的资料信息。而反爬则是跟爬虫的对立面,是竭尽全力阻止非人为的采集网站信息,二者相生相克,水火不容,到目前为止大部分的网站都还是...


    一、爬虫与反爬简介
    爬虫就是我们利用某种程序代替人工批量读取、获取网站上的资料信息。而反爬则是跟爬虫的对立面,是竭尽全力阻止非人为的采集网站信息,二者相生相克,水火不容,到目前为止大部分的网站都还是可以轻易的爬取资料信息。
    爬虫想要绕过被反的策略就是尽可能的让服务器人你不是机器程序,所以在程序中就要把自己伪装成浏览器访问网站,这可以极大程度降低被反的概率,那如何做到伪装浏览器呢?

    1.可以使用请求头(headers)来掩饰自己,其中最常用的就是User Agent(中文名为用户代理),是Http协议中的一部分,属于头域的组成部分,User Agent也简称 UA 。它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识;表示当前访问服务器的身份信息,如果同一个身份过于频繁的访问服务器会被识别为机器身份,遭到反爬的打击,所以需要频繁的更改User-Agent信息;一般User-Agent字段包括以下几个信息:浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识 版本信息;
    2.使用不同的User-Agent来规避反爬策略
    比如:

    Accept:客户端支持的数据类型,用逗号隔开,是有顺序的,分号前面是主类型,分号后是子类型;
    Accept-Encoding:指定浏览器可以支持的web服务器返回内容压缩编码类型;
    Accept-Language:浏览器可接受的自然语言的类型;
    Connection:设置HTTP连接的持久化,通常都是Keep-Alive;
    Host:服务器的域名或IP地址,如果不是通用端口,还包含该端口号;
    Referer:指当前请求的URL是在什么地址引用的;
    user_agent_list = [
        "Opera/9.80 (X11; Linux i686; U; hu) Presto/2.9.168 Version/11.50",
        "Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11",
        "Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.8.131 Version/11.11",
        "Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/5.0 Opera 11.11",
        "Opera/9.80 (X11; Linux x86_64; U; bg) Presto/2.8.131 Version/11.10",
        "Opera/9.80 (Windows NT 6.0; U; en) Presto/2.8.99 Version/11.10",
        "Opera/9.80 (Windows NT 5.1; U; zh-tw) Presto/2.8.131 Version/11.10",
        "Opera/9.80 (Windows NT 6.1; Opera Tablet/15165; U; en) Presto/2.8.149 Version/11.1",
        "Opera/9.80 (X11; Linux x86_64; U; Ubuntu/10.10 (maverick); pl) Presto/2.7.62 Version/11.01",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36",
        "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0",
        "Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16",
        "Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14",
        "Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14",
        "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14",
        "Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02",
        "Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00",
        "Opera/9.80 (Windows NT 5.1; U; zh-sg) Presto/2.9.181 Version/12.00",
        "Opera/12.0(Windows NT 5.2;U;en)Presto/22.9.168 Version/12.00",
        "Opera/12.0(Windows NT 5.1;U;en)Presto/22.9.168 Version/12.00",
        "Mozilla/5.0 (Windows NT 5.1) Gecko/20100101 Firefox/14.0 Opera/12.0",
        "Opera/9.80 (Windows NT 6.1; WOW64; U; pt) Presto/2.10.229 Version/11.62",
        "Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62",
        "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
        "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; de) Presto/2.9.168 Version/11.52",
        "Opera/9.80 (Windows NT 5.1; U; en) Presto/2.9.168 Version/11.51",
        "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; de) Opera 11.51",
        "Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50",
    ]
    referer_list = ["https://www.test.com/", "https://www.baidu.com/"]

    获取随机数,即每次采集都会根据随机数提取随机用户代理、引用地址(注:若有多个页面循环采集,最好采集完单个等待个几秒钟再继续采集,减小服务器的压力。):

    import random
    import re, urllib.request, lxml.html
    import requests
    import time, random

    def get_randam(data):
        return random.randint(0, len(data)-1)
    def crawl():
        headers = {
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
            'Accept-Encoding': 'gzip, deflate',
            'Accept-Language': 'zh-CN,zh;q=0.9',
            'Connection': 'keep-alive',
            'host': 'test.com',
            'Referer': 'https://test.com/',
        }
        random_index = get_randam(user_agent_list)
        random_agent = user_agent_list[random_index]
        headers['User-Agent'] = random_agent
        random_index_01 = get_randam(referer_list)
        random_agent_01 = referer_list[random_index_01]
        headers['Referer'] = random_agent_01
        session = requests.session()
        url = "https://www.test.com/"
        html_data = session.get(url, headers=headers, timeout=180)
        html_data.raise_for_status()
        html_data.encoding = 'utf-8-sig'
        data = html_data.text
        data_doc = lxml.html.document_fromstring(data)
        ...(对网页数据进行解析、提取、存储等)
        time.sleep(random.randint(3, 5))

    3.使用代理IP来规避反爬:同一个ip大量请求了对方服务器,有更大的可能性会被识别为爬虫,ip就有可能被暂时被封。
    根据代理ip的匿名程度,代理ip可以分为下面四类:

    透明代理(Transparent Proxy)Transparent Proxy):透明代理虽然可以直接“隐藏”你的IP地址,但是还是可以查到你是谁。
    匿名代理(Anonymous Proxy):匿名代理比透明代理进步了一点:别人只能知道你用了代理,无法知道你是谁。
    混淆代理(Distorting Proxies):与匿名代理相同,如果使用了混淆代理,别人还是能知道你在用代理,但是会得到一个假的IP地址,伪装的更逼真
    高匿代理(Elite proxy或High Anonymity Proxy):可以看出来,高匿代理让别人根本无法发现你是在用代理,所以是最好的选择。
    在使用的使用,毫无疑问使用高匿代理效果最好
    下面我采用免费的高匿代理IP进行采集:

    #代理IP: https://www.xicidaili.com/nn
    import requests
    proxies = {
    "http": "http://117.30.113.248:9999",
    "https": "https://120.83.120.157:9999"
    }
    r=requests.get("https://www.baidu.com", proxies=proxies)
    r.raise_for_status()
    r.encoding = 'utf-8-sig'
    print(r.text)

    注意:踩坑经历,之前误把proxies里面的key设置成大写的HTTP/HTTPS,导致请求不走代理,过了几个月才发现这个问题,头皮发麻啊

    二、总结
    之前也经常写一些采集亚马逊的爬虫,但是采集没多久就被识别出来是程序爬虫,会默认跳到一个robotecheck页面,也就是叫你输入一个图片验证码,只是为了验证到底是不是人为在访问他们的网站。

    amazon的防爬虫机制在只有ip (没有cookie) 的时候防ip,在有cookie的时候,是防ip+cookie,也即对于一个ip,一个cookie被防了可以换一个cookie。
    有cookie的时候触发防爬虫robotcheck的可能性小很多,触发的机制个人猜测是有叠加效应的,即一次使用同一个ip+header短时间内访问多次(1秒内访问至少3次以上)是不会触发robotecheck的,大概在积累了8到9次的短时间多访问(理由是上面很多实验都是在第9个请求后开始出现block),才会激发。而这个忍耐度在有cookie的时候会放得更宽。
    所以我们在爬取某网站时,最好要做到IP轮询变换,cookie会话最好也要有,再来就是频率不要太快太频,只要控制好个度,我相信被反爬的概率会大大降低。

    展开全文
  • 抖音爬虫接口算法x03

    2021-04-29 14:28:57
    抖音各个api以及03算法 老的算法已经编译成python java js 格式 不用再调so动态层 详细 技术交流私聊

    抖音爬虫数据各个api 各个接口

    以及x03算法

    老的算法已经编译成python java js 格式 不用再调so动态层

    爬虫爬取抖音话题搜索

    爬虫爬取抖音音乐搜索

    爬虫爬取抖音视频搜索

    爬虫爬取抖音用户搜索

    爬虫爬取抖音用户信息等

    详细

    技术交流私聊

    展开全文
  • 抖音爬虫原理大揭秘

    2021-05-17 11:02:04
    最近有不少小伙伴投入短视频赛道,也出现不少第三方数据商,为大家提供抖音爬虫数据。 小伙伴们有没有好奇过,这些数据是如何获取的,普通技术小白能否也拥有自己的抖音爬虫呢? 本文会全面解密抖音爬虫的幕后原理,...
  • 最近在学习爬虫技术,就用抖音练了一下手,发现抖音爬虫并不是那么难,主要还是签名算法花了我一点时间,只要能搞定签名,要爬取哪些数据基本就迎刃而解了。 至于签名算法的实现,网上有很多文章,大家如果要自己...
  • 抖音爬虫路上的填坑之路

    千次阅读 2018-11-14 05:41:47
    1.selenium.common.exceptions.WebDriverException:  解决方法:加载chromedriver的时候,必须指明路径,形如 C:/Users/Python36/Scripts/chromedriver.exe ;如果电脑中没有Chromedrive,点击下载...
  • 抖音爬虫API加密参数

    2020-12-21 10:53:59
    使用NodeJS在做抖音数据的抓取,发现对应的API地址中出现了一个signature,见样例:https://www.douyin.com/aweme/v1/aweme/post/?user_id=17459828590&count=21&max_cursor=0&aid=1128&_signature=...
  • Python爬虫抖音榜单.py

    2020-11-21 21:57:10
    #使用requsets库的简单Python爬虫练习 #练习使用xlsxwriter对Excel进行操作 #主要功能,抓取此时的抖音的热度上升榜和热搜榜写入Excel中
  • 利用自动化测试工具appium控制手机刷抖音,同时开启mitmdump拦截手机端的所有请求信息,开启mitmproxy事件监听,当监听到需要的请求时,解析response。 下面就讲讲具体如何实现: 1、安装相关工具,网上很多...
  • 抖音爬虫从0到1-第一弹:环境配置 前言 因为最终目的是要抓取抖音视频数据,而通过抓包发现请求抖音的视频数据都需要对应用户的sec_id,这个加密的id的生成过程我们是不知道的,但是我们可以从抖音用户的数据包中...
  • 抖音抓包的时候发现抖音有很多个参数,时间戳,cookies,token, x-ss-stub,X-Gorgon等参数,其中有一个参数很关键,那就是X-Gorgon这个参数,根据抖音apk版本不同,X-Gorgon算法的版本也不同 这个X-Gorgon的作用...
  • 抖音爬虫python(来自github)非原创

    千次阅读 2019-06-14 14:28:25
    # -*- coding: utf-8 -*- import os import sys import getopt import urllib.parse import urllib.request from urllib.parse import urlencode import copy import codecs import requests import re ...
  • 抖音爬虫系列之:抖音app抓取视频详情和评论列表数据。 目前抖音版本使用的是最新版(11月份更新版本13.6.0),抓包工具为anyproxy,frida逆向。 首先我们抓包下抖音:(抓包抖音会提示抖音无网络,是因为抖音有...
  • 所以参考了很多教程,自己写了一个专门爬主播数据的爬虫。系统是Windows 10,时间2021年1月12号。用这种方法略做修改基本可以爬取抖音所有数据,有兴趣的欢迎交流。v: dayuchixiaoyu2021 一. 工具 必备 MitmProxy...
  • 用java写的爬虫,爬的抖音,目前只能爬部分,也是很困难的。 爬虫技术,知名的谷歌,百度,都是最大的爬虫,创造了可观的财富,不容小觑。 实现这个爬虫有两个难点,一是x-gorgon的获取,二是STUB的获取,x-gorgon是...
  • 抖音爬虫(基于自动化测试)

    万次阅读 2018-07-25 16:58:27
    由于抖音这类的短视频网站被整改,抖音关闭了分享视频的网页接口。现在无法从网页端爬取短视频。 解决方法:手机模拟器 + 中间抓包工具 + 自动化控制脚本 + 下载脚本   相关依赖: 手机模拟器: Genymotion...
  • 抖音爬虫之初步爬取视频(2)

    万次阅读 2020-04-24 15:27:13
    上一节我们已经初步搭建好了环境,这节我们讲解抓取视频包并下载。 吐槽一句,太难了呀,有道云分享被直接屏蔽了~~不得已非得再写一篇,既然这样,就慢慢把整个更完吧。 1.本节目标 如何初步下载某一用户的视频呢?...
  • 破解字体反爬(抖音爬虫

    千次阅读 2019-04-29 17:03:42
    0.现在的爬虫出现了反爬的机制,使用css来渲染本地数据,使得前台看数据正常但是,源代码却是不明所以的数据,以抖音为例,https://www.iesdouyin.com/share/user/102818614579,页面 可以看到我们所要抓取的...
  • AwemeSDK 0....关键词搜索用户 result = sdk.SearchUsers('热巴') 2.关键词搜索视频 result = sdk.SearchVideos('热巴') 3.... [DouYinSDK 抖音爬虫数据采集福音]http://www.zyiz.net/tech/detail-103189.html
  • 前言: 出于兴趣,这里来做了一个半自动化的抖音视频爬虫,该爬虫可以实现爬取某一用户发布的所有视频。 环境: 夜深模拟器(安卓4) CODE: import json,os import requests def response(flow): #分析数据发现这...
  • python抖音爬虫

    千次阅读 2019-11-12 16:15:47
    @抖音APP视频爬取 抖音视频的爬取过程 抖音由于没有网页版只有APP导致一些想爬的人都放弃了去尝试,但是作为一个程序员不要怕麻烦。麻烦才是你产生bug的开始 - - 爬取前必要做的事(按照前后顺序) 首先我在这里先说明...
  • TikTok 抓取器和下载器 从 TikTok 抓取和下载有用的信息。 ...这不是官方的 API 支持等等。这只是一个使用 TikTok Web API 来抓取媒体和相关元信息的抓取工具。 内容 管理下载历史 批量抓取和下载 ...
  • 该系列内容主要介绍抖音爬虫的相关过程。因为科研需要,所以选择爬取抖音的视频数据,包括点赞等。爬取思路是首先爬取用户,然后根据用户爬取其对应发布的视频数据。这一个博客我将介绍环境配置。 一、抓包软件 ...
  • 声明:此贴只做学习交流使用,不得用于违法行为,...抖音Version:12.8.0 (发帖时的最新版本)or 抖音极速版 (文件少,编译快) IDA or JEB Jadx-gui frida Pycharm root 真机(Android) or 模拟器 2、反编译: Apk

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,321
精华内容 1,328
关键字:

抖音爬虫

爬虫 订阅