首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Urllib2在python中的使用

Urllib2在python中的使用
EN

Stack Overflow用户
提问于 2015-04-21 23:17:42
回答 1查看 1.6K关注 0票数 0

我试图使用用Python编写的爬虫来抓取网站,并希望将Tor与Python集成起来,这意味着我想使用Tor匿名地抓取网站。

我在堆积如山的地方找到了一些答案,但没有一个对我有用。

以下是我从Urllib2在python中使用Tor和socks中找到的第一个解决方案

代码语言:javascript
复制
import socks
import socket
import urllib2    
socks.setdefaultproxy(socks.PROXY_TYPE_HTTP, "127.0.0.1", 9050)
socket.socket = socks.socksocket
print urllib2.urlopen('http://my-ip.herokuapp.com').read()

但我得到的是错误

代码语言:javascript
复制
(501, 'Tor is not an HTTP Proxy')

然后,如何在urllib2中使用SOCKS 4/5代理?的公认答案

代码语言:javascript
复制
import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 8080)
socket.socket = socks.socksocket
import urllib2
print urllib2.urlopen('http://www.google.com').read()

我得到了以下错误

代码语言:javascript
复制
<urlopen error [Errno 111] Connection refused>

然后,上面的投票结果来自TOR之上的Python urllib?

代码语言:javascript
复制
import socks
import socket
def create_connection(address, timeout=None, source_address=None):
    sock = socks.socksocket()
    sock.connect(address)
    return sock

socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)

# patch the socket module
socket.socket = socks.socksocket
socket.create_connection = create_connection

import urllib2

我的测试url是"http://almien.co.uk/m/tools/net/ip/",上面的代码将运行2分钟,并以下面的错误结尾

代码语言:javascript
复制
  File "/usr/lib/python2.7/dist-packages/socks.py", line 369, in connect
    self.__negotiatesocks5(destpair[0],destpair[1])
  File "/usr/lib/python2.7/dist-packages/socks.py", line 236, in __negotiatesocks5
    raise Socks5Error(ord(resp[1]),_generalerrors[ord(resp[1])])
IndexError: tuple index out of range

有人评论说,最新的端口是9150,但9050,所以我再次尝试使用9150,得到以下错误

代码语言:javascript
复制
urllib2.URLError: <urlopen error [Errno 111] Connection refused>

更新

在我的机器上添加tor信息。

代码语言:javascript
复制
root@xxxxxxx:~# tor
Apr 22 14:14:39.818 [notice] Tor v0.2.4.20 (git-0d50b03673670de6) running on Linux with Libevent 2.0.21-stable and OpenSSL 1.0.1f.
Apr 22 14:14:39.818 [notice] Tor can't help you if you use it wrong! Learn how to be safe at https://www.torproject.org/download/download#warning
Apr 22 14:14:39.818 [notice] Read configuration file "/etc/tor/torrc".
Apr 22 14:14:39.820 [notice] Opening Socks listener on 127.0.0.1:9050
Apr 22 14:14:39.000 [notice] Parsing GEOIP IPv4 file /usr/share/tor/geoip.
Apr 22 14:14:39.000 [notice] Parsing GEOIP IPv6 file /usr/share/tor/geoip6.
Apr 22 14:14:39.000 [warn] You are running Tor as root. You don't need to, and you probably shouldn't.
Apr 22 14:14:39.000 [warn] OpenSSL version from headers does not match the version we're running with. If you get weird crashes, that might be why. (Compiled with 1000105f: OpenSSL 1.0.1e 11 Feb 2013; running with 1000106f: OpenSSL 1.0.1f 6 Jan 2014).
Apr 22 14:14:40.000 [notice] Bootstrapped 5%: Connecting to directory server.
EN

回答 1

Stack Overflow用户

发布于 2015-04-22 00:15:58

然后启动:

代码语言:javascript
复制
import socket
import urllib

import socks  # SocksiPy module
import stem.process

SOCKS_PORT = 9050

# Set socks proxy and wrap the urllib module

socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', SOCKS_PORT)
socket.socket = socks.socksocket

# Perform DNS resolution through the socket

def getaddrinfo(*args):
  return [(socket.AF_INET, socket.SOCK_STREAM, 6, '', (args[0], args[1]))]

socket.getaddrinfo = getaddrinfo

print urllib.urlopen('http://my-ip.herokuapp.com').read()

基于喜爱代码使用stem。如果您也希望从python开始tor,则应该签出词干

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29784871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档