Бесплатный парсер Авито поможет вам собрать информацию о товарах

Если вы просто ищете парсер Авито и не хотите научиться писать парсеры самостоятельно, вы можете просто загрузить готовый парсер AVITO.RU в ваш аккаунт на платформе Diggernaut из нашего каталога бесплатных парсеров

Представленный здесь парсер авито поможет вам собрать информацию и товарах из объявлений в системе Avito.ru. Авито является одной из самых популярных в России досок объявлений частных лиц, на которой представлены десятки миллионов товаров. С помощью этого парсера вы сможете забрать информацию о товарах, представленных в заданной категории, а также, если вы будете использовать собственный российский прокси — контактную информацию продавца.

обновление парсеров 15.11.2019 в связи с изменением некоторых селекторов на сайте

Небольшое дополнение. Основной парсер в данной статье парсит обычную версию сайта. В обычной версии сайта телефоны показываются как изображения, а потому требуют специальный OCR функционал, который есть у нас в облаке, но отсутствует в скомпилированной версии. Поэтому запуск парсера вне нашего облака был ранее практически невозможен (была возможность сбора данных без контактных телефонов). Теперь мы представляем вам также парсер для мобильной версии сайта. Этот парсер не требует OCR, и вы сможете использовать скомпилированную версию парсера у себя на компьютере или сервере.

Примерное количество товаров: в зависимости от категории от нескольких сотен до нескольких миллионов
Примерное количество запросов: в зависимости от категории от нескольких сотен до нескольких миллионов
Рекомендуемый план подписки: в зависимости от категории от Free до XX-Large

ВНИМАНИЕ! Количество запросов может превышать количество товаров, потому что данные о вариациях, изображениях и др. могут парсится используя запросы к дополнительным ресурсам. Также часть данных о товаре может доставляться с помощью XHR запросов, что также увеличивает общее количество необходимых запросов.

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

Для использования парсера информации с сайта Авито вы должны иметь учетную запись в нашем сервисе Diggernaut.

  1. Пройдите по этой ссылке для регистрации в сервисе Diggernaut
  2. После регистрации и подтверждения email адреса войдите в свою учетную запись
  3. Создайте проект с любый именем и описанием, если вы не знаете как, обратитесь к нашей документации
  4. Войдите во вновь созданный проект и создайте в нем диггер с любым именем, если вы не знаете как, обратитесь к нашей документации
  5. Скопируйте в буфер обмена приведенный ниже сценарий диггера и вставьте его в созданный вами диггер, если вы не знаете как, обратитесь к нашей документации
  6. ВНИМАНИЕ! Базовые прокси сервера не позволят вам собирать контактную информацию продавцов если вы используете парсер для обычной версии сайта. Для этого вам будет нужен собственный российский прокси-сервер. Тип прокси должен быть HTTP/HTTPS (SOCKS4/5 в данный момент не поддерживаются). Вы должны будете прописать ваш прокси сервер в сценарии, как указано. Если этот пункт вам непонятен и вы затрудняетесь как это сделать, свяжитесь с нами через систему поддержки или используя наш онлайн чат, мы обязательно вам поможем. Обратите внимание что символа # не должно быть в строке с вашим прокси, очень многие делают ошибку, оставляя символ решетки перед своим прокси. Другими словами в строке с вашим прокси должно быть не:
    proxy: #1.1.1.1:8888

а

    proxy: 1.1.1.1:8888

Естественно вы должны использовать IP, порт (и возможно логин и пароль для прокси) именно вашего прокси, а не примера данного в этой статье. Для парсера мобильной версии сайта российский прокси не требуется.

  1. При необходимости, в 10 строке сценария поставьте URL категории, которую вы хотите парсить, то есть замените категорию, которая стоит сейчас, нужной вам.
  2. Переключите режим работы диггера с Debug на Active, если вы не знаете как, обратитесь к нашей документации
  3. Запустите ваш диггер и дождитесь окончания его работы, если вы не знаете как, обратитесь к нашей документации
  4. Скачайте собранный набор данных в нужном вам формате, если вы не знаете как, обратитесь к нашей документации

В дальнейшем вы можете установить расписание для запуска вашего парсера и забирать информацию регулярно. Также вы можете скомпилировать ваш диггер для запуска его на вашем компьютере или сервер, для получения дополнительной информации, обратитесь к документации.

Сценарий парсера мобильного сайта Avito

---
config:
    debug: 2
    agent: "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36"
do:
- link_add:
    pool: catalog
    url: 'https://m.avito.ru/ufa/kvartiry/sdam/na_dlitelnyy_srok/ne_posledniy?cd=1&pmax=60000&pmin=40000'
- walk:
    to: links
    pool: catalog
    do:
    - variable_clear: key
    - variable_clear: sp
    - variable_clear: laststamp
    - find:
        path: script
        do:
        - variable_get: key
        - if:
            match: \S
            else:
            - parse:
                attr: src
            - if:
                match: mstatic\/build
                do:
                - set_converter:
                    content_type: application/javascript
                    converter: image
                - walk:
                    to: value
                    do:
                    - variable_clear: filt
                    - find: 
                        path: imgbase64
                        do: 
                        - parse
                        - normalize:
                            routine: Base64Decode
                        - filter: 
                            args:
                                - params\:\s*\{\s*key\:\s*\"?([A-Za-z0-9\$]+)\"?\s*\}\,data
                        - normalize:
                            routine: replace_substring
                            args:
                                \$: '\$'
                        - variable_set: filt
                        - parse
                        - normalize:
                            routine: Base64Decode
                        - filter:
                            args:
                                - \,\s*\s*\=\s*\"([^"]+)\"\;
                                - var\s*\s*\=\s*\"([^"]+)\"
                        - if:
                            match: \S
                            do:
                            - variable_set: key
                - clear_converter:
                    content_type: application/javascript
    - find:
        path: script:contains('window.__initialData__')
        do:
        - parse
        - eval:
            routine: js
            body: (function () {var window = {}; ; return JSON.stringify(window.__initialData__);})();
        - normalize:
            routine: json2xml
        - to_block
        - find:
            path: search > searchparams > *
            do:
            - variable_get: nodeName
            - normalize:
                routine: replace_substring
                args:
                - categoryid: categoryId
                - locationid: locationId
            - if:
                match: 'owner'
                do:
                - register_set: owner%5B0%5D
                - variable_set: nodeName
            - variable_set: nodeName
            - parse
            - register_set: &=
            - variable_set: sp
        - register_set: key=
        - variable_set: sp
        - find:
            path: search > laststamp
            do:
            - parse
            - variable_set: laststamp
    - variable_set:
        field: repeat
        value: "yes"
    - variable_set:
        field: page
        value: 1
    - walk:
        to: https://m.avito.ru/api/9/items?&page=&lastStamp=&display=list&limit=30
        repeat: 
        do:
        - sleep: 3
        - variable_set:
            field: repeat
            value: "no"
        - find:
            path: status
            do:
            - eval:
                routine: js
                body: (function () {var page = ; return page + 1;})();
            - variable_set: page
        - find:
            path: result > laststamp
            do:
            - parse
            - variable_set: laststamp
        - find:
            path: result > items > value > uri_mweb
            do:
            - variable_set:
                field: repeat
                value: "yes"
            - parse
            - if:
                match: \w+
                do:
                - normalize:
                    routine: url
                - variable_set:
                    field: repeat2
                    value: "yes"
                - walk:
                    to: value
                    repeat: 
                    do:
                    - sleep: 3
                    - find:
                        path: 'div#app'
                        do:
                        - variable_set:
                            field: repeat2
                            value: "no"
                        - object_new: item
                        - static_get: url
                        - object_field_set:
                            object: item
                            field: url
                        - find: 
                            path: script:matches(window\.\_\_initialData\_\_\s*\=) 
                            in: doc
                            do: 
                            - parse
                            - eval:
                                routine: js
                                body: (function () {var window = {}; ; return JSON.stringify(window.__initialData__);})();
                            - normalize:
                                routine: json2xml
                            - toblock
                            - find: 
                                path: body_safe 
                                do: 
                                - find: 
                                    path: list:hasChild(type:matches(phone)) > value > uri
                                    do: 
                                    - parse:
                                        filter: 
                                            - number\=(.+)\s*$
                                    - if:
                                        match: \d
                                        do:
                                        - normalize:
                                            routine: URLDecode
                                        - object_field_set:
                                            object: item
                                            field: phone
 
                                - find: 
                                    path: 'images > safe_640x480'
                                    do: 
                                    - parse
                                    - if:
                                        match: \S
                                        do:
                                        - object_field_set:
                                            object: item
                                            field: image
                                            joinby: "|"
                                - find: 
                                    path: coords 
                                    do: 
                                    - find: 
                                        path: lat
                                        do: 
                                        - parse
                                        - if:
                                            match: \S
                                            do:
                                            - object_field_set:
                                                object: item
                                                field: lat
                                                type: float
                                    - find: 
                                        path: lng 
                                        do: 
                                        - parse
                                        - if:
                                            match: \S
                                            do:
                                            - object_field_set:
                                                object: item
                                                field: lng
                                                type: float
                                - find: 
                                    path: item > id
                                    do: 
                                    - parse:
                                        filter: (\d+)
                                    - space_dedupe
                                    - trim
                                    - object_field_set:
                                        object: item
                                        field: id
                                    - walk:
                                        to: https://m.avito.ru/api/1/items//phone?key=
                                        do:
                                        - find: 
                                            path: uri 
                                            do: 
                                            - parse:
                                                filter:
                                                    - number\=([^?]+)
                                            - if:
                                                match: \d
                                                do:
                                                - normalize:
                                                    routine: URLDecode
                                                - object_field_set:
                                                    object: item
                                                    field: phone
                                                
                                - find: 
                                    path: item > time
                                    do: 
                                    - parse:
                                        filter: (\d+)
                                    - if:
                                        match: \d+
                                        do:
                                        - normalize:
                                            routine: date_format
                                            args:
                                                format_in: "%s"
                                                format_out: "%Y-%m-%d %T"
                                        - object_field_set:
                                            object: item
                                            field: actualized
                                - find: 
                                    path: item > stats > views > total
                                    do: 
                                    - parse:
                                        filter: (\d+)
                                    - if:
                                        match: \d+
                                        do:
                                        - object_field_set:
                                            object: item
                                            field: views_total
                                - find: 
                                    path: item > stats > views > today
                                    do: 
                                    - parse:
                                        filter: (\d+)
                                    - if:
                                        match: \d+
                                        do:
                                        - object_field_set:
                                            object: item
                                            field: views_today
                        - find:
                            path: 'h1[itemprop="name"]'
                            in: doc
                            do:
                            - parse
                            - space_dedupe
                            - trim
                            - object_field_set:
                                object: item
                                field: title
                        - find:
                            path: 'meta[itemprop="priceCurrency"]'
                            do:
                            - parse:
                                attr: content
                            - object_field_set:
                                object: item
                                field: currency
                        - find: 
                            path: 'meta[itemprop="price"]' 
                            do: 
                            - parse:
                                attr: content
                            - object_field_set:
                                object: item
                                field: price
                        - find:
                            path: 'meta[itemprop="description"]'
                            do:
                            - parse:
                                attr: content
                            - space_dedupe
                            - trim
                            - object_field_set:
                                object: item
                                field: description
                        - find:
                            path: 'span[data-marker="delivery/location"]'
                            do:
                            - parse
                            - space_dedupe
                            - trim
                            - object_field_set:
                                object: item
                                field: address
 
                        - find:
                            path: 'span[data-marker="seller-info/name"]'
                            do:
                            - parse
                            - space_dedupe
                            - trim
                            - object_field_set:
                                object: item
                                field: seller
                        - object_save:
                            name: item
                    - find:
                        path: body
                        do:
                        - variable_get: repeat2
                        - if:
                            match: "yes"
                            do:
                            - proxy_switch

Обратите внимание, что стартовый URL должен вести на мобильный сайт, а не на основной: m.avito.ru вместо www.avito.ru

Сценарий парсера обычной версии сайта Авито

ВНИМАНИЕ!!! парсер обычной версии сайта больше не поддерживается ввиду малого спроса из-за присутствия платной опции OCR. Используйте парсер мобильной версии сайта. Если вам нужна именно обычная версия сайта и этот парсер перестал работать, мы можем обновить парсер лично для вас, но не бесплатно.

---
config:
    debug: 2
    proxy: #ВСТАВЬТЕ СЮДА ВАШ ПРОКСИ СЕРВЕР В ВИДЕ 1.1.1.1:8888
    agent: "Firefox"
do:
- link_add:
    pool: catalog
    url:
    - https://www.avito.ru/kostroma/detskaya_odezhda_i_obuv
- walk:
    to: links
    pool: catalog
    do:
    - sleep: 3
    - find:
        path: a.js-pagination-next
        do:
        - parse:
            attr: href
        - space_dedupe
        - trim
        - if:
            match: \w+
            do:
            - normalize:
                routine: url
            - link_add:
                pool: catalog
    - find:
        path: a.item-description-title-link
        do:
        - parse:
            attr: href
        - space_dedupe
        - trim
        - if:
            match: \w+
            do:
            - normalize:
                routine: url
            - link_add:
                pool: pages
