Прокси с urllib2 - PullRequest
       45

Прокси с urllib2

71 голосов
/ 20 сентября 2009

Я открываю URL с:

site = urllib2.urlopen('http://google.com')

И что я хочу сделать, это подключиться таким же образом с прокси Я где-то сказал мне:

site = urllib2.urlopen('http://google.com', proxies={'http':'127.0.0.1'})

но это тоже не сработало.

Я знаю, что в urllib2 есть что-то вроде обработчика прокси, но я не могу вспомнить эту функцию.

Ответы [ 7 ]

137 голосов
/ 20 сентября 2009
proxy = urllib2.ProxyHandler({'http': '127.0.0.1'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.google.com')
17 голосов
/ 20 сентября 2009

Вы должны установить ProxyHandler

urllib2.install_opener(
    urllib2.build_opener(
        urllib2.ProxyHandler({'http': '127.0.0.1'})
    )
)
urllib2.urlopen('http://www.google.com')
10 голосов
/ 07 ноября 2013

Вы можете установить прокси, используя переменные окружения.

import os
os.environ['http_proxy'] = '127.0.0.1'
os.environ['https_proxy'] = '127.0.0.1'

urllib2 автоматически добавит обработчики прокси. Вам необходимо установить прокси для разных протоколов отдельно, иначе они не будут работать (с точки зрения отсутствия прокси), см. Ниже.

Например:

proxy = urllib2.ProxyHandler({'http': '127.0.0.1'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.google.com')
# next line will fail (will not go through the proxy) (https)
urllib2.urlopen('https://www.google.com')

Вместо

proxy = urllib2.ProxyHandler({
    'http': '127.0.0.1',
    'https': '127.0.0.1'
})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
# this way both http and https requests go through the proxy
urllib2.urlopen('http://www.google.com')
urllib2.urlopen('https://www.google.com')
6 голосов
/ 16 марта 2012

Чтобы использовать системные прокси по умолчанию (например, из переменной среды http_support), для текущего запроса работает следующее (без глобальной установки в urllib2):

url = 'http://www.example.com/'
proxy = urllib2.ProxyHandler()
opener = urllib2.build_opener(proxy)
in_ = opener.open(url)
in_.read()
3 голосов
/ 08 октября 2014

В дополнение к принятому ответу: Мой скипет дал мне ошибку

File "c:\Python23\lib\urllib2.py", line 580, in proxy_open
    if '@' in host:
TypeError: iterable argument required

Решением было добавить http: // перед строкой прокси:

proxy = urllib2.ProxyHandler({'http': 'http://proxy.xy.z:8080'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.google.com')
1 голос
/ 03 июля 2016

Можно также использовать запросы, если мы хотим получить доступ к веб-странице с помощью прокси. Код Python 3:

>>> import requests
>>> url = 'http://www.google.com'
>>> proxy = '169.50.87.252:80'
>>> requests.get(url, proxies={"http":proxy})
<Response [200]>

Также можно добавить более одного прокси.

>>> proxy1 = '169.50.87.252:80'
>>> proxy2 = '89.34.97.132:8080'
>>> requests.get(url, proxies={"http":proxy1,"http":proxy2})
<Response [200]>
0 голосов
/ 25 апреля 2016

Дополнительно установите прокси для сеанса командной строки Откройте командную строку, где вы можете запустить свой скрипт

netsh winhttp set proxy YourProxySERVER:yourProxyPORT

запустите ваш скрипт в этом терминале.

...