爬虫使用 Tor 代理的优势在哪?
•Tor 代理每隔几分钟会切换一次出口IP,意味着每过几分钟就可以使用一个新的IP•Tor 代理通过多层中间节点保证匿名性
Tor 的连接过程是怎么样的?
Tor 发明的初衷并不是用于爬虫,就像 Selenium 的初衷并不是用于自动化爬虫一样。
Tor 是一种“代理节点快速动态变化的加密三重代理”。
当需要通过 Tor 传递数据时,需要先连接到Directory
服务获取可以用的节点。
之后从可用的节点中随机取出几个节点,组成一条通向目的节点的通路。
每隔一段时间,原有的通路会被拆除,随机新的节点组成新的通路用于通信。
如何搭建一个可用的 Tor 代理
首先需要一台能够自由浏览网络的服务器,这里使用的服务器是 Ubuntu 18.04.3
接着需要安装 Tor 代理, 注意这里安装的不是 Tor Brower。
sudo apt-get install tor
接着需要生成密码
tor --hash-password mypassword
这里会生成一串以 16 开头的 hash 串。
接着修改 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()
测试效果图
这里第一个 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()
测试效果图