Использование urllib2 с прокси SOCKS - PullRequest
14 голосов
/ 29 марта 2010

Можно ли получать страницы с помощью urllib2 через прокси-сервер SOCKS на одном сервере 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. Как я могу иметь разные прокси для разных сошников?

Ответы [ 7 ]

16 голосов
/ 03 апреля 2010

Попробуйте с 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() 
11 голосов
/ 12 декабря 2011

Да, вы можете. Я повторяю свой ответ на Как я могу использовать прокси SOCKS 4/5 с urllib2? Вам нужно создать открывашку для каждого прокси, как вы делаете с http прокси. Код для добавления этой функции в SocksiPy доступен в GitHub https://gist.github.com/869791 и так же прост:

opener = urllib2.build_opener(SocksiPyHandler(socks.PROXY_TYPE_SOCKS4, 'localhost', 9999))
print opener.open('http://www.whatismyip.com/automation/n09230945.asp').read()

Для получения дополнительной информации я написал пример запуска нескольких экземпляров Tor, которые ведут себя как вращающийся прокси: Распределенная очистка с несколькими схемами Tor

0 голосов
/ 10 января 2011

Громоздкое, но работающее решение для использования прокси-сервера SOCKS состоит в том, чтобы настроить provixy с цепочкой прокси-серверов, а затем установить HTTP_PROXY, предоставляемый privoxy, через системную переменную или любым другим способом.

0 голосов
/ 20 мая 2010

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

пользователь: пароль @ прокси: порт

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

set HTTP_PROXY = пользователь: pass @ proxy: порт

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

0 голосов
/ 06 апреля 2010

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

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 голосов
/ 01 апреля 2010

У вас есть только один сокет для всех сошников, а реализация носков находится на уровне сокетов. Так что вы не можете.
Я предлагаю вам использовать библиотеку Pycurl, она гораздо более гибкая.

0 голосов
/ 29 марта 2010

== РЕДАКТИРОВАТЬ == (старый пример HTTP-прокси был здесь ..)

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

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

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

...