我正在使用mechanize在python中编写一个Web抓取程序。我遇到的问题是我所抓的网站限制了你在网站上的时间。当我手动完成所有操作时,我会使用SOCKS代理作为解决方法。
我尝试做的是转到网络偏好设置(Macbook Pro Retina 13',mavericks)并更改为代理。但是,该计划并没有对这一变化做出回应。它在没有代理的情况下继续运行。
然后我添加了.set_proxies()所以现在打开网站的代码看起来像这样:
b=mechanize.Browser() #open browser
b.set_proxies({"http":"96.8.113.76:8080"}) #proxy
DBJ=b.open(URL) #open url
当我运行程序时,我收到了这个错误:
Traceback (most recent call last):
File "GM1.py", line 74, in <module>
DBJ=b.open(URL)
File "build/bdist.macosx-10.9-intel/egg/mechanize/_mechanize.py", line 203, in open
File "build/bdist.macosx-10.9-intel/egg/mechanize/_mechanize.py", line 230, in _mech_open
File "build/bdist.macosx-10.9-intel/egg/mechanize/_opener.py", line 193, in open
File "build/bdist.macosx-10.9-intel/egg/mechanize/_urllib2_fork.py", line 344, in _open
File "build/bdist.macosx-10.9-intel/egg/mechanize/_urllib2_fork.py", line 332, in _call_chain
File "build/bdist.macosx-10.9-intel/egg/mechanize/_urllib2_fork.py", line 1142, in http_open
File "build/bdist.macosx-10.9-intel/egg/mechanize/_urllib2_fork.py", line 1118, in do_open
urllib2.URLError: <urlopen error [Errno 54] Connection reset by peer>
我假设代理已更改,并且此错误是对该代理的响应。
也许我在滥用.set_proxies()。
我不确定代理本身是否是问题,或者连接是否真的很慢。
我是否应该使用SOCKS代理来处理这类事情,还是有更好的替代方案来实现我的目标?
任何信息都会非常有用。提前谢谢。
答案 0 :(得分:2)
SOCKS代理与HTTP代理不同。客户端和代理之间的协议是不同的。这一行:
b.set_proxies({"http":"96.8.113.76:8080"})
告诉mechanize在96.8.113.76:8080使用HTTP代理来处理URL中具有http
方案的请求,例如网址http://httpbin.org/get的请求将通过代理96.8.113.76:8080发送。 Mechanize希望这是一个HTTP代理服务器,并使用相应的协议。您的SOCKS代理似乎正在关闭连接,因为它没有收到有效的SOCKS代理请求(因为它实际上是一个HTTP代理请求)。
我不认为机械化已经内置了对SOCKS的支持,所以你可能不得不采取一些肮脏的技巧,例如answer中的那些技巧。为此,您需要安装PySocks package。这可能适合你:
import socks
import socket
from mechanize import Browser
SOCKS_PROXY_HOST = '96.8.113.76'
SOCKS_PROXY_PORT = 8080
def create_connection(address, timeout=None, source_address=None):
sock = socks.socksocket()
sock.connect(address)
return sock
# add username and password arguments if proxy authentication required.
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, SOCKS_PROXY_HOST, SOCKS_PROXY_PORT)
# patch the socket module
socket.socket = socks.socksocket
socket.create_connection = create_connection
br = Browser()
response = br.open('http://httpbin.org/get')
>>> print response.read()
{
"args": {},
"headers": {
"Accept-Encoding": "identity",
"Connection": "close",
"Host": "httpbin.org",
"User-Agent": "Python-urllib/2.7",
"X-Request-Id": "e728cd40-002c-4f96-a26a-78ce4d651fda"
},
"origin": "192.161.1.100",
"url": "http://httpbin.org/get"
}