Как сменить прокси, если текущий прокси недоступен?Python 3.6 - asyncio - aiohttp - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь разобрать страницы сайта.Есть 39 страниц для разбора.Мне нужно разобрать заголовок и код ответа каждой из 39 страниц.При частых запросах к ресурсу это возможно только через прокси, но многие прокси в списке не работают.Список прокси формируется из текстового файла.Все прокси носки5.Подскажите пожалуйста, как сменить текущий прокси на другой прокси из списка, пока прокси не станет работоспособным?В этом коде результат отображается в INFO в конце всех 39 запросов.Если возможно, укажите, как отобразить результат для каждой страницы, не дожидаясь разбора всех 39 страниц.Спасибо за помощь новичку!

import logging
import asyncio
import aiohttp
import time
import lxml.html
from fake_useragent import UserAgent
import requests
import random
import csv
from aiosocksy import Socks5Auth
from aiosocksy.connector import ProxyConnector, ProxyClientRequest

proxies = []
proxy = ''
ua = UserAgent()
url = 'https://www.rusprofile.ru/codes/236300/'
urls = []
for i in range(1,40,1):
    urls.append(url+str(i))

def get_headers():
    global headers
    headers = {'User-Agent': str(ua.chrome)}
    return headers

def get_proxy():
    global proxies
    r = requests.get('http://api.best-proxies.ru/proxylist.txt?key=xxxxxxxxxxxx&speed=1&type=socks5&limit=0')
    rows = r.text.split(u'\r\n')
    for row in rows:
        proxies.append(row)
get_proxy()

def set_proxy():
    global proxy, proxies
    if len(proxies) <10:
        get_proxy()
    proxy = random.choice(proxies)
    return ('socks5://'+proxy)

def remove_proxy():
    global proxy, proxies
    proxies.remove(proxy)
    with open ('proxy.csv', 'w', newline='') as ofile:
        for key in proxies:
            cs_writer = csv.writer(ofile, dialect='excel', delimiter=';')
            cs_writer.writerow([key])

connector = ProxyConnector()

async def fetch(client, url):
    data = dict.fromkeys(['err', 'title', 'url', 'status', 'text'])
    try:
        async with client.get(url, headers=get_headers(), proxy=set_proxy(), timeout=5) as r:
            # получение контента асинхронная операция, поэтому ее нужно await'ить\ожидать
            text = await r.text()
            title = lxml.html.fromstring(text).find(".//head/title").text  # cssselect('head title')[0].text
            data.update({
                'title': title,
                'status': r.status,
                'url': url,
                'text': text
            })
            return data

    except Exception as err:
        data.update({'err': str(err), 'url': url})
        return data

async def main(urls):
    async with aiohttp.ClientSession(connector=connector, request_class=ProxyClientRequest) as client:
        coroutines = [fetch(client, url) for url in urls]
        completed, pending = await asyncio.wait(coroutines)
        for item in completed:
            data = item.result()
            if not data['err']:
                log.info("%s %s %s",
                         data['title'],
                         data['status'],
                         data['url']
                         )
            else:
                log.error("%s %s",
                          data['url'],
                          data['err']
                          )


if __name__ == '__main__':
    log = logging.getLogger(__name__)
    format = '%(asctime)s %(levelname)s:%(message)s'
    logging.basicConfig(format=format, level=logging.INFO)
    log.info("Start")
    event_loop = asyncio.get_event_loop()

    try:
        t_start = time.time()
        event_loop.run_until_complete(main(urls))
        t_end = time.time()
        log.info("Time End: %s", t_end - t_start)
    finally:
        event_loop.close()

Теперь результат скрипта следующий:

