zoukankan      html  css  js  c++  java
  • 爬虫笔记之零度代理(token)

    难度: ☆☆☆☆☆ 0星

    一、目标

    这个链接是一个代理列表:
    http://3bodyhome.com/proxy
    0
    正常的来讲应该是有数据的,但是不知道为啥这里没有,可能是挂了,不过这个不是重点,打开开发者工具,看下Network里有个接口:
    http://3bodyhome.com/proxy?page=2&num=15&token=f02e62aaa6e563cc606d65ca0e7cf9b5&t=1605278006
    这个就是获取代理列表的,它的参数如下:
    1
    本次要搞定的就是token参数。


    二、分析

    先对那个接口打个xhr断点:
    2
    因为是ajax的接口吗,所以猜测单击“下一页”的按钮时是会发出翻页请求的,所以加完断点不必刷新页面,直接单击“下一页”按钮即可进入断点,然后格式化代码:
    3
    在调用栈上单击前面的栈帧回溯,找参数是在哪里生成的,其实也不用每个栈帧都看,圈出来的那个栈帧很明显就是发请求的地方:
    4
    定位到这个栈帧之后,直接就找到生成请求url的地方了,框起来的部分就是生成逻辑。
    5
    page就是要看第几页,num就是一页有多少条,timestamp就是10位的时间戳,token就是md5(page + num + timestamp),接下来就是编码实现了。


    三、编码实现

    这个接口已经挂掉了,虽然不知道编码实现还有啥意义,但还是搞一下,毕竟仪式感很重要...


    #!/usr/bin/env python3
    # encoding: utf-8
    """
    @author: CC11001100
    """
    
    import hashlib
    import time
    
    import requests
    
    
    def crawl(page, num=15):
        # 需要先访问doc拿到一个cookie
        session = requests.session()
        url = "http://3bodyhome.com/proxy"
        r = session.get(url)
        print(f"拿到了cookie{r.cookies}")
    
        # 然后再访问接口才能拿到正确的响应
        # 没有cookie访问接口会返回:
        # {"msg": "emmm...", "status": false}
        ts = int(time.time())
        token = hashlib.md5(f"{page}{num}{ts}".encode("UTF-8")).hexdigest()
        url = f"http://3bodyhome.com/proxy?page={page}&num={num}&token={token}&t={ts}"
        print(url)
        return session.get(url).text
    
    
    if __name__ == "__main__":
        print(crawl(1))  # {"status": "true", "list": "OUhcUg=="}
    


    仓库:

    https://github.com/CC11001100/misc-crawler-public/tree/master/001-anti-crawler-js-re/01-001-3bodyhome.com 


    请注意爬虫文章具有时效性,本文写于2020-11-13日。

  • 相关阅读:
    站立会议(3)
    站立会议(2)
    站立会议(1)
    团队报告
    Laravel5.1 模型 --一对多关系
    jQuery 操作DOM
    Laravel5.1 模型 --一对一关系
    Laravel5.1 模型--查询作用域
    Laravel5.1 模型--ModelFactory
    jQuery 选择器
  • 原文地址:https://www.cnblogs.com/cc11001100/p/14037791.html
Copyright © 2011-2022 走看看