如何在Python中通过Tor制作urllib2请求?

49 python tor

我正在尝试使用Python编写的爬虫来抓取网站.我想将Tor与Python集成,这意味着我想使用Tor匿名抓取该站点.

我试过这样做.它似乎不起作用.我检查了我的IP,它仍然与我使用tor之前的IP相同.我通过python检查了它.

import urllib2
proxy_handler = urllib2.ProxyHandler({"tcp":"http://127.0.0.1:9050"})
opener = urllib2.build_opener(proxy_handler)
urllib2.install_opener(opener)
Run Code Online (Sandbox Code Playgroud)

Dmi*_*kov 21

您正在尝试连接到SOCKS端口 - Tor拒绝任何非SOCKS流量.您可以通过中间人 - Privoxy - 使用端口8118进行连接.

例:

proxy_support = urllib2.ProxyHandler({"http" : "127.0.0.1:8118"})
opener = urllib2.build_opener(proxy_support) 
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
print opener.open('http://www.google.com').read()
Run Code Online (Sandbox Code Playgroud)

另请注意传递给ProxyHandler的属性,没有http前缀为ip:port

  • 这个答案很糟糕,你应该心疼.Tor控制端口是9051,而不是9050. 9050是你可以使用的袜子端口http://stackoverflow.com/questions/2317849/how-can-i-use-a-socks-4-5-proxy-与-的urllib2 (7认同)

Cir*_*四事件 9

pip install PySocks
Run Code Online (Sandbox Code Playgroud)

然后:

import socket
import socks
import urllib2

ipcheck_url = 'http://checkip.amazonaws.com/'

# Actual IP.
print(urllib2.urlopen(ipcheck_url).read())

# Tor IP.
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', 9050)
socket.socket = socks.socksocket
print(urllib2.urlopen(ipcheck_url).read())
Run Code Online (Sandbox Code Playgroud)

仅仅使用urllib2.ProxyHandler/sf/answers/141095461/失败:

Tor is not an HTTP Proxy
Run Code Online (Sandbox Code Playgroud)

提到:我如何使用urllib2的SOCKS 4/5代理?

在Ubuntu 15.10,Tor 0.2.6.10,Python 2.7.10上测试.

  • 对于9050,它在Python 3中不起作用。我收到以下错误:`urllib.error.URLError:<urlopen错误PySocks不支持IPv6>`。不过,使用** 9150 **而不是9050即可。 (2认同)

Vin*_*jip 1

也许您遇到一些网络连接问题?上面的脚本对我有用(我替换了一个不同的 URL - 我使用过http://stackoverflow.com/- 我得到了预期的页面:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" >
 <html> <head>

<title>Stack Overflow</title>        
<link rel="stylesheet" href="/content/all.css?v=3856">
Run Code Online (Sandbox Code Playgroud)

(ETC。)