Ghost.py и прокси

Кто-нибудь может объяснить, как заставить Ghost.py работать с прокси? Я проверил код, но его там нет.

4 ответа

Решение

Я нашел это в файле ghost.py. Они сделали очень хорошую работу в этом. Это метод в строке 835, как set_proxy(). Это просто, как использовать это, что я еще не попробовал:

def set_proxy(self, type_, host='localhost', port=8888, user='',
        password=''):
    """Set up proxy for FURTHER connections.

    :param type_: proxy type to use: \
        none/default/socks5/https/http.
    :param host: proxy server ip or host name.
    :param port: proxy port.
    """
    _types = {
        'default': QNetworkProxy.DefaultProxy,
        'none': QNetworkProxy.NoProxy,
        'socks5': QNetworkProxy.Socks5Proxy,
        'https': QNetworkProxy.HttpProxy,
        'http': QNetworkProxy.HttpCachingProxy
    }

    if type_ is None:
        type_ = 'none'
    type_ = type_.lower()
    if type_ in ['none', 'default']:
        self.manager.setProxy(QNetworkProxy(_types[type_]))
        return
    elif type_ in _types:
        proxy = QNetworkProxy(_types[type_], hostName=host, port=port,
            user=user, password=password)
        self.manager.setProxy(proxy)
    else:
        raise ValueError('Unsupported proxy type:' + type_ \
        + '\nsupported types are: none/socks5/http/https/default')

Сейчас я не понимаю, что означает "QNetworkProxy.DefaultProxy". Это называется прокси по умолчанию. Итак, что такое прокси по умолчанию?

Если в Ghost.py способ создания tcp-соединений на основе Qt api, то вы можете использовать Qt/PySide api, см. QNetworkProxy::setApplicationProxy(). В противном случае, если Ghost.py не использует Qt Api, но, например, curl libe, вы пытаетесь установить переменную окружения "http_proxy"

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

from ghost import Ghost, Session
ghost = Ghost()
with ghost.start():
    session = Session(ghost)
    session.wait_timeout = 999
    session.set_proxy('http', str(ip), int(port), str(username), str(password))
    page, resource = session.open(url)
    print session.content # Prints html content
    print page.headers, page.url, page.http_status

У объекта-призрака есть только один метод, то есть start(). Остальные из них определены как методы класса Session.

В документации сказано, что QNetworkProxy.DefaultProxy: прокси-сервер определяется на основе набора прокси приложения, используя setApplicationProxy(). Поэтому, если прокси-сервер установлен QNetworkProxy::setApplicationProxy(), то вызов set_proxy('default') заставит его использовать (это будет передать прокси в self.manager, который, как я полагаю, является объектом QNetworkAccessManager).

Другие вопросы по тегам