- walk:
    to: links
    pool: pages
    do:
    - find:
        path: div.item-view-content
        do:
        - object_new: item
        - static_get: url
        - object_field_set:
            object: item
            field: url
        - find:
            path: .item-view-header span.title-info-title-text
            in: doc
            do:
            - parse
            - space_dedupe
            - trim
            - object_field_set:
                object: item
                field: title
        - find:
            path: div.title-info-metadata-item-redesign
            slice: 0
            in: doc
            do:
            - parse
            - space_dedupe
            - trim
            - object_field_set:
                object: item
                field: actualized
        - find:
            path: span[data-marker="item-view/item-id"]
            in: doc
            do:
            - parse:
                filter: (\d+)
            - object_field_set:
                object: item
                field: id
        - find:
            path: div.title-info-metadata-item.title-info-metadata-views
            in: doc
            do:
            - node_remove: i
            - parse:
                filter: (\d+)\s*\(
            - object_field_set:
                object: item
                field: views_total
            - parse:
                filter: (\d+)\s*\)
            - object_field_set:
                object: item
                field: views_today
        - find:
            path: span[itemprop="price"]
            slice: 0
            in: doc
            do:
            - parse:
                attr: content
                filter: (\d+)
            - object_field_set:
                object: item
                field: price
        - find:
            path: span[itemprop="priceCurrency"]
            slice: 0
            in: doc
            do:
            - parse:
                attr: content
            - object_field_set:
                object: item
                field: currency
        - find:
            path: div.item-description-text
            do:
            - parse
            - space_dedupe
            - trim
            - object_field_set:
                object: item
                field: description
        - find:
            path: span[itemprop="address"]
            do:
            - find:
                path: meta[itemprop="addressLocality"]
                do:
                - parse:
                    attr: content
                - space_dedupe
                - trim
                - object_field_set:
                    object: item
                    field: city
            - parse
            - space_dedupe
            - trim
            - object_field_set:
                object: item
                field: address
        - find:
            path: div.gallery-img-frame
            do:
            - parse:
                attr: data-url
            - space_dedupe
            - trim
            - if:
                match: \w+
                do:
                - normalize:
                    routine: url
                - object_field_set:
                    object: item
                    field: image
                    joinby: "|"
        - find:
            path: div.item-view-seller-info div.seller-info-name
            do:
            - parse
            - space_dedupe
            - trim
            - object_field_set:
                object: item
                field: seller
        - find:
            in: doc
            path: script:contains('avito.item.phone')
            do:
            - static_get: url
            - variable_set: referer
            - parse:
                filter: avito\.item\.phone\s*\=\s*'([^']+)'
            - variable_set: key
            - parse:
                filter: avito\.item\.url\s*\=\s*'[^']+_(\d+)';
            - variable_set: id
            - eval:
                routine: js
                body: '(function (){var key = ""; var id = ""; var pre = key.match(/[\da-f]+/g); if (id % 2 == 0) {pre = pre.reverse();} var mixed = pre.join(""); var s = mixed.length; var r = ""; for (var k = 0; k ?pkey=
                do:
                - find:
                    path: image64
                    do:
                    - parse:
                        filter: data\:image\/png\;base64\,(.+)
                    - ocr:
                        do:
                        - text
                        - object_field_set:
                            object: item
                            field: phone
        - object_save:
            name: item

