множественный доступ к сайту через запросы и прокси, Python - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь экстраполировать данные с веб-страницы. Данных много, около 50 строк на страницу, и мне приходится слишком часто заходить на один и тот же сайт за короткое время. Очевидно, что сайт блокирует мой IP, если я получаю доступ слишком быстро. Если я добавлю: time.sleep (4), я могу немного решить проблему, но если у меня есть 300 страниц для экстраполяции, это всего лишь 20 минут ожидания. Я пытаюсь реализовать proxybroker:

async def show(proxies):
while True:
    proxy = await proxies.get()
    if proxy is None: break
    print(proxy.host)
    #print(dir(proxy))
    #print("https://"+ str(proxy.host)+":"+str(proxy.port))


    p.append(proxy.port)
    h.append(proxy.host)       


proxies = asyncio.Queue()
broker = Broker(proxies)
tasks = asyncio.gather(
    broker.find(types=['HTTP', 'HTTPS'], limit=10),
    show(proxies))
loop = asyncio.get_event_loop()
loop.run_until_complete(tasks)

PB находит x прокси для использования: я помещаю их в два массива, один для хоста и один для порта.

Я делать текст с сайта: https://httpbin.org/ip. Я блокируюсь, если я пытаюсь войти в систему слишком много раз. если я использую этот код:

    for z in range (0.11):
    j = random.randint (0.9)
    print (j)
    my_url = "https://httpbin.org/ip"
    prox = {
                  "http": "https: //" + str (h [j]) + ":" + str (p [j]),
                  "https": "https: //" + str (h [j]) + ":" + str (p [j]),
    }

    r = requests.get (my_url, proxies = prox)
    while ((r.status_code == 429) or (r.status_code == 400)):
        print ("error 429, try again with another j random proxies")
        time.sleep (1)
        j = random.randint (0.9)
        print (j)
        prox = {
                      "http": "https: //" + str (h [j]) + ":" + str (p [j]),
                      "https": "https: //" + str (h [j]) + ":" + str (p [j]),
        }
        r = requests.get (my_url, proxies = prox)

    print (r.status_code)
    print ( "cycle" + str (z))
    print (r.json ())
    time.sleep (1)

Я пытаюсь получить доступ к одной и той же странице 10 раз с хостами: порт отличается. Но эта ошибка всегда возвращает:

requests.exceptions.ProxyError: HTTPSConnectionPool (host = 'httpbin.org', port = 443): Max retries exceeded with url: / ip (Caused by ProxyError ('Cannot connect to proxy.', ConnectionResetError ( 10054, "Connection in progress forcibly terminated by the remote host", None, 10054, None)))

На inte rnet я обнаружил, что, вероятно, добавив verify = False в request.get, который я могу разрешить. На самом деле это делает 10 циклов, где я возвращаю использованный хост, который почти всегда отличается и соответствует массивам прокси, взятым PB. Но это предупреждение возвращается ко мне:

 C: \ Users \ scart \ anaconda3 \ lib \ site-packages \ urllib3 \ connectionpool.py: 1004: InsecureRequestWarning: Unverified HTTPS request is being made to host '51 .158.107.202 '. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings

Может ли это последнее предупреждение быть проблемой на других сайтах? Вы знаете о рабочем или более эффективном альтернативном методе? Цель состоит в том, чтобы создать список из 20 хостов, чтобы 10 хостов использовали один поток и 10 других для максимизации скорости извлечения.

Спасибо всем

...