0 Пользователей и 1 Гость просматривают эту тему.
  • 20 Ответов
  • 2277 Просмотров
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
Пытаюсь при помощи js вытащить список городов с авито (он там наиболее полный). Накидал небольшой скрипт, который должен кликами перебрать все области и считать города внутри. Однако, сразу после первого клика возникает ошибка в консоли браузера:

Запрос из постороннего источника заблокирован: Политика одного источника запрещает чтение удаленного ресурса на https://sntr.avito.ru/api/... (Причина: отсутствует заголовок CORS «Access-Control-Allow-Origin»).

Города успешно погружаются, но скрипт не может считать данные с AJAX блоков. Можно ли каким-нибудь образом все же проигнорировать CORS и считать интересующие меня блоки? Может существует специальный браузер для таких целей или плагин?

Что странно, когда я считываю города напрямую все норм, а если в цикле, то CORS режет всю малину. Как быть?
« Последнее редактирование: 11.01.2019, 22:27:54 от dm-krv »
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
не проверял, но такое вот есть
Код
chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
не проверял, но такое вот есть
Код
chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security

Увы, пишет, что этот флаг более не поддерживается. Корс по прежнему вылезает.


а вот для ФФ https://addons.mozilla.org/en-US/firefox/addon/cors-everywhere/

Сейчас проверим...
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
dmitry_stas

Кажись работает) Предупреждений о CORS теперь нет, правда там ошибки у меня в скрипте, но это я поправлю, главное, что парсится без проблем.
*

beliyadm

  • Легенда
  • 9758
  • 1664 / 66
  • Севастополь, Россия
На JS вроде бы кроссбраузерные запросы напрочь запрещены браузерами (если только два домена не договорятся между собой), очень странно как это у вас на JS получился парсер, покажите код если не секрет (если в JS запускается php cURL там или что - тогда не надо, это неспортивно :))
Все истины, которые я хочу вам изложить, — бесстыдная ложь. Сделать всё хорошо
TLG: @Beliyadm
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
На JS вроде бы кроссбраузерные запросы напрочь запрещены браузерами (если только два домена не договорятся между собой), очень странно как это у вас на JS получился парсер, покажите код если не секрет (если в JS запускается php cURL там или что - тогда не надо, это неспортивно :))

