[python] https proxy

Тема в разделе "Perl, Python, Ruby", создана пользователем droid, 23 янв 2012.

  1. droid

    droid Создатель

    Регистр.:
    2 авг 2011
    Сообщения:
    37
    Симпатии:
    4
    сем доброго времени суток.
    Недавно наваял скрипт для сбора статистики. Начал прикручивать прокси, нужна поддрежка https. Сделал следующий код:
    Код:
           
    baseURL = 'https://service.acc.com/login.jsp'
    log_val = { "_stateParam" : "eCareLocale.currentLocale=ru_RU__Russian",
                "_forwardName" : "null",
                "_resetBreadCrumbs" : "False",
                "userName" : number,
                "password" : password,
                "Action" : "login"
              }
    log_data = urllib.urlencode(log_val)
    Request = urllib2.Request 
    prx_jar = cookielib.CookieJar()
    if (self.proxy is not None):
            rpchk = self._quickcheck()
            if (rpchk == True):
                wproxy = urllib2.ProxyHandler({'https': proxy})
                prx_opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(prx_jar), wproxy)
            else:
                prx_opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(prx_jar))
        else:
            prx_opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(prx_jar))
        prx_opener.addheaders = zip(req_hdr.keys(), req_hdr.values())
        req = Request(baseURL,log_data,{'Referer': 'https://service.acc.com/', 'Content-Type':'application/x-www-form-urlencoded', 'Content-Length': len(log_data)})
        try:
            webdt = prx_opener.open(req)
        except urllib2.URLError, e:
            maxretr=-1
            return
        except urllib2.HTTPError, e:
            maxretr=-1
            return
        chkgzip = False
        for fields in webdt.info().keys():
            if fields.lower() == 'content-encoding':
                cntenc = fields
                chkgzip = True
        if (chkgzip ==True) and (webdt.info()[cntenc].lower() == 'gzip'):
            gzdata = StringIO.StringIO(webdt.read())
            gzipper = gzip.GzipFile(fileobj=gzdata)
            webdt_t = gzipper.read()           
        else:
            webdt_t = webdt.read()
    
    Проблема в том, что через проксю он не хочет работать. Пробывал указывать к реквесте прокси, тоже отказывается. Нашёл несколько статей что с https есть некие проблемы в питоне. Подскажите как поправить и заставить таки работать код с проксёй.
     
  2. Terri.p

    Terri.p Постоялец

    Регистр.:
    24 ноя 2008
    Сообщения:
    56
    Симпатии:
    31
    Попробуй в opener добавить urllib2.HTTPSHandler()
    А сами прокси https поддерживают?
     
  3. droid

    droid Создатель

    Регистр.:
    2 авг 2011
    Сообщения:
    37
    Симпатии:
    4
    Да поддерживают проверял при помощи стандартного браузера.
    попробую urllib2.HTTPSHandler()

    Добавил в опенер HTTPSHandler. посмотрел нетстатом, питон не ходит на прокси(те идёт напрямую на сайт без прокси).
    Есть ли у кого рабочий пример ?

    Добавлено Genk0: 2 поста подряд
     
  4. Dmitry HT

    Dmitry HT Писатель

    Регистр.:
    23 июл 2007
    Сообщения:
    3
    Симпатии:
    4
    нафига эти https... их днем с огнем не найти нормальных. сделай лучше через соксы, имхо.
     
  5. droid

    droid Создатель

    Регистр.:
    2 авг 2011
    Сообщения:
    37
    Симпатии:
    4
    Граждане, решил перейти на сокс. прицепил 2 модуля. но что то скрипт напрямую все также и ломитсья. кто подскажет , где ошибка закралась ?
    import socks,socksipyhandler
    wproxy_ip=ip
    wproxy_port = port
    wproxy_rdns=False
    wrk_url='https://login.service.kz/ru/login.do'
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cook_jar), socksipyhandler.SocksiPyHandler(socks.PROXY_TYPE_SOCKS5, wproxy_ip, wproxy_port,wproxy_rdns))
    init_req = Request(wrk_url,init_data,{'Referer': 'http://www.astana.kz/ru/'})
    webdt = opener.open(init_req)
     
  6. Dmitry HT

    Dmitry HT Писатель

    Регистр.:
    23 июл 2007
    Сообщения:
    3
    Симпатии:
    4
    посмотри в сторону httplib2, очень хорошая штука. правда придется самому написать менеджер кукисов под нее.

    вот пример работы с соксами со страницы их проекта:
    Код:
      
    import httplib2
    import socks
     
    httplib2.debuglevel=4
    h = httplib2.Http(proxy_info = httplib2.ProxyInfo(socks.PROXY_TYPE_HTTP, 'localhost', 8000))
    r,c = h.request("http://bitworking.org/news/")
    забыл предложить еще pycurl, но ssl версию под 64 разрядную систему еще не нашел.
    если обойдешься без https протокола, то с ним легче будет, чем с httplib2
     
    Последнее редактирование модератором: 17 дек 2013
    Ultharas и droid нравится это.
  7. droid

    droid Создатель

    Регистр.:
    2 авг 2011
    Сообщения:
    37
    Симпатии:
    4
    Да пример это хорошо, но столкнулся с проблемой проверки сертификата.
    всем идущим по моим следам посовещается:
    Код:
    http_hndl = httplib2.Http(proxy_info = httplib2.ProxyInfo(socks.PROXY_TYPE_SOCKS5, wproxy_ip, wproxy_port,wproxy_rdns),disable_ssl_certificate_validation=True)
    resp_hdr, web_resp = http_hndl.request(url , headers=req_hdr)
    
    Ну и затем внимательно разбираться с заголовками и ответами. Все ручкаи ( ну может кто подскажет другой алгоритм, я не нашёл)
    Также пока есть проблема BadStatusLine, не могу исключение это отловить. А в остальном поддерживает трафик https, проблем нет :)
     
  8. chempion

    chempion Создатель

    Регистр.:
    22 ноя 2012
    Сообщения:
    10
    Симпатии:
    2
    вот так
    Код:
    import httplib2
    import socks
    httplib2.debuglevel=4
    h = httplib2.Http(proxy_info = httplib2.ProxyInfo(socks.PROXY_TYPE_HTTP, 'localhost', 8000))
    r,c = h.request("http://bitworking.org/news/")
     
    Ultharas нравится это.
  9. errogaht

    errogaht Постоялец

    Регистр.:
    15 май 2013
    Сообщения:
    50
    Симпатии:
    10
    попробуй использовать http://grablib.org/ - удобный парсер с поддержкой проксей, написан нашим русским земляком
     
    andrei_k нравится это.
  10. Ultharas

    Ultharas Создатель

    Регистр.:
    26 сен 2014
    Сообщения:
    27
    Симпатии:
    10
    Я разные библиотеки юзал, остановился на requests, удобная штука. По скорости, читал, реализация через сокеты самая быстрая
     
    r00t и andrei_k нравится это.