Python爬虫-代理篇-TOR


Tor介绍

TOR是全球有名的匿名网络,具有很高的匿名性,简单点说,Tor网络利用流量转发的方式,达到隐藏真实请求端(客户端)的目的,是目前比较受欢迎也比较有名气的的匿名工具。其原理图如下
Tor原理图
由于出口IP随机轮换,且具有很强的匿名性,因此我们可以使用Tor网络作为爬虫代理,用来解决一些网站的IP封禁问题。


Tor的安装和使用

Tor安装

sudo apt-get install tor

重启

sudo /etc/init.d/tor restart

生成密码

tor –hash-password mypassword
这个操作会生成一个Hash串

修改配置文件

命令 vim /etc/tor/torrc

  • ControlPort 9051
  • HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C

Python使用Tor

Python2

sudo pip install requests
sudo pip install requesocks

#!/usr/bin/python
#coding:utf-8

import os
import requesocks
import socks
import socket
import requests
import time
import sys

reload(sys)
sys.setdefaultencoding('utf-8')

url = 'http://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)
    getip_requesocks(url)
    os.system("""(echo authenticate '"mypassword"'; echo signal newnym; echo \ quit) | nc localhost 9051""")
    time.sleep(2)
    getip_requesocks(url)
    

if __name__ == "__main__":
    main()

Python3

sudo pip3 install pysocks

#!/usr/bin/python3

import requests
import time
import sys
import socket
import socks

socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 9050)
socket.socket = socks.socksocket

# 使用requests包进行常规请求即可

Python Tor管理包 stem

  1. 官方文档
  2. 该包Python2和Python3均可以使用
  3. pip install stem / sudo apt-get install python-stem
from stem import Signal
from stem.control import Controller

# signal TOR for a new connection 
def renew_connection():
    with Controller.from_port(port = 9051) as controller:
        controller.authenticate(password="password")
        controller.signal(Signal.NEWNYM) 

注意:

  • 需要更换IP的时候,需要重新新建Session对象
  • 使用stem包,要求必须设施密码(修改配置文件:ControlPort和HashedControlPassword)

关于更换Tor IP

亲测最简单也最有效的切换IP方式就是直接重启

import os
os.system('sudo /etc/init.d/tor restart')

总结

  1. 我们可以使用Tor网站,解决一些网站的IP封禁问题
  2. Tor网络请求数据会经过多次转发, 且服务器大多位于国外,导致请求速度慢,如果一次请求数据太多,并不建议使用Tor网络作为代理
  3. Tor可用的出口节点IP不多
  4. 使用Tor网络作为代理,可以访问‘暗网’数据

文档仅作学习和记录使用,请不要用于商业和违法用途,如有侵权,请告知删除。