Пример данных, собранных парсером с сайта (номера телефонов замаскированы намеренно)

Ниже приведен пример датасета с несколькими товарами в формате JSON (для наглядности). Датасет может быть скачан и как CSV, XLSX, XML, и любой другой текстовый формат используя темплейтный подход.

[{
    "item": {
        "address": "",
        "city": "Кострома",
        "currency": "RUB",
        "description": "Качественная куртка на девочку рост 152-156,очень хорошее состояние , ещё есть плащ,пальто,ветровки все вещи очень хорошего качества и состояния.Торг",
        "image": "https://57.img.avito.st/640x480/3767143557.jpg|https://44.img.avito.st/640x480/3767143544.jpg|https://06.img.avito.st/640x480/3767143606.jpg",
        "phone": "8 910 951-XX-XX",
        "price": "1000",
        "seller": "Владелец",
        "title": "Куртка orbi",
        "url": "https://www.avito.ru/kostroma/detskaya_odezhda_i_obuv/kurtka_orbi_1216046098"
    }
}
,{
    "item": {
        "address": "р-н Центральный",
        "city": "Кострома",
        "currency": "RUB",
        "description": "Очень теплый фирменный костюм. Современные непромокаемые ткани, утеплитель термофайбер, на замочке в самые сильные морозы пристегивается овечья жилеточка. Натуральная опушка енота. Атласная ткань очень красиво смотрится. Цвет куртки серебро.Размер 98+6(в наличии 2 шт) Есть в размере 92+, в сиреневом цвете и черно малиновом цвете. Смотрим мой профиль.",
        "image": "https://94.img.avito.st/640x480/3937582594.jpg|https://11.img.avito.st/640x480/3991374611.jpg|https://81.img.avito.st/640x480/3991375181.jpg|https://34.img.avito.st/640x480/3991375634.jpg",
        "phone": "8 953 643-XX-XX",
        "price": "2900",
        "seller": "Анна",
        "title": "Новый фирменный зимний костюм 98(+6)",
        "url": "https://www.avito.ru/kostroma/detskaya_odezhda_i_obuv/novyy_firmennyy_zimniy_kostyum_986_971178895"
    }
}
,{
    "item": {
        "address": "р-н Заволжский",
        "city": "Кострома",
        "currency": "RUB",
        "description": "Продам очень красивый комбинезон фирмы PULKA, спереди и сзади расшит жемчужными бусинами, на капюшоне мех кролика. Рост 86+6 зимний, очень тёплый. Носили не долго, очень быстро выросли, поэтому состояние нового. Стоил 10000 руб, отдаю значительно дешевле, могу переслать.",
        "image": "https://77.img.avito.st/640x480/4000143977.jpg|https://89.img.avito.st/640x480/4000143989.jpg|https://50.img.avito.st/640x480/4000144650.jpg|https://90.img.avito.st/640x480/4000144890.jpg|https://28.img.avito.st/640x480/4000146328.jpg|https://18.img.avito.st/640x480/4005046218.jpg|https://48.img.avito.st/640x480/4005059848.jpg",
        "phone": "8 953 644-XX-XX",
        "price": "3500",
        "seller": "Ирина",
        "title": "Зимний комбинезон для девочки",
        "url": "https://www.avito.ru/kostroma/detskaya_odezhda_i_obuv/zimniy_kombinezon_dlya_devochki_1179134523"
    }
}
,{
    "item": {
        "address": "",
        "city": "Кострома",
        "currency": "RUB",
        "description": "Новый шлем Ралли Цвет: Серый, размер 52-54",
        "image": "https://08.img.avito.st/640x480/4072842008.jpg",
        "phone": "8 953 653-XX-XX",
        "price": "300",
        "seller": "Светлана",
        "title": "Новая шапка-шлем на мальчика",
        "url": "https://www.avito.ru/kostroma/detskaya_odezhda_i_obuv/novaya_shapka-shlem_na_malchika_1161685106"
    }
}]
Михаил Сисин: Со-основатель облачного сервиса по сбору информации и парсингу сайтов Diggernaut. Работает в области сбора и анализа данных, а также разработки систем искусственного интеллекта и машинного обучения  более десяти лет.
Related Post

This website uses cookies.