2019-03-01 14:39:34,578 INFO:Start
2019-03-01 14:39:41,143 INFO:Производство товарного бетона, ОКВЭД 23.63 / Страница 32 200 https://www.rusprofile.ru/codes/236300/32
2019-03-01 14:39:41,143 INFO:Производство товарного бетона, ОКВЭД 23.63 / Страница 33 200 https://www.rusprofile.ru/codes/236300/33
2019-03-01 14:39:41,144 INFO:None None https://www.rusprofile.ru/codes/236300/34
2019-03-01 14:39:41,144 INFO:None None https://www.rusprofile.ru/codes/236300/16
2019-03-01 14:39:41,144 INFO:None None https://www.rusprofile.ru/codes/236300/35
2019-03-01 14:39:41,144 ERROR:https://www.rusprofile.ru/codes/236300/18 Can not connect to www.rusprofile.ru:443. Server sent fewer bytes than required (0 bytes read on a total of 3 expected bytes)
2019-03-01 14:39:41,144 ERROR:https://www.rusprofile.ru/codes/236300/1 Cannot connect to host www.rusprofile.ru:443 ssl:None [None]
2019-03-01 14:39:41,145 INFO:Производство товарного бетона, ОКВЭД 23.63 / Страница 36 200 https://www.rusprofile.ru/codes/236300/36
2019-03-01 14:39:41,145 INFO:None None https://www.rusprofile.ru/codes/236300/37
2019-03-01 14:39:41,145 INFO:None None https://www.rusprofile.ru/codes/236300/17
2019-03-01 14:39:41,145 INFO:None None https://www.rusprofile.ru/codes/236300/38
2019-03-01 14:39:41,146 INFO:None None https://www.rusprofile.ru/codes/236300/39
2019-03-01 14:39:41,146 INFO:Производство товарного бетона, ОКВЭД 23.63 / Страница 19 200 https://www.rusprofile.ru/codes/236300/19
2019-03-01 14:39:41,146 INFO:None None https://www.rusprofile.ru/codes/236300/2
2019-03-01 14:39:41,146 INFO:None None https://www.rusprofile.ru/codes/236300/20
2019-03-01 14:39:41,146 INFO:None None https://www.rusprofile.ru/codes/236300/3
2019-03-01 14:39:41,146 INFO:Производство товарного бетона, ОКВЭД 23.63 / Страница 13 200 https://www.rusprofile.ru/codes/236300/13
2019-03-01 14:39:41,147 INFO:None None https://www.rusprofile.ru/codes/236300/4
2019-03-01 14:39:41,147 INFO:Производство товарного бетона, ОКВЭД 23.63 / Страница 5 200 https://www.rusprofile.ru/codes/236300/5
2019-03-01 14:39:41,147 INFO:None None https://www.rusprofile.ru/codes/236300/14
2019-03-01 14:39:41,147 ERROR:https://www.rusprofile.ru/codes/236300/6 Cannot connect to host www.rusprofile.ru:443 ssl:None [[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)]
2019-03-01 14:39:41,147 ERROR:https://www.rusprofile.ru/codes/236300/15 Cannot connect to host www.rusprofile.ru:443 ssl:None [None]
2019-03-01 14:39:41,148 INFO:None None https://www.rusprofile.ru/codes/236300/7
2019-03-01 14:39:41,148 INFO:Производство товарного бетона, ОКВЭД 23.63 / Страница 21 200 https://www.rusprofile.ru/codes/236300/21
2019-03-01 14:39:41,148 ERROR:https://www.rusprofile.ru/codes/236300/8 Cannot connect to host www.rusprofile.ru:443 ssl:None [None]
2019-03-01 14:39:41,148 ERROR:https://www.rusprofile.ru/codes/236300/22 Can not connect to www.rusprofile.ru:443. Server sent fewer bytes than required (0 bytes read on a total of 3 expected bytes)
2019-03-01 14:39:41,149 INFO:Производство товарного бетона, ОКВЭД 23.63 / Страница 9 200 https://www.rusprofile.ru/codes/236300/9
2019-03-01 14:39:41,149 INFO:Производство товарного бетона, ОКВЭД 23.63 / Страница 23 200 https://www.rusprofile.ru/codes/236300/23
2019-03-01 14:39:41,149 INFO:403 Forbidden 403 https://www.rusprofile.ru/codes/236300/10
2019-03-01 14:39:41,149 ERROR:https://www.rusprofile.ru/codes/236300/24 Cannot connect to host www.rusprofile.ru:443 ssl:None [None]
2019-03-01 14:39:41,149 INFO:None None https://www.rusprofile.ru/codes/236300/11
2019-03-01 14:39:41,149 INFO:None None https://www.rusprofile.ru/codes/236300/25
2019-03-01 14:39:41,149 INFO:Производство товарного бетона, ОКВЭД 23.63 / Страница 12 200 https://www.rusprofile.ru/codes/236300/12
2019-03-01 14:39:41,159 INFO:Производство товарного бетона, ОКВЭД 23.63 / Страница 26 200 https://www.rusprofile.ru/codes/236300/26
2019-03-01 14:39:41,159 INFO:None None https://www.rusprofile.ru/codes/236300/27
2019-03-01 14:39:41,159 INFO:None None https://www.rusprofile.ru/codes/236300/28
2019-03-01 14:39:41,159 ERROR:https://www.rusprofile.ru/codes/236300/29 Cannot connect to host www.rusprofile.ru:443 ssl:None [None]
2019-03-01 14:39:41,160 ERROR:https://www.rusprofile.ru/codes/236300/30 Cannot connect to host www.rusprofile.ru:443 ssl:None [None]
2019-03-01 14:39:41,160 INFO:Производство товарного бетона, ОКВЭД 23.63 / Страница 31 200 https://www.rusprofile.ru/codes/236300/31
2019-03-01 14:39:41,165 INFO:Time End: 6.587148189544678
...