Задать вопрос
@addison-cochran

Каким образом можно обойти ограничение по запросам к серверу в секунду?

Хочу спарсить всю стенку одной группы ВКонтакте. Там много записей.
Узнал, что есть метод wall.get, но его можно вызвать всего лишь 2500 раз в сутки. Этого недостаточно.
Потом узнал про то, что с мобильной версии при прокрутке страницы вниз выполняется такой запрос:
POST https://m.vk.com/clubXYZ?offset=35&own=1
Попробовал через requests - работает. Убрал own=1 - работает.
Также узнал, что ВКонтакте грузит всего 10 постов.
Т.е. если у группы 70'000 постов, то придется сделать 7'000 запросов. Каждый запрос выполняется за 0.2 c -> 23 минуты (а таких групп очень много)
Решил использовать потоки - не помогло, потоки с proxy - не помогло, асинхронные запросы - тоже.
Пробовал асинхронные запросы с прокси, но там костыль на костыле и все равно ничего не работает.
Что можно предпринять для того, чтобы ВКонтакте не банил мои запросы?
И как правильно использовать прокси, если это нужно?
Код

import random
import asyncio
import aiohttp
import aiohttp_socks
from aiohttp import ClientSession
from aiohttp_socks import SocksConnector
import pickle

storage = []

proxies = ['46.4.96.137:1080', '134.0.116.219:1080', '207.154.231.212:1080', '207.154.231.213:1080', '138.68.161.60:1080', '82.196.11.105:1080', '178.62.193.19:1080', '188.226.141.127:1080', '207.154.231.211:1080', '207.154.231.216:1080', '88.198.50.103:1080', '188.226.141.61:1080', '188.226.141.211:1080', '176.9.119.170:1080', '207.154.231.217:1080', '138.68.161.14:1080', '138.68.165.154:1080', '176.9.75.42:1080', '95.85.36.236:1080', '138.68.173.29:1080', '139.59.169.246:1080']


async def fetch(url, i):
    l = 1
    while l < 10000:
        await asyncio.sleep(random.randint(0, 10))
        proxy = random.choice(proxies)
        # print(proxy)
        try:
            async with ClientSession(connector=SocksConnector.from_url('socks5://' + proxy)) as session:
                async with session.post(url, data={'offset': i}, proxy='http://' + random.choice(proxies)) as response:
                    s = await response.read()
                    l = len(s)
                    print(l)
        except aiohttp.client_exceptions.ServerDisconnectedError:
            await asyncio.sleep(3)
        except aiohttp_socks.proxy.errors.ProxyError:
            await asyncio.sleep(3)
    storage.append(s)
    return s


async def bound_fetch(sem, url, i):
    # Getter function with semaphore.
    async with sem:
        await fetch(url, i)


async def run(r):
    url = 'https://m.vk.com/sketch.books'
    tasks = []
    # create instance of Semaphore
    sem = asyncio.Semaphore(1000)

    # Create client session that will ensure we dont open new connection
    # per each request.
    for i in range(0, r + 1, 10):
        # pass Semaphore and session to every GET request
        task = asyncio.ensure_future(bound_fetch(sem, url, i))
        tasks.append(task)

    responses = asyncio.gather(*tasks)
    await responses


number = 70610
loop = asyncio.get_event_loop()

future = asyncio.ensure_future(run(number))
loop.run_until_complete(future)

print(len(storage))
with open('sketch_books_2.vk', 'wb') as f:
    pickle.dump(storage, f)

  • Вопрос задан
  • 412 просмотров
Подписаться 2 Простой 16 комментариев
Решения вопроса 1
SilenceOfWinter
@SilenceOfWinter
та еще зажигалка...
прокси или парсить напрямую страницы
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
SpectrumData Екатеринбург
от 200 000 до 300 000 ₽
Akronix Санкт-Петербург
от 150 000 до 200 000 ₽
18 янв. 2025, в 10:04
50000 руб./за проект
18 янв. 2025, в 09:18
5500 руб./за проект
18 янв. 2025, в 07:20
50000 руб./за проект