• XSS.stack #1 – первый литературный журнал от юзеров форума

Как исправить ошибку ? cannot unpack non-iterable NoneType object Async

Peace

(L3) cache
Забанен
Регистрация
19.12.2022
Сообщения
255
Реакции
80
Пожалуйста, обратите внимание, что пользователь заблокирован
В общем задача такая: нужно парсить с 3 регионов по тегу его позицию в поиске. Реализация такая(возможно лютый говнокод, но что-то не смог додумать лучше идею): запуск 3 асинхронных задач по региону, после запуск асинхронных задач под каждый тег. Т.е если 20 тегов, то выходит, что в 1 регионе выходит 20 задач.
Проблема, если regions = [{'region': 'RU', 'lang': 'ru', 'smile': '🇷🇺'},{'region': 'US', 'lang': 'en', 'smile': '🇺🇸'}, {'region': 'DE', 'lang': 'de', 'smile': '🇩🇪'}] оставить таким образом, то выходят такие ошибки:
cannot unpack non-iterable NoneType object get_tags_seo
cannot unpack non-iterable NoneType object get_tags_seo_in_region

Но если оставить 2 региона, то отрабатывает на ура и никаких ошибок нет. Пытался ставить мьютексы, но они совсем не помогали
Как правильно организовать код? Буду очень благодарен
Python:
import aiofiles
import json
import asyncio
import aiohttp
from aiohttp_socks import ProxyConnector

writeproxy = asyncio.Lock()



async def update_proxies(region):
    try:
        async with writeproxy:
            async with aiofiles.open('proxies.json', 'r') as f:
                proxy = json.loads(await f.read())

            min_used = float('inf')
            min_proxy = None
            need_key = ''
            for key, value in proxy[f'{region}'].items():
                if value['used'] < min_used:
                    min_used = value['used']
                    min_proxy = value['proxy']
                    need_key = key

            proxy[f'{region}'][need_key]['used'] = min_used + 1
        async with writeproxy:
            async with aiofiles.open('proxies.json', 'w') as f:
                await f.write(json.dumps(proxy, indent=4))
            return min_proxy
    except Exception as e:
        print(e, 'update_proxies')





async def get_seo(tag: str, videoid: str, session):
    headers = {
        'authority': 'www.youtube.com',
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
        'accept-language': 'ru-RU,ru;q=0.9',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
    }

    params = {
        'search_query': f"{tag}",
        'sp': 'EgIQAQ%3D%3D',
    }
    rank = 0
    try:
        async with session.get('https://www.youtube.com/results', params=params, headers=headers) as response:
            data_good = await response.text()
            data_good = data_good.split('var ytInitialData = ')[1].split(';</script>')[0]
            continuation = \
                json.loads(data_good)['contents']['twoColumnSearchResultsRenderer']['primaryContents'][
                    'sectionListRenderer'][
                    'contents'][1]['continuationItemRenderer']['continuationEndpoint']['continuationCommand']['token']
            data_good = \
                json.loads(data_good)['contents']['twoColumnSearchResultsRenderer']['primaryContents'][
                    'sectionListRenderer'][
                    'contents'][0]['itemSectionRenderer']['contents']
            for i in data_good:
                if 'videoRenderer' in i:
                    if i['videoRenderer']['videoId'] == f'{videoid}':
                        rank += 1
                        return rank, tag
                    else:
                        rank += 1
        return None, tag
    except Exception as e:
        print(e, 'get_seo')


async def get_tags_seo(tags: list, videoid: str, region):
    try:
        proxy = await update_proxies(region['region'])
        connector = ProxyConnector.from_url(f'socks5://{proxy}')
        print(proxy)
        async with aiohttp.ClientSession(connector=connector) as session:
            tasks = []
            for tag in tags:
                task = asyncio.create_task(get_seo(tag, videoid, session))
                tasks.append(task)
            done, _ = await asyncio.wait(tasks)
            results = []
            for task in done:
                rank, tag = task.result()
                if rank is not None:
                    results.append({'text': tag, 'search_rank': rank})
                else:
                    results.append({'text': tag})
            return results, region
    except Exception as e:
        print(e, 'get_tags_seo')


