Skip to content

Обход капчи и ошибки 429 через вход в аккаунт Авито#226

Open
InvisibleRain wants to merge 77 commits intoDuff89:masterfrom
InvisibleRain:playwright-html-code
Open

Обход капчи и ошибки 429 через вход в аккаунт Авито#226
InvisibleRain wants to merge 77 commits intoDuff89:masterfrom
InvisibleRain:playwright-html-code

Conversation

@InvisibleRain
Copy link
Contributor

@InvisibleRain InvisibleRain commented Jan 4, 2026

Заранее извиняюсь за столь большой пулл-реквест, изначально ожидал что кода будет гораздо меньше.

Описание

Данный патч добавляет возможность практически полностью обойти rate-limit авито при работе без прокси. Успешно протестирована продолжительная работа парсера без прокси с интервалами pause_general и pause_between_links в одну секунду.

Детали работы

Для активации обхода rate-limit требуется войти в аккаунт Авито на системе с графическим интерфейсом через скрипт prompt_user_login.py или кнопку "Войти в аккаунт Авито". После успешного входа сессия пользователя будет сохранена в файл (по умолчанию state.json), после чего будет переиспользована в запросах через Playwright, в том числе и на серверах без графического интерфейса. Был существенно переработан сетевой код. Теперь для запросов к urls и для парсинга просмотров используется Playwright вместо requests.

Дополнительные изменения

Также в патче присутствуют мелкие изменения, которые было бы трудно мержить отдельно от данного PR:

  1. Обновлена версия библиотеки flet до 0.80.1 в AvitoParser.py. Это необходимо для работы GUI на современном линуксе.
  2. Исправлен некорректный путь до Playwright на линуксе и маке в методе ensure_playwright_installed
  3. Добавлен файл .gitignore во избежание случайного добавления чувствительных файлов в гит

Тестирование

Данный патч был протестирован на десктопном Debian 13, а также в контейнере из #224. На винде протестирован в чистом venv на Python 3.13.7; Win 11 25H2. Тестирование на macos не осуществлялось.

Технический долг

На данном этапе из кода не были удалены рудиментарные функции, такие как get_cookies, load_cookies, а также функции для работы с прокси в requests. Рудиментарные функции для работы с прокси в requests предлагаю оставить т.к. они могут пригодиться в случае недоступности телеграма в РФ.

В файлах get_cookies.py, parser_cls.py и prompt_user_login.py есть повторяющийся либо крайне похожий код для работы с Playwright, в том числе с его прокси. Предлагаю вынести весь функционал связанный с Playwright в отдельный класс, и при необходимости наследовать и переопределять методы из данного класса. Это упростит поддержку кода в будущем, а также упростит добавление новых фич, связанных с Playwright.

This is intended to fix "Не удалось получить HTML" error
E.g. this will pop up a graphical browser and then ask a user for
the password to their Avito account:
import asyncio
import prompt_user_login
asyncio.run(prompt_user_login.wrapper())
The leak happens when page.goto throws an error, but
the page is not closed properly.
After adding support for the playwright client from parser_cls there's a
lot of similar code being shared between get_cookies and parser_cls. It
would be a good idea to move proxy functionality into a separate class.
Methods from the new class can then be inherited and tailored for a
specific need.
Similar code exists in prompt_user_login and should probably be moved
into a separate file
@PhotikLed
Copy link
Contributor

При запуске на Windows AvitoParser.py не открывает окна и сразу завершается с кодом 0

@InvisibleRain
Copy link
Contributor Author

@PhotikLed Гляну на днях. Скинь пока версию винды, питона и flet. Ну и плюсом, запуск parser_cls.py в консоли работает?

@PhotikLed
Copy link
Contributor

@InvisibleRain Python 3.13.7; Flet: Version: 0.80.1; Win 11 25H2

parser_cls.py при использовании state.json при инициализации AvitoParse выдает предупреждение:

2026-01-05 02:44:33.546 | WARNING | playwright_setup:ensure_playwright_installed:47 - Ошибка при установке\проверке Playwright: module 'os' has no attribute 'uname'

А так да, работает

@PhotikLed
Copy link
Contributor

Ан, нет. При запросе уже второй страницы появляется ошибка:

2026-01-05 03:03:45.579 | ERROR | main:parse:233 - При валидации объявлений произошла ошибка: 1 validation error for ItemsResponse
items
Field required [type=missing, input_value={}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.9/v/missing

This reverts commit b6a686817a50d45f5f683cd326497cc55dacccce.
…void type errors in get_html"

This reverts commit cd8d21f.
@InvisibleRain
Copy link
Contributor Author

Перевел на requests, проверена работа как с прокси, так и без него

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants