cookie+代理

  • cookie

    • 是存储在客户端的一组键值对。

    • web中cookie的典型应用

      • 免密登录
      • 登录状态
    • cookie和爬虫的关系

      • 对页面请求时,如果请求的过程中不携带cookie,无法请求到正确的页面数据。所以是它是常见的反爬机制。
      • cookie的处理方式
        • 手动处理
          • 复制粘贴
          • 弊端:有有效时长
        • 自动处理
          • 基于session对象实现自动处理
          • requests.session()
          • session对象的作用:
            • 该对象可以像requests一样调用get和post发起指定的请求。只不过如果在使用session发请求的过程中产生了cookie,则cookie会被自动存储在session对象中,那么下次再次使用session请求时,就携带cookie进行了请求。
            • 在使用session的时候,session对象至少会被使用两次。
    • 例:

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      
      # 需求:爬取雪球网中的咨询信息。https://xueqiu.com/
      # 分析:判定爬取的数据是否是动态加载:部分数据是动态加载
      # 定位到ajax请求的数据包,提取处请求的url,响应数据为json形式的数据
      
      import requests
      
      headers = {
          'User-Agent': 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0'
      }
      
      session = requests.session()  # 创建session
      main_url = 'https://xueqiu.com/'
      session.get(main_url, headers=headers)   # 捕获且存储cookie
      
      url = 'https://xueqiu.com/statuses/hot/listV2.json?since_id=-1&max_id=176631&size=15'
      page_text = session.get(url=url, headers=headers).json()
      print(page_text)
      
  • 代理机制

    • 在爬虫中代理就是代理服务器

    • 代理服务器的作用是转发请求和响应。

    • 短时间内对服务器发起了高频的请求,那么服务器会检测到这样的一个异常的行为请求,就会将该请求对应设备的ip禁掉。

    • 如果ip被禁,则可以使用代理服务器。

    • 代理服务器不同的匿名程度:

      • 透明代理:server知道你使用了代理且知道你的真实ip
      • 匿名代理:知道你使用了代理,但是不知道你的真实ip
      • 高匿代理:不知道你是使用了代理也不知道你的真实ip
    • 代理的类型:

      • https:只能转发https协议的请求
      • http:转发http的请求
    • 代理服务器:

      • 快代理

      • 西祠代理

      • goubanjia

      • 代理精灵

      • 封装代理池

         1
         2
         3
         4
         5
         6
         7
         8
         9
        10
        11
        12
        13
        14
        15
        16
        
        # 代理池
        from lxml import etree
        import requests
        url = '放代理地址'
        headers = {
            'User-Agent': 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0'
        }
        page_text = requests.get(url, headers=headers).text
        tree = etree.HTML(page_text)
        proxy_list = tree.xpath('//body//text()')
        http_proxy = []
        for proxy in proxy_list:
            dic = {
                'http': proxy
            }
            http_proxy.append(dic)
        
      • 使用代理

        1
        2
        3
        
        # request = requests.get(url, headers=headers,  proxies={'http':ip:port})
        # xpath解析式中不能出现tbody标签
        request = requests.get(url, headers=headers, proxies=random.choice(http_proxy))
        
  • 验证码识别

    • 基于线上的打码平台识别验证码

    • 打码平台

      • 超级鹰

        • 创建软件id

        • 下载示例代码

        • 封装功能

          1
          2
          3
          4
          5
          
          import chaojiying
          def tanfoormImgCode(path, type):
              chaojiying1 = chaojiying.Chaojiying_Client('用户名', '密码', '软件id')
              im = open(path, 'rb').read()
              return chaojiying1.PostPic(im, type)['pic_str']
          
      • 云打码

      • 打码兔

  • 模拟登录

    • 流程:
      • 对点击登录按钮对应的请求进行发送(get)
      • 处理请求参数:
        • 用户名
        • 密码
        • 验证码
        • 其他防伪参数
          • cookie(session)
          • 乱序请求参数(可能动态)
            • 处理方式1:一般动态变化的请求参数会被隐藏在前台页面中,在页面源码中搜索即可。
            • 处理方式2:如果前台页面没有,则机遇抓包工具进行全局搜索。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    
    import requests
    from lxml import etree
    from chaojiying import tanfoormImgCode
    
    headers = {
        'User-Agent': 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0'
    }
    # 识别验证码
    session = requests.session() # 创建session捕获cookie
    url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
    page_text = session.get(url, headers=headers).text
    tree = etree.HTML(page_text)
    img_src = 'https://so.gushiwen.cn' + tree.xpath('//*[@id="imgCode"]')[0]
    img_data = session.get(img_src, headers=headers).content
    with open('./code.jpg', 'wb') as fp:
        fp.write(img_data)
    
    # 识别验证码
    code_text = tanfoormImgCode('./code.jpg', 1902)
    
    login_url = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
    
    data = {
        '__VIEWSTATE': '9Qg1T/fXvI3ef41DzaaaK7bfCyhDl4c3E3RS1rYNfMx4QF5zKHU43xQ2JKqM2PVNkn228ZRjSIh5F0yXq5gYfAdSZSSBctGUiqunsGgE/NKcajrSMIqiXihWMj0=',
        '__VIEWSTATEGENERATOR': 'C93BE1AE',
        'from': 'http://so.gushiwen.cn/user/collect.aspx',
        'email': '33192475@qq.com',
        'pwd': 'j33192475',
        'code': code_text, # 动态订婚
        'denglu': '登录',
    }
    
    # 对点击登录发起请求
    page_text_login = session.post(login_url, headers=headers, data=data).text
    print(page_text_login)
    
    #  TODO jupyter魔法指令
    #  TODO 正则
    #  TODO 梨视频爬取
    
  • 基于百度AI实现的爬虫功能

    • 图像识别
    • 语音识别&合成
    • 自然语言处理
    • 使用流程:
      • 登录后在相应功能下创建app
      • 选择对应的pythonSDK文档进行代码实现
  • 梨视频爬取思路

    • 将每一个视频详情页的url进行解析
    • 对视频详情页的url进行请求发送
    • 在视频详情页的页面源码中进行全局搜索,发现没有找到video标签
      • video是动态加载
      • 动态加载的数据方式
        • ajax
        • js
    • 通过正则匹配出视频地址
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus