0

Пытаюсь спарсить авито, но вместо каких-либо данных выводится пустой список, что бы я не писала. Любые классы, любые теги - все равно возвращает пустой список. Что с этим делать? Вот мой код:

import requests
from bs4 import BeautifulSoup

url = 'https://www.avito.ru/' html = requests.get(url)

soup = BeautifulSoup(html.text, 'lxml') a = soup.find_all('div', class_='body-titleRow-AvL3d') print(a)

  • "Что с этим делать?" 1 Забить толстый болт. 2 Искать альтернативные медоты парсинга 3 Использовать Selenium или requests_html. 4 Если чешется сделать через requests учитесь отлавливать запросы. – Сергей Ш Aug 28 '22 at 11:32
  • а как мне научиться отлавливать запросы? может у вас есть мысли, что почитать на эту тему? – jiezzzzzzzzz Aug 28 '22 at 11:38
  • https://ru.stackoverflow.com/a/924276/470333 https://hackware.ru/?p=7641 – Сергей Ш Aug 28 '22 at 11:42

1 Answers1

3

Если вы просто распечатаете html, который прилетает в ответ на запрос, в терминале, вы увидите следующее:

введите сюда описание изображения

Ну и, соответственно, если сохраните тот же код в файл, то увидите вот это:

введите сюда описание изображения

Однако, если вы будете заходить на авито через обычный браузер, то увидите, что все в порядке. Получается, что авито распознает в ваших запросах автоматические, даже если вы установите заголовки и куки, ответ будет один и тот же.

Но можно использовать selenium, про который писали в комментариях. Для этого, его надо установить с помощью pip, выполнив команду:

pip install selenium.

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

Подробнее, вы сможете прочитать об этом на странице самого проекта.

И установить браузер Google Chrome, если он у вас еще не установлен (для примера).

Ну и вот вам небольшой пример, в котором используется загрузка страницы с авито.

import os
import time
from platform import system

from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium_stealth import stealth

options = Options()

options.add_argument("--headless")

options.add_argument("start-maximized") options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False)

executable_path = None

if system() == "Windows": executable_path = os.path.join(os.getcwd(), 'chromedriver', 'chromedriver.exe') elif system() == "Linux": executable_path = os.path.join(os.getcwd(), 'chromedriver', 'chromedriver')

browser = webdriver.Chrome(options=options, service=Service(log_path=os.devnull, executable_path=executable_path))

stealth(driver=browser, user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/83.0.4103.53 Safari/537.36', languages=["ru-RU", "ru"], vendor="Google Inc.", platform="Win32", webgl_vendor="Intel Inc.", renderer="Intel Iris OpenGL Engine", fix_hairline=True, run_on_insecure_origins=True, )

url = 'https://www.avito.ru/' browser.get(url) time.sleep(1)

soup = BeautifulSoup(browser.page_source, 'lxml') a = soup.find_all('div', class_='body-titleRow-AvL3d') print(a)

browser.quit()

Что здесь происходит? Загружается браузер в, так называемом, стелс-режиме, который помогает скрывать то, что браузером управляет автоматизированное ПО. Однако, не всегда и не на всех сайтах. Затем браузеру устанавливаются определенные опции. Выполняется переход на страницу Авито, загружается страница, а потом я использовал ваш код, только загрузил туда те результаты, что были получены браузером. И теперь, тот тег, что вы искали, был успешно найден.

введите сюда описание изображения

Так что, да, для таких сайтов, как Авито, с динамическим контентом и защитой от разного рода парсеров и скреперов, можно использовать selenium.

UPD: Забыл упомянуть, что драйвер должен лежать, в данном примере, в папке "chromedriver", в директории проекта.

Надеюсь, что мое объяснение вам немного помогло.

Johan
  • 731
  • 2
  • 5