Как сохранить несколько сеансов на одном хосте во время просмотра веб-страниц? - PullRequest
0 голосов
/ 15 января 2019

У меня проблема с моим кодом очистки веб-страниц. Вот суть этого:

У меня есть пул прокси, и я инициализирую объект сеанса для каждого прокси. После этого я передаю объект сеанса потоку, и этот поток затем очищает сайт (в данном случае, globenewswire.com). Моя проблема заключается в том, чтобы очистить один и тот же сайт несколькими сеансами одновременно. Когда у меня есть несколько объектов сеанса, которые работают в многопоточной среде, я получаю ошибки. Когда я запускаю свои сеансовые объекты по одному, я полностью в порядке.

import time
import requests
import threading

lock = threading.Lock()
proxy_pool = []  # List of 11 proxies with format: "0.0.0.0:0000"
session_pool = []


def print_lock(stuff):
    with lock:
        print(stuff)


def initialize_session(proxy):
    global session_pool
    proxiez = {"http": "http://" + proxy, "https": "http://" + proxy}
    s = requests.Session()
    s.mount('https://globenewswire.com', HTTPAdapter(pool_connections=1, pool_maxsize=11))
    s.proxies = proxiez
    while True:
        try:
            r = s.get('http://globenewswire.com/Search', headers={'headers': 'here'})
            if r.status_code == 200:
                break
            else:
                print_lock('r.status_code =', str(r.status_code), 'for proxy:', proxy)
        except Exception as e:
            print_lock('Error for proxy:', proxy + '. Error:', str(e))
        time.sleep(1)
    with lock:
        session_pool.append(s)
        print('Created Session now in session_pool with proxy: ' + proxy + '.')


startup_thread_list = []
for proxie in proxy_pool:
    startup_thread = threading.Thread(target=initialize_session, args=(proxie,))
    startup_thread_list.append(startup_thread)
    startup_thread.daemon = True
    startup_thread_list.append(startup_thread)
    startup_thread.start()
for thread in startup_thread_list:
    thread.join()
print('Set up all sessions.')


def remove_session():
    global session_pool
    while True:
        with lock:
            if len(session_pool) == 0:
                session_waited = 'yes'
            else:
                session = session_pool[0]
                session_pool.remove(session)
                break
        time.sleep(0.1)
    return session

while True:
    sesh = remove_session()
    doStuffwithSessionthread = threading.Thread(target=doStuff, args=(sesh,))
    doStuffwithSessionthread.daemon = True
    doStuffwithSessionthread.start()
    # Submit the session to only one thread
    # the thread then returns that session to the session_pool as its final task.
    time.sleep(4)

Интересно, что я пытался открыть отдельный интерпретатор Python для каждого прокси-сервера, который был у меня в пуле прокси, и передавал только один прокси в пул каждого интерпретатора. Я эффективно ограничил количество объектов сеанса одним интерпретатором. Я смог запустить 11 переводчиков бок о бок без каких-либо проблем. Однако, если я попытаюсь запустить 11 сеансов в одном интерпретаторе, я получу больше ошибок, чем код состояния 200. Это заставляет меня поверить, что у меня возникла проблема с модулем запросов или собственным кодом.

Requests рекомендует запускать только один объект сеанса на поток. Я точно знаю, что я запускаю не более одного потока для каждого имеющегося у меня объекта сеанса, но по некоторым причинам мои запросы https возвращаются как ошибки чаще, чем нет.

Этот код также отлично работает, если у вас есть только один объект сеанса, выполняющий запрос в любой момент времени в интерпретаторе, но выдает ошибки, как не завтра, как только несколько объектов сеанса делают запросы одновременно.

Это меня давно беспокоило, кто-нибудь знает, что может происходить? Пожалуйста, дайте мне знать, если мне нужно что-то прояснить.

...