Проксі з urllib2


76

Я відкриваю URL-адреси за допомогою:

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

І що я хочу зробити, так само підключіться до проксі-сервера, який мені десь сказав:

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

але і це не спрацювало.

Я знаю, що urllib2 має щось на зразок обробника проксі, але я не можу згадати цю функцію.

Відповіді:


142
proxy = urllib2.ProxyHandler({'http': '127.0.0.1'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.google.com')

1
Привіт, @ZelluX, я хочу лише налаштування проксі-серверів увімкнути для якоїсь функції, чи означає це, що я повинен встановлювати та видаляти відкривач для кожного виклику функції?
satoru

@ Satoru.Logic Можливо, ви можете написати декоратор, щоб спростити процес встановлення / видалення?
ZelluX

2
Здається, тут немає uninstallметоду urllib2, але ми можемо зробити одноразові налаштування проксі; замість installingсошника ми створюємо requestоб’єкт і використовуємо для нього сошник open.
satoru

3
@ Satoru.Logic: Я думаю, що традиційним підходом є налаштування змінної середовища типу, HTTP_PROXYа потім перевірка вашого коду, якщо він визначений за допомогою os.environ["HTTP_PROXY"].
ccpizza

не забудьте номер порту, наприклад 3128 proxy = urllib2.ProxyHandler ({'http': '127.0.0.1:3128'})
J'e

18

Вам потрібно встановити ProxyHandler

urllib2.install_opener(
    urllib2.build_opener(
        urllib2.ProxyHandler({'http': '127.0.0.1'})
    )
)
urllib2.urlopen('http://www.google.com')

Я отримую файл "D: / Desktop / Desktop / mygoogl", рядок 64, site = url.urlopen ('google.com) Файл "C: \ Python26 \ lib \ urllib2.py", рядок 124, у urlopen return _opener. open (url, data, timeout) AttributeError: екземпляр ProxyHandler не має атрибута 'open'
Chris Stryker,

Я пропустив дзвінок на urllib2.build_opener ()
dcrosta

12

Ви можете встановити проксі за допомогою змінних середовища.

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')

Чи не слід було вам використовувати, наприклад, os.environ ['http_proxy'] у двох нижчих наборах прикладів?
Джонатан Бенн,

7

Щоб використовувати системні проксі-сервери за замовчуванням (наприклад, із змінної середовища http_support), для поточного запиту працює наступне (не встановлюючи його в urllib2 глобально):

url = 'http://www.example.com/'
proxy = urllib2.ProxyHandler()
opener = urllib2.build_opener(proxy)
in_ = opener.open(url)
in_.read()

3

На додаток до прийнятої відповіді: мій scipt дав мені помилку

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')

2

Можна також використовувати запити, якщо ми хочемо отримати доступ до веб-сторінки за допомогою проксі. Код 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]>

Привіт @WaqarDetho Як дізнатись, які адреси проксі використовувати? Це лише деякі випадкові ip-адреси?
Аман Сінгх

Привіт @AmanSingh Я давно це зробив. Але, наскільки я пам’ятаю, я знаходжу ці адреси проксі з Інтернету. Я вручну вводив їх у код.
Waqar Detho

0

Крім того, встановіть проксі-сервер для сеансу командного рядка Відкрийте командний рядок, де ви можете запустити свій сценарій

netsh winhttp set proxy YourProxySERVER:yourProxyPORT

запустіть свій скрипт у цьому терміналі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.