Действительно ли возможно выбрать страницы с urllib2 через прокси SOCKS на одном сервере носков на основного новичка? Я видел решение использовать setdefaultproxy метод, но у меня должны быть различные носки в различных новичках.
Таким образом, существует библиотека SocksiPy, которая работает отлично, но она должна использоваться этот путь:
import socks
import socket
socket.socket = socks.socksocket
import urllib2
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "x.x.x.x", y)
Таким образом, это устанавливает тот же прокси для ВСЕХ запросов urllib2. Как у меня могут быть различные прокси для различных новичков?
Попробуйте с pycurl:
import pycurl
c1 = pycurl.Curl()
c1.setopt(pycurl.URL, 'http://www.google.com')
c1.setopt(pycurl.PROXY, 'localhost')
c1.setopt(pycurl.PROXYPORT, 8080)
c1.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)
c2 = pycurl.Curl()
c2.setopt(pycurl.URL, 'http://www.yahoo.com')
c2.setopt(pycurl.PROXY, 'localhost')
c2.setopt(pycurl.PROXYPORT, 8081)
c2.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)
c1.perform()
c2.perform()
== EDIT == (здесь был старый пример HTTP-прокси. ..)
Моя ошибка .. urllib2 не имеет встроенной поддержки для проксирования SOCKS.
Есть несколько « хаков », добавляющих SOCKS к urllib2 (или объекту сокета в целом) здесь .
Но я вряд ли подозреваю, что это будет работать с несколькими прокси, как вам это нужно.
Если вы не хотите подключать / создавать подкласс urllib2.ProxyHandler, я бы посоветовал использовать pycurl.
Вы могли бы использовать блокировки потоков, если не было слишком много подключений одновременно, и вам нужен доступ из нескольких потоков:
import socks
import socket
import thread
lock = thread.allocate_lock()
socket.socket = socks.socksocket
def GetConn():
lock.acquire()
import urllib2
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "x.x.x.x", y)
conn = urllib2.urlopen(ARGUMENTS HERE)
lock.release()
return conn
Вы также можете использовать что-то подобное каждый раз, когда вам нужно чтобы установить соединение:
urllib2 = execfile('urllib2.py')
urllib2.socket = dummy_class() # dummy_class needs the socket module's methods
Это явно не фантастические решения, но я все равно добавил свои 2 ¢: -)
У вас только один сокет для всех открывателей, а реализация socks находится на уровне сокета. Поэтому вы не можете.
Я предлагаю вам использовать библиотеку pycurl, она гораздо более гибкая.
Вы можете сделать это, установив экологическую переменную HTTP_PROXY в следующем формате:
user: pass @ proxy: port
или, если вы используете bat / cmd, добавьте перед вызовом скрипта:
set HTTP_PROXY = user : pass @ proxy: port
Я использую такой cmd-файл, чтобы easy_install работала под прокси.