2015-07-02 7 views
0

Так что я пытаюсь работать с python 2.7, чтобы делать различные вещи, требующие вытаскивания данных из Интернета. Я не очень удался, и я ищу помощь, чтобы диагностировать, что я делаю неправильно.Диагностика проблемы прокси с python

Во-первых, мне удалось получить команду на работу путем определения прокси-сервера таким образом, pip install --proxy=http://username:[email protected]:8080 numpy. Следовательно, python должен быть способен пройти через это!

Однако, когда дело дошло до написания сценария .py, который мог бы сделать то же самое, я не имел успеха. Я попытался с помощью следующего кода с urllib2 первым:

import urllib2 

uri = "http://www.python.org" 
http_proxy_server = "someproxyserver.com" 
http_proxy_port = "8080" 
http_proxy_realm = http_proxy_server 
http_proxy_user = "username" 
http_proxy_passwd = "password" 

# Next line = "http://username:[email protected]:8080" 
http_proxy_full_auth_string = "http://%s:%[email protected]%s:%s" % (http_proxy_user, 
                 http_proxy_passwd, 
                 http_proxy_server, 
                 http_proxy_port) 

def open_url_no_proxy(): 
    urllib2.urlopen(uri) 

    print "Apparent success without proxy server!"  

def open_url_installed_opener(): 
    proxy_handler = urllib2.ProxyHandler({"http": http_proxy_full_auth_string}) 

    opener = urllib2.build_opener(proxy_handler) 
    urllib2.install_opener(opener) 
    urllib2.urlopen(uri) 

    print "Apparent success through proxy server!" 

if __name__ == "__main__": 
    open_url_no_proxy() 
    open_url_installed_opener() 

Однако я просто получаю эту ошибку:

URLError: <urlopen error [Errno 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond> 

Затем я попытался urllib3, как это модуль, используемый пип для обработки прокси:

from urllib3 import ProxyManager, make_headers 

# Establish the Authentication Settings 
default_headers = make_headers(basic_auth='username:password') 
http = ProxyManager("https://www.proxy.com:8080/", headers=default_headers) 

# Now you can use `http` as you would a normal PoolManager 
r = http.request('GET', 'https://www.python.org/') 

# Check data is from destination 
print(r.data) 

Я получил эту ошибку:

raise MaxRetryError(_pool, url, error or ResponseError(cause)) MaxRetryError: HTTPSConnectionPool(host='www.python.org', port=443): Max retries exceeded with url:/(Caused by ProxyError('Cannot connect to proxy.', error('Tunnel connection failed: 407 Proxy Authorization Required',))) 

Я бы очень признателен за любую помощь в диагностике этой проблемы.

+0

Является ли ваш прокси-сервер на https: // или http: //? В примере с пирамидой это http: //, но пример urllib3 - это https: //. – shazow

+0

Если это не сработает, вы можете попробовать использовать Запросы (построенные на urllib3, также используемые в pip): http://docs.python-requests.org/en/latest/user/advanced/?highlight=proxy#proxies – shazow

+0

Yeh Я играл с http vs https, на самом деле, когда у меня он настроен на http с использованием urllib3, он не имеет никаких ошибок, однако он возвращает страницу, которая говорит мне, что прокси требует аутентификации. – Tom

ответ

1

решение моей проблемы в том, чтобы использовать модуль запросов см ниже тему: Proxies with Python 'Requests' module

список mtt2p этот код, который работал для меня.

import requests 
import time 
class BaseCheck(): 
    def __init__(self, url): 
     self.http_proxy = "http://user:[email protected]:8080" 
     self.https_proxy = "http://user:[email protected]:8080" 
     self.ftp_proxy = "http://user:[email protected]:8080" 
     self.proxyDict = { 
         "http" : self.http_proxy, 
         "https" : self.https_proxy, 
         "ftp" : self.ftp_proxy 
        } 
     self.url = url 
     def makearr(tsteps): 
      global stemps 
      global steps 
      stemps = {} 
      for step in tsteps: 
       stemps[step] = { 'start': 0, 'end': 0 } 
      steps = tsteps 
     makearr(['init','check']) 
     def starttime(typ = ""): 
      for stemp in stemps: 
       if typ == "": 
        stemps[stemp]['start'] = time.time() 
       else: 
        stemps[stemp][typ] = time.time() 
     starttime() 
    def __str__(self): 
     return str(self.url) 
    def getrequests(self): 
     g=requests.get(self.url,proxies=self.proxyDict) 
     print g.status_code 
     print g.content 
     print self.url 
     stemps['init']['end'] = time.time() 
     #print stemps['init']['end'] - stemps['init']['start'] 
     x= stemps['init']['end'] - stemps['init']['start'] 
     print x 


test=BaseCheck(url='http://google.com') 
test.getrequests() 
Смежные вопросы