爬虫使用 Tor 代理的优势在哪?

•Tor 代理每隔几分钟会切换一次出口IP,意味着每过几分钟就可以使用一个新的IP•Tor 代理通过多层中间节点保证匿名性

Tor 的连接过程是怎么样的?

Tor 发明的初衷并不是用于爬虫,就像 Selenium 的初衷并不是用于自动化爬虫一样。

Tor 是一种“代理节点快速动态变化的加密三重代理”。

当需要通过 Tor 传递数据时,需要先连接到Directory服务获取可以用的节点。



一台服务器最多几个redis_服务器

之后从可用的节点中随机取出几个节点,组成一条通向目的节点的通路。



一台服务器最多几个redis_服务器_02

每隔一段时间,原有的通路会被拆除,随机新的节点组成新的通路用于通信。



一台服务器最多几个redis_Python_03

如何搭建一个可用的 Tor 代理

首先需要一台能够自由浏览网络的服务器,这里使用的服务器是 Ubuntu 18.04.3



一台服务器最多几个redis_服务器_04

接着需要安装 Tor 代理, 注意这里安装的不是 Tor Brower。

sudo apt-get install tor

接着需要生成密码

tor --hash-password mypassword

这里会生成一串以 16 开头的 hash 串。



一台服务器最多几个redis_服务器_05

接着修改 Tor 的配置。

sudo vim /etc/tor/torrc

根据开头的介绍 Tor 在几分钟内会自动更换 IP 但是这个更换频率在爬虫应用中显然是不合适的,所以我们修改他的更换频率为 10 秒。

# 指定端口
ControlPort 9051
# 填入密码
HashedControlPassword [密码]
# 设置更换ip的频率
MaxCircuitDirtiness 10

接下来就是关于我们爬虫脚本的编写了。

这里提供了 Python 2 和 Python 3 两个版本。

Python 2

依赖包安装
pip install requesocks
pip install requests
测试脚本
import os
import requests
import requesocks
import time
url = 'https://api.ipify.org?format=json'
def getip_requests(url):
    print "(+) Sending request with plain requests..."
    r = requests.get(url)
    print "(+) IP is: " + r.text.replace("\n", "")
def getip_requesocks(url):
    print "(+) Sending request with requesocks..."
    session = requesocks.session()
    session.proxies = {'http': 'socks5://127.0.0.1:9050',
                       'https': 'socks5://127.0.0.1:9050'}
    r = session.get(url)
    print "(+) IP is: " + r.text.replace("\n", "")
def main():
    print "Running tests..."
    getip_requests(url)
    while True:
        getip_requesocks(url)
        time.sleep(10);
if __name__ == "__main__":
    main()
测试效果图



一台服务器最多几个redis_IP_06

这里第一个 IP 为主机 IP,之后的 IP 为随机分配的 IP

Python3

依赖包
pip3 install pysocks
pip3 install requests
测试脚本
import requests
import time
import sys
import socket
import socks


def getip_requests(url):
    print("(+) Sending request with plain requests...")
    r = requests.get(url)
    print("(+) IP is: " + r.text.replace("\n", ""))


def main():
    print("Running tests...")
    url = 'https://api.ipify.org?format=json'
    socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 9050)
    socket.socket = socks.socksocket
    while True:
        getip_requests(url)
        time.sleep(10);


if __name__ == '__main__':
    main()
测试效果图



一台服务器最多几个redis_一台服务器最多几个redis_07