[python] https proxy

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 есть некие проблемы в питоне. Подскажите как поправить и заставить таки работать код с проксёй.
 
Попробуй в opener добавить urllib2.HTTPSHandler()
А сами прокси https поддерживают?
 
Да поддерживают проверял при помощи стандартного браузера.
попробую urllib2.HTTPSHandler()

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

Добавлено Genk0: 2 поста подряд
 
нафига эти https... их днем с огнем не найти нормальных. сделай лучше через соксы, имхо.
 
Граждане, решил перейти на сокс. прицепил 2 модуля. но что то скрипт напрямую все также и ломитсья. кто подскажет , где ошибка закралась ?
import socks,socksipyhandler
wproxy_ip=ip
wproxy_port = port
wproxy_rdns=False
wrk_url='Для просмотра ссылки Войди или Зарегистрируйся'
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': 'Для просмотра ссылки Войди или Зарегистрируйся)
webdt = opener.open(init_req)
 
посмотри в сторону httplib2, очень хорошая штука. правда придется самому написать менеджер кукисов под нее.

вот пример работы с соксами со Для просмотра ссылки Войди или Зарегистрируйся:
Proxies

httplib2 can use a SOCKS proxy if the third-party socks module is installed.

Here is an example of how to use the proxy support:
Код:
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
 
Последнее редактирование модератором:
Да пример это хорошо, но столкнулся с проблемой проверки сертификата.
всем идущим по моим следам посовещается:
Код:
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, проблем нет :)
 
вот так
Код:
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/")
 
попробуй использовать Для просмотра ссылки Войди или Зарегистрируйся - удобный парсер с поддержкой проксей, написан нашим русским земляком
 
Я разные библиотеки юзал, остановился на requests, удобная штука. По скорости, читал, реализация через сокеты самая быстрая
 
Назад
Сверху