Блин( Вот сейчас проверяю и перепроверяю, но правы вы - не работает. Просто перестали предупреждения CORS выводится, а блоки загруженые в аяксе скрипт просто не видит, словно их нет. Код, пожалуйста:
Код
var goroda = '';

setTimeout('document.querySelectorAll("._1ttXp._91ScY")[0].click()', 3000);

setTimeout('document.querySelectorAll("._2icBu._3OKc6")[0].click()', 3000);

function sbor() {

setTimeout(function () {

var oblasti = document.querySelectorAll("._2wkKl");

for(var i = 1; i < oblasti.length; i++) {

oblasti[i].click();

var idname = oblasti[i].innerText;

var id = i;

setTimeout(function(){ parser(idname, id); }, 5000);


}

}, 5000);

}

function parser(oblast, nomer) {



var gorod = document.querySelectorAll("._2wkKl");

for(var i = 1; i < gorod.length; i++) {

goroda = goroda+gorod[i].innerText+'→'+nomer+'←'+oblast+'↑';

}

document.querySelectorAll('.tWeHs')[0].click();

}

Рассчитано на работу на m.avito.ru - пытаюсь собрать в переменную города с авито в нужном мне формате.

Может все же есть какие-то способы считать аяксные блоки? Не может такого быть, чтобы защиту на стороне браузера нельзя было отключить.
*

beliyadm

  • Легенда
  • 9758
  • 1664 / 66
  • Севастополь, Россия
Не может такого быть, чтобы защиту на стороне браузера нельзя было отключить
Может, кроссдомейные JS запросы на уровне браузера невозможны в целях безопасности.
Читать тут

парсить на основе JS не получится от слова никак

Только если два домена знают друг друга и договорятся
Все истины, которые я хочу вам изложить, — бесстыдная ложь. Сделать всё хорошо
TLG: @Beliyadm
*

beliyadm

  • Легенда
  • 9758
  • 1664 / 66
  • Севастополь, Россия
Может все же есть какие-то способы считать аяксные блоки? Не может такого быть, чтобы защиту на стороне браузера нельзя было отключить.
Можно, гуглите в сторону cURL или библиотеки типа simple_html_dom.php, там можно что-то выцепить, но на чистом JS это невозможно
Все истины, которые я хочу вам изложить, — бесстыдная ложь. Сделать всё хорошо
TLG: @Beliyadm
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
Можно, гуглите в сторону cURL или библиотеки типа simple_html_dom.php, там можно что-то выцепить, но на чистом JS это невозможно

Там слишком сложный для меня скрипт будет, если на php пытаться выцепить, с куками, сессиям, усер-агентами.

По правде говоря, проблема ведь в чем - когда вручную забиваю в консоль document.querySelectorAll() все прекрасно парсится, но если считывающая функция применяется скриптом, то уже не работает. Не может ли js сам себя перезабить в веб-консоль как-нибудь? Я бы тогда как-нибудь раздели скрипт на мелкие части и это решило бы проблему.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
можно с другой стороны подойти - поставить что то типа https://chrome.google.com/webstore/detail/custom-javascript-for-web/poakhlngfciodnhlhhgnaaelnpjljija и запускать js уже на том сайте, который парсить. а данные считываемые отправлять себе уже в php скрипт на своем сервере
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
можно с другой стороны подойти - поставить что то типа https://chrome.google.com/webstore/detail/custom-javascript-for-web/poakhlngfciodnhlhhgnaaelnpjljija и запускать js уже на том сайте, который парсить. а данные считываемые отправлять себе уже в php скрипт на своем сервере

Неа, ни черта не работает. Например, если попытаться кликнуть что-то внутри блока аякс:
Код
Uncaught TypeError: Cannot read property 'click' of undefined at <anonymous>
Как я понимаю, клик не может быть произведен по анонимному элементу. Радует, что хоть сам элемент ищется, но этого недостаточно.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
все работает, скрипт неправильный
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
все работает, скрипт неправильный

Да, я уже понял) Я дурак пытался стартовать скрипт из консоли, а надо было команду запуска там же внутри плагина писать. В общем, все работает) Осталось только скрипт отладить, он у меня действительно косячный, но это уже просто дело времени. Главное, что решение найдено и данные теперь действительно можно особо не напрягаясь спарсить и вывести.
Огромное спасибо  ^-^

« Последнее редактирование: 11.01.2019, 22:26:54 от dm-krv »
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
Допилил парсер и таки вытянул города с авито) Вышел список аж из 3647 позиций, что довольно много. Прикрепляю файл, вдруг кому пригодится. Лично сам собираюсь использовать список этот у себя на сайте, для того, что бы дать посетителю возможность точно выбрать свой город.

Код парсера ниже, использовать надо в Chrome, с плагином (спасибо dmitry_stas за наводку) и исключительно на мобильной версии сайта m.avito.ru
Код
var goroda = ''; // создаем переменную для записи городов и областей

setTimeout('document.querySelectorAll("._1ttXp._91ScY")[0].click()', 4000); // открываем настройки

setTimeout('document.querySelectorAll("._2icBu._3OKc6")[0].click()', 7000); // открываем выбор города

function* sbor() {

var oblastii = document.querySelectorAll("._2wkKl"); // парсим количество областей

for(var i = 1; i < oblastii.length; ++i) { // запускаем цикл равный кол-ву областей

var oblasti = document.querySelectorAll("._2wkKl"); // парсим области

var idname = oblasti[i].innerText; // записываем название области

var id = i; // записываем номер области

oblasti[i].click();  // кликаем области по очереди в цикле

setTimeout(function(){ parser(idname, id); }, 2000);  // запускаем функцию для парсинга городов внутри нажатой области

yield;  // ставим цикл на задержку

}

}

var iterator = sbor();  // генератор

setTimeout(function(){ iterator.next(); }, 10000);  // запускаем генератор

function parser(oblast, nomer) {


var gorod = document.querySelectorAll("._2wkKl"); // Парсим города

for(var grd = 1; grd < gorod.length; ++grd) {

goroda = goroda+gorod[grd].innerText+' | '+nomer+'. '+oblast+'\r\n'; // Пишем результаты в переменную

}

setTimeout('document.querySelectorAll(".tWeHs")[0].click();', 1000); // Возвращаемся к списку областей

setTimeout(function(){ iterator.next(); }, 2000); // Возозобновляем работу парсера областей после задержки

}

После завершения работы результаты можно сохранить выполнив в консоли:
Код
var textToSave = goroda;

var hiddenElement = document.createElement('a');

hiddenElement.href = 'data:attachment/text,' + encodeURI(textToSave);
hiddenElement.target = '_blank';
hiddenElement.download = 'goroda.txt';
hiddenElement.click();
« Последнее редактирование: 17.01.2019, 16:03:05 от dm-krv »
*

beliyadm

  • Легенда
  • 9758
  • 1664 / 66
  • Севастополь, Россия
Пытаюсь при помощи js вытащить список городов с авито (он там наиболее полный).

dm-krv - я вот только сейчас допер вашу изначальную задачу - вам нужна база городов, так не проще использовать готовые базы по типу ОКАТО?

Есть же готовые базы в разных форматах на все города РФ с указанием родителей, уровня вложенности и тд
Все истины, которые я хочу вам изложить, — бесстыдная ложь. Сделать всё хорошо
TLG: @Beliyadm
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
dm-krv - я вот только сейчас допер вашу изначальную задачу - вам нужна база городов, так не проще использовать готовые базы по типу ОКАТО?

Есть же готовые базы в разных форматах на все города РФ с указанием родителей, уровня вложенности и тд

А я их и использовал, но больше полутора тысяч наскрести не удавалось ни с одно источника. Даже на викпедии официальный список городов по результатам переписи и то не полный, а вот на авито реально все города, даже самые незначительные. Пожалуй, еще более подробную базу можно получить только через API Яндекса, но это для меня слишком сложно.
*

beliyadm

  • Легенда
  • 9758
  • 1664 / 66
  • Севастополь, Россия
https://classifikators.ru/okato вот вторая ссылка в Google 27 тыщ записей
Давно не интересовался, но помню что находил базу в 30 с лишним килозаписей с четкой градацией наследования от родителей и полными кодами окато

Еще смотреть тут http://www.gks.ru/opendata/dataset/7708234640-okato, лень качать, но там раньше была подробная структура и актуальная
Все истины, которые я хочу вам изложить, — бесстыдная ложь. Сделать всё хорошо
TLG: @Beliyadm
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
https://classifikators.ru/okato вот вторая ссылка в Google 27 тыщ записей
Давно не интересовался, но помню что находил базу в 30 с лишним килозаписей с четкой градацией наследования от родителей и полными кодами окато

Еще смотреть тут http://www.gks.ru/opendata/dataset/7708234640-okato, лень качать, но там раньше была подробная структура и актуальная

Мда. Похоже я изобретатель велосипедов) В любом случае, потраченого времени не желаю. Один черт, в этих ОКАТО я ни в зуб ногой, запутанно все, а на авито все четко поделено по областям.
*

beliyadm

  • Легенда
  • 9758
  • 1664 / 66
  • Севастополь, Россия
Один черт, в этих ОКАТО я ни в зуб ногой, запутанно все
Там все четко, код региона, под подгериона (области), код города деревни, все это перевязано в цифрах, ничего сложного, вот в вики все есть ОКАТО

А потраченное время - оно всегда полезно, даже если велосипед.
Все истины, которые я хочу вам изложить, — бесстыдная ложь. Сделать всё хорошо
TLG: @Beliyadm
*

fsv

  • Живу я здесь
  • 2765
  • 402 / 2
дать посетителю возможность точно выбрать свой город.
подсказки dadata

действительно, сказали бы сразу, что надо...
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

[РЕШЕНО] Добавить класс при условии JS?

Автор warlocksp

Ответов: 21
Просмотров: 1745
Последний ответ 26.02.2020, 11:07:53
от robert
Программное создание материалов в Joomla 3.8+ [ РЕШЕНО ]

Автор dm-krv

Ответов: 36
Просмотров: 2550
Последний ответ 12.12.2019, 21:06:08
от MDenis
[РЕШЕНО] Защита сайтов друг от друга при помощи open_basedir

Автор dm-krv

Ответов: 14
Просмотров: 1988
Последний ответ 22.04.2019, 17:46:48
от dm-krv
Бесплатный звонок с сайта, через интернет [РЕШЕНО]

Автор dm-krv

Ответов: 8
Просмотров: 547
Последний ответ 03.04.2019, 09:43:32
от dm-krv
360 Zoomer - jQuery вращалка с возможностью увеличения изображения

Автор effrit

Ответов: 2
Просмотров: 485
Последний ответ 01.04.2019, 22:21:22
от effrit