Используя urllib2 с прокси SOCKS

Действительно ли возможно выбрать страницы с 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. Как у меня могут быть различные прокси для различных новичков?

14
задан Fluffy 1 April 2010 в 13:39
поделиться

5 ответов

Попробуйте с 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() 
16
ответ дан 1 December 2019 в 12:13
поделиться

== EDIT == (здесь был старый пример HTTP-прокси. ..)

Моя ошибка .. urllib2 не имеет встроенной поддержки для проксирования SOCKS.

Есть несколько « хаков », добавляющих SOCKS к urllib2 (или объекту сокета в целом) здесь .
Но я вряд ли подозреваю, что это будет работать с несколькими прокси, как вам это нужно.

Если вы не хотите подключать / создавать подкласс urllib2.ProxyHandler, я бы посоветовал использовать pycurl.

0
ответ дан 1 December 2019 в 12:13
поделиться

Вы могли бы использовать блокировки потоков, если не было слишком много подключений одновременно, и вам нужен доступ из нескольких потоков:

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 ¢: -)

0
ответ дан 1 December 2019 в 12:13
поделиться

У вас только один сокет для всех открывателей, а реализация socks находится на уровне сокета. Поэтому вы не можете.
Я предлагаю вам использовать библиотеку pycurl, она гораздо более гибкая.

0
ответ дан 1 December 2019 в 12:13
поделиться

Вы можете сделать это, установив экологическую переменную HTTP_PROXY в следующем формате:

user: pass @ proxy: port

или, если вы используете bat / cmd, добавьте перед вызовом скрипта:

set HTTP_PROXY = user : pass @ proxy: port

Я использую такой cmd-файл, чтобы easy_install работала под прокси.

-3
ответ дан 1 December 2019 в 12:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: