Requests: gevent + запрашивает блоки при использовании socks

Созданный на 10 февр. 2017  ·  3Комментарии  ·  Источник: psf/requests

Я использую python (2.7.6), gevnet (1.1.2), запросы (2.11.1) для одновременного выполнения HTTP-запросов, и это хорошо работает. Но когда я добавляю в запросы socks-прокси, он блокируется.

Это мой код:

import time
import requests
import logging
import click

import gevent
from gevent import monkey
monkey.patch_all()

FORMAT = '%(asctime)-15s %(message)s'
logging.basicConfig(format=FORMAT)
logger = logging.getLogger('test')

#socks proxy
user = MY_SOCKS_PROXY_USERNAME
password = MY_SOCKS_PROXY_PASSWORD
host = MY_SOCKS_PROXY_HOST
port = MY_SOCKS_PROXY_PORT
proxies = {
        'http': 'socks5://{0}:{1}@{2}:{3}'.format(user, password, host, port),
        'https': 'socks5://{0}:{1}@{2}:{3}'.format(user, password, host, port),
}
url = 'https://www.youtube.com/user/NBA'


def fetch_url(i,with_proxy):
    while True:
        logger.warning('thread %s fetch url'%i)
        try:
            if with_proxy:
                res = requests.get(url,proxies=proxies, timeout=5)
            else:
                res = requests.get(url, timeout=5)
        except Exception as e:
            logger.error(str(e))
            continue

        logger.warning(res.status_code)

def do_other_thing():
    while True:
        logger.warning('do other thing...')
        time.sleep(1)

@click.command()
@click.option('--with_proxy/--without_proxy',help='if use proxy', default=True)
def run(with_proxy):
    if with_proxy:
        logger.warning('with proxy......')
    else:
        logger.warning('without proxy......')
    ts = []
    ts.append(gevent.spawn(do_other_thing))
    for i in xrange(3):
        ts.append(gevent.spawn(fetch_url,i,with_proxy))
    gevent.joinall(ts)

if __name__=='__main__':
    run()

Эти картинки показывают результат.

работать с прокси
работать без прокси

С прокси do_other_thing будет блокироваться до завершения fetch_url.
Без прокси работает хорошо. (возникает ошибка тайм-аута из-за GFW)

Может ли кто-нибудь помочь мне решить эту проблему? Спасибо большое!

Самый полезный комментарий

Я предполагаю, что вы слишком поздно выловили обезьяну. При использовании gevent вы должны сначала установить monkeypatch, прежде чем импортировать что-либо еще. Выполнение этого позже рискует сломать все, что выполнило импорт from из вещей, которые gevent monkeypatches.

Можете ли вы попробовать переместить свой import и monkeypatch в самый верх вашего файла, прежде чем делать что-либо еще?

Все 3 Комментарий

Я предполагаю, что вы слишком поздно выловили обезьяну. При использовании gevent вы должны сначала установить monkeypatch, прежде чем импортировать что-либо еще. Выполнение этого позже рискует сломать все, что выполнило импорт from из вещей, которые gevent monkeypatches.

Можете ли вы попробовать переместить свой import и monkeypatch в самый верх вашего файла, прежде чем делать что-либо еще?

Да, «перемещение вашего import и monkeypatch в самый верх вашего файла» решило мою проблему! Большое спасибо!

Это предложение также решает проблему моего проекта.
У меня есть 3 файла с именами A, B, C, а последовательность запуска - A-> B-> C. Я использую gevent в B, поэтому я добавляю monkeypatch в B, но я блокирую запросы + носки. Теперь я добавляю monkeypatch в самый верх A, теперь он отлично работает! Надеюсь, это поможет другим!

Еще раз спасибо!

Рад помочь!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги