@ilyarolf

Как парсить авито?

Как парсить авито на python?
Пробовал два метода
1)
import requests
from fake_useragent import UserAgent

userAgent = UserAgent().random
print(userAgent)
url = "https://www.avito.ru/"

response = requests.get(url,"user-agent:"+ userAgent);
print(response.text)

В этом случае выводится ошибка 403 или как говорит авито "Доступ ограничен: проблема с IP".
Пробовал добавить в заголовки
accept: 
accept-encoding:
accept-language:
content-type: 
cookie:

но это не дало результата.
2)
from selenium import webdriver
import time

driver = webdriver.Chrome(executable_path = "G:\\pythonProject\chromeDriver\chromedriver.exe")
url = "https://www.avito.ru/"

try:
    driver.get(url=url)
    time.sleep(5)
except Exception as ex:
    print(ex)
finally:
    driver.close()
    driver.quit()

Второй метод заключался в использовании модуля selenium, но тут я не нашёл решение следующей проблемы
G:\pythonProject\main.py:4: DeprecationWarning: executable_path has been deprecated, please pass in a Service object
driver = webdriver.Chrome(executable_path = "G:\\pythonProject\chromeDriver\chromedriver.exe")
Traceback (most recent call last):
File "G:\pythonProject\main.py", line 4, in
driver = webdriver.Chrome(executable_path = "G:\\pythonProject\chromeDriver\chromedriver.exe")
File "G:\AvitoPythonParsing\lib\site-packages\selenium\webdriver\chrome\webdriver.py", line 69, in __init__
super().__init__(DesiredCapabilities.CHROME['browserName'], "goog",
File "G:\AvitoPythonParsing\lib\site-packages\selenium\webdriver\chromium\webdriver.py", line 92, in __init__
super().__init__(
File "G:\AvitoPythonParsing\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 277, in __init__
self.start_session(capabilities, browser_profile)
File "G:\AvitoPythonParsing\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 370, in start_session
response = self.execute(Command.NEW_SESSION, parameters)
File "G:\AvitoPythonParsing\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 435, in execute
self.error_handler.check_response(response)
File "G:\AvitoPythonParsing\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: crashed.
(unknown error: DevToolsActivePort file doesn't exist)
(The process started from chrome location C:\Users\Пользователь\AppData\Local\Google\Chrome\Application\chrome.exe is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
Stacktrace:
Backtrace:
Ordinal0 [0x00246463+2188387]
Ordinal0 [0x001DE461+1762401]
Ordinal0 [0x000F3D78+802168]
Ordinal0 [0x00111F40+925504]
Ordinal0 [0x0010E331+910129]
Ordinal0 [0x00141430+1119280]
Ordinal0 [0x0014108A+1118346]
Ordinal0 [0x0013C5F6+1099254]
Ordinal0 [0x00116BE0+945120]
Ordinal0 [0x00117AD6+948950]
GetHandleVerifier [0x004E71F2+2712546]
GetHandleVerifier [0x004D886D+2652765]
GetHandleVerifier [0x002D002A+520730]
GetHandleVerifier [0x002CEE06+516086]
Ordinal0 [0x001E468B+1787531]
Ordinal0 [0x001E8E88+1805960]
Ordinal0 [0x001E8F75+1806197]
Ordinal0 [0x001F1DF1+1842673]
BaseThreadInitThunk [0x75CBFA29+25]
RtlGetAppContainerNamedObjectPath [0x77947A9E+286]
RtlGetAppContainerNamedObjectPath [0x77947A6E+238]
(No symbol) [0x00000000]

chromedriver подбирал по версию chrome, сам chromedriver добавил в переменную PATH. Пытался воспользоваться решениями со stackoverflow, но это не дало результата.
Вопрос заключается в следующем, есть ли какие-то другие методы парсинга на python? Или как возможно обойти блокировку avito, или как можно решить проблему с selenium?
  • Вопрос задан
  • 13346 просмотров
Пригласить эксперта
Ответы на вопрос 4
@DenisShahbazyan
С помощью Selenium

Через pip устанавливаешь selenium и webdriver_manager
Задержку с помощью sleep() не рекомендую делать, лучше дожидаться загрузки элемента.
С веб-драйверами не парься, в блоке try все сделается автоматически, в этом поможет библа webdriver_manager.

from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager


URL = 'https://www.avito.ru/moskva/bytovaya_elektronika'
PAUSE_DURATION_SECONDS = 5


def main():
    driver.get(URL)
    sleep(PAUSE_DURATION_SECONDS)


if __name__ == '__main__':
    try:
        service = Service(executable_path=ChromeDriverManager().install())
        driver = webdriver.Chrome(service=service)
        main()
    except Exception as e:
        print(e)
    finally:
        driver.quit()


---

С помощью requests предполагаю, что всего на всего нужно правильные заголовки передать, и все будет работать, будет время, попробую и отпишусь.
Ответ написан
Комментировать
gedeys
@gedeys
Правильно выше написали, используй ChromeDriverManager или еще лучше undetected-chromedriver (https://github.com/ultrafunkamsterdam/undetected-c...), в обоих случаях нужный драйвер подкачивается автоматически, а во втором случае он еще и пропатченный специально для таких случаев...
Ответ написан
solotony
@solotony
покоряю пик Балмера
авито парсить сложно (но можно)

потребуется как минимум реализовать

- отключение определения webdriver в JS
- смена IP
- смена пользователей (телефонов)
- обход fingerprint
- имитация естественного поведения

это те проблемы с которыми я сталкивался когда в последний раз их парсил (задача была мониторить определенные категории на предмет активности конкурентов и поступления новых объявлений) - работу отдал года полтора назад - все работало. как сейчас не знаю но заказчик с проблемами не обращался.
Ответ написан
Комментировать
Авито очень много вкладывает в защиту от парсинга, так что никак (в общем случае)
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы