Если вы просто ищете парсер Авито и не хотите научиться писать парсеры самостоятельно, вы можете просто загрузить готовый парсер AVITO.RU в ваш аккаунт на платформе Diggernaut из нашего каталога бесплатных парсеров
Представленный здесь парсер авито поможет вам собрать информацию и товарах из объявлений в системе Avito.ru. Авито является одной из самых популярных в России досок объявлений частных лиц, на которой представлены десятки миллионов товаров. С помощью этого парсера вы сможете забрать информацию о товарах, представленных в заданной категории, а также, если вы будете использовать собственный российский прокси — контактную информацию продавца.
обновление парсеров 15.11.2019 в связи с изменением некоторых селекторов на сайте
Небольшое дополнение. Основной парсер в данной статье парсит обычную версию сайта. В обычной версии сайта телефоны показываются как изображения, а потому требуют специальный OCR функционал, который есть у нас в облаке, но отсутствует в скомпилированной версии. Поэтому запуск парсера вне нашего облака был ранее практически невозможен (была возможность сбора данных без контактных телефонов). Теперь мы представляем вам также парсер для мобильной версии сайта. Этот парсер не требует OCR, и вы сможете использовать скомпилированную версию парсера у себя на компьютере или сервере.
Примерное количество товаров: в зависимости от категории от нескольких сотен до нескольких миллионов
Примерное количество запросов: в зависимости от категории от нескольких сотен до нескольких миллионов
Рекомендуемый план подписки: в зависимости от категории от Free до XX-Large
ВНИМАНИЕ! Количество запросов может превышать количество товаров, потому что данные о вариациях, изображениях и др. могут парсится используя запросы к дополнительным ресурсам. Также часть данных о товаре может доставляться с помощью XHR запросов, что также увеличивает общее количество необходимых запросов.
Как пользоваться парсером объявлений авито
Для использования парсера информации с сайта Авито вы должны иметь учетную запись в нашем сервисе Diggernaut.
- Пройдите по этой ссылке для регистрации в сервисе Diggernaut
- После регистрации и подтверждения email адреса войдите в свою учетную запись
- Создайте проект с любый именем и описанием, если вы не знаете как, обратитесь к нашей документации
- Войдите во вновь созданный проект и создайте в нем диггер с любым именем, если вы не знаете как, обратитесь к нашей документации
- Скопируйте в буфер обмена приведенный ниже сценарий диггера и вставьте его в созданный вами диггер, если вы не знаете как, обратитесь к нашей документации
- ВНИМАНИЕ! Базовые прокси сервера не позволят вам собирать контактную информацию продавцов если вы используете парсер для обычной версии сайта. Для этого вам будет нужен собственный российский прокси-сервер. Тип прокси должен быть HTTP/HTTPS (SOCKS4/5 в данный момент не поддерживаются). Вы должны будете прописать ваш прокси сервер в сценарии, как указано. Если этот пункт вам непонятен и вы затрудняетесь как это сделать, свяжитесь с нами через систему поддержки или используя наш онлайн чат, мы обязательно вам поможем. Обратите внимание что символа # не должно быть в строке с вашим прокси, очень многие делают ошибку, оставляя символ решетки перед своим прокси. Другими словами в строке с вашим прокси должно быть не:
proxy: #1.1.1.1:8888
а
proxy: 1.1.1.1:8888
Естественно вы должны использовать IP, порт (и возможно логин и пароль для прокси) именно вашего прокси, а не примера данного в этой статье. Для парсера мобильной версии сайта российский прокси не требуется.
- При необходимости, в 10 строке сценария поставьте URL категории, которую вы хотите парсить, то есть замените категорию, которая стоит сейчас, нужной вам.
- Переключите режим работы диггера с Debug на Active, если вы не знаете как, обратитесь к нашей документации
- Запустите ваш диггер и дождитесь окончания его работы, если вы не знаете как, обратитесь к нашей документации
- Скачайте собранный набор данных в нужном вам формате, если вы не знаете как, обратитесь к нашей документации
В дальнейшем вы можете установить расписание для запуска вашего парсера и забирать информацию регулярно. Также вы можете скомпилировать ваш диггер для запуска его на вашем компьютере или сервер, для получения дополнительной информации, обратитесь к документации.
Сценарий парсера мобильного сайта 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"
}
}]