async def get_tags_seo_in_region():
    tags = ['inline бот', 'python', 'telegram', 'бот', 'aiogram', 'telegram бот', 'telegram bot python',
            'telegram бот на python', 'python telegram бот', 'телеграм бот', 'inline режим']
    videoid = 'Cn0sMvgqf4E'
    regions = [{'region': 'RU', 'lang': 'ru', 'smile': '🇷🇺'},{'region': 'US', 'lang': 'en', 'smile': '🇺🇸'}, {'region': 'DE', 'lang': 'de', 'smile': '🇩🇪'}]
    try:
        tasks = []
        for region in regions:
            task = asyncio.create_task(get_tags_seo(tags, videoid, region))
            tasks.append(task)
        done, _ = await asyncio.wait(tasks)
        tags_and_seo = []
        for task in done:
            results, region = task.result()
            tags_and_seo.append({'tags': results, 'region': region})
        print(tags_and_seo)
    except Exception as e:
        print(e, 'get_tags_seo_in_region')


if __name__ == '__main__':
    asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
    asyncio.run(get_tags_seo_in_region())
Json с проксями
Код:
{
{
    "RU": {
        "1": {
            "proxy": "ProxyshopTG:proxysoxybot@188.130.188.241:5501",
            "used": 5
        }
    },
    "US": {
        "1": {
            "proxy": "user111232:e3b4po@194.9.176.236:14665",
            "used": 6
        }
    },
    "DE": {
        "1": {
            "proxy": "eu3030403:vnjyaVaG5f@212.107.27.183:5842",
            "used": 4
        }
    }
}
}
 
Пожалуйста, обратите внимание, что пользователь заблокирован
в 111 добавил возвращение None,None. Теперь если один из регионов не отработал, то возвращает, то что отработало. Но ошибка не отработанном осталась
 
Последнее редактирование:
А в чём проблема очереди использовать?

По идее примерно так должно работать:


Python:
...
async def get_tags_seo(tags: list, videoid: str, regions: asyncio.Queue, result: asyncio.Queue):
    while regions.qsize():
        region = await regions.get()
        try:
            proxy = await update_proxies(region['region'])
            connector = ProxyConnector.from_url(f'socks5://{proxy}')
            print(proxy)
            async with aiohttp.ClientSession(connector=connector) as session:
                tasks = []
                # Тут тоже можно через очереди сделать...
                for tag in tags:
                    task = asyncio.create_task(get_seo(tag, videoid, session))
                    tasks.append(task)
                done, _ = await asyncio.wait(tasks)
                results = []
                for task in done:
                    rank, tag = task.result()
                    if rank is not None:
                        results.append({'text': tag, 'search_rank': rank})
                    else:
                        results.append({'text': tag})
                await result.put({'tags': results, 'region': region}})
        except Exception as e:
            print(e, 'get_tags_seo')

async def get_tags_seo_in_region():
    tags = ['inline бот', 'python', 'telegram', 'бот', 'aiogram', 'telegram бот', 'telegram bot python',
            'telegram бот на python', 'python telegram бот', 'телеграм бот', 'inline режим']
    videoid = 'Cn0sMvgqf4E'
    regions_list = [{'region': 'RU', 'lang': 'ru', 'smile': '🇷🇺'},{'region': 'US', 'lang': 'en', 'smile': '🇺🇸'}, {'region': 'DE', 'lang': 'de', 'smile': '🇩🇪'}]
    regions = asincio.Queue()
    for region in regions_list:
        await regions.put(region)
    result = asincio.Queue()
    await asyncio.gather(*[get_tags_seo(tags, videoid, regions, result) for _ in range(regions.qsize())])
    tags_and_seo = []
    while result.qsize():
        tags_and_seo.append(await result.get())
    except Exception as e:
        print(e, 'get_tags_seo_in_region')
    print(tags_and_seo)
...
 
Последнее редактирование:
Почему-то предыдуще сообщение долго модерируется, я сначала тут написал поправки к нему, потом понял как редактировать сообщение, отредактировал его, а это сообщение получается уже не нужно...
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Почему-то предыдуще сообщение долго модерируется, я сначала тут написал поправки к нему, потом понял как редактировать сообщение, отредактировал его, а это сообщение получается уже не нужно...
никогда не поздно узнать что то новое, спасибо
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх