Пожалуйста, обратите внимание, что пользователь заблокирован
В общем задача такая: нужно парсить с 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 региона, то отрабатывает на ура и никаких ошибок нет. Пытался ставить мьютексы, но они совсем не помогали
Как правильно организовать код? Буду очень благодарен
Json с проксями
Проблема, если 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())
Код:
{
{
"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
}
}
}
}