1. 程式人生 > 實用技巧 >爬蟲筆記之零度代理(token)

爬蟲筆記之零度代理(token)

難度: ☆☆☆☆☆ 0星

一、目標


這個連結是一個代理列表:
http://3bodyhome.com/proxy

正常的來講應該是有資料的,但是不知道為啥這裡沒有,可能是掛了,不過這個不是重點,開啟開發者工具,看下Network裡有個介面:
http://3bodyhome.com/proxy?page=2&num=15&token=f02e62aaa6e563cc606d65ca0e7cf9b5&t=1605278006
這個就是獲取代理列表的,它的引數如下:

本次要搞定的就是token引數。


二、分析


先對那個介面打個xhr斷點:

因為是ajax的介面嗎,所以猜測單擊“下一頁”的按鈕時是會發出翻頁請求的,所以加完斷點不必重新整理頁面,直接單擊“下一頁”按鈕即可進入斷點,然後格式化程式碼:

在呼叫棧上單擊前面的棧幀回溯,找引數是在哪裡生成的,其實也不用每個棧幀都看,圈出來的那個棧幀很明顯就是發請求的地方:

定位到這個棧幀之後,直接就找到生成請求url的地方了,框起來的部分就是生成邏輯。

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日。