по кодемзы
Когда я создал свой первый проект с открытым исходным кодом, CodeBadges, я подумал, что было бы легко получить данные профиля пользователя из всех основных веб-сайтов обучения кода.
Я был знаком с API звонками и получить запросы. Я подумал, что могу просто использовать jQuery, чтобы получить данные из различных API и использовать его.
var name = 'codemzy'; $.get('https://api.github.com/users/' + name, function(response) { var followers = response.followers;});Ну, это было легко. Но оказывается, что не каждый веб-сайт имеет публичный API, который вы можете просто захватить данные, которые вы хотите.
Но только потому, что нет публичных API, не значит, что вам нужно сдаться! Вы можете использовать Web Scraping, чтобы захватить данные, только с Немного дополнительной работы Отказ
Давайте посмотрим, как мы можем использовать веб-боковую сеть с помощью JavaScript.
Например, я возмужу информацию о своей пользовательской информации из моего публичного профиля FreeCodeCamp. Но вы можете использовать эти шаги на любой общедоступной HTML-странице.
Первый шаг в соскоре данных – это захватить полную страницу HTML с помощью jQuery .etget запрос.
var name = "codemzy";$.get('https://www.freecodecamp.com/' + name, function(response) { console.log(response);});Потрясающе, весь исходный код страницы только что зарегистрирован в консоли.
Примечание. Если вы получите ошибку на этом этапе по линиям На запрашиваемом ресурсе нет заголовком «Access-Control-Play-Origin-Origin». не раздражать. Прокрутите вниз до Не позволяйте CORS остановить тебя Раздел этого поста.
Это было просто. Используя JavaScript и jQuery, вышеуказанный код запрашивает страницу www.freecodeCamp.org, как браузер. И FreeCodeCamp отвечает страницей. Вместо браузера выполняет код для отображения страницы, мы получаем HTML-код.
И это то, что веб-соскоб – извлечение данных с веб-сайтов.
ОК, ответ не совсем так, как аккуратные, поскольку данные, которые мы возвращаемся от API.
Но … У нас есть данные, там где-то.
Как только у нас есть исходный код, в которой нам нужна информация, мы просто должны схватить данные, которые нам нужны!
Мы можем искать через ответ на поиск элементов, которые нам нужны.
Допустим, мы хотим знать, сколько вызовов завершено пользователь, из ответа профиля пользователя мы вернулись.
На момент написания на момент написания завершенные проблемы Camper завершены в таблицах в профиле пользователя. Итак, чтобы получить общее количество завершенных проблем, мы можем подсчитать количество строк.
Один из способов заключается в том, чтобы обернуть весь ответ в объекте jQuery, чтобы мы могли использовать методы jQuery, такие как .find () получить данные.
// number of challenges completedvar challenges = $(response).find('tbody tr').length;Это работает нормально – мы получаем правильный результат. Но это Не хороший способ получить результат, который мы после. Включение ответа на объект jQuery фактически загружает всю страницу, включая все внешние сценарии, шрифты и таблицы таблиц с этой страницы … Ох!
Нам нужно несколько битов данных. Нам действительно не нужна страница нагрузки, и, безусловно, не все внешние ресурсы, которые поставляются с ним.
Мы могли бы раскрыть теги скрипта, а затем запустить остальную часть ответа через jQuery. Для этого мы могли бы использовать Regex для поиска шаблонов сценариев в тексте и удалить их.
Или еще лучше, почему бы не использовать Regex, чтобы найти то, что мы ищем в первую очередь?
// number of challenges completedvar challenges = response.replace(/[\s|\S]*?<\/thead>/g).match(//g).length;
И это работает! Используя код REGEX выше, мы распределяем головные строки таблицы (которые не содержали никаких проблем), а затем сопоставьте все строки таблицы, чтобы подсчитать количество завершенных задач.
Еще проще если данные, которые вы хотите, просто в ответе в простом тексте. На момент написания письма пользовательские точки были в HTML, как ] Просто ждал, чтобы быть соскобленным. [1498
var points = response.match(/\[ ([\d]*?) \]<\/h1>/)[1];
В приведенном выше шаблоне Regex мы соответствуем элементу H1, который мы ищем, включая [] Это окружает точки, и группа любого числа внутри с ([\ D] *?). Мы получаем массив обратно, первым [0] Элемент – это весь матч и второй [1] Является ли наш групповой матч (наши пункты).
Regex полезен для сопоставления всех видов шаблонов в строках, и он отлично подходит для поиска нашего ответа, чтобы получить нужные нам данные.
Вы можете использовать тот же процесс 3 шагового процесса для анализа данных профиля из различных веб-сайтов:
- Используйте JavaScript на стороне клиента
- Используйте jQuery, чтобы соскрести данные
- Используйте Regex для фильтрации данных для соответствующей информации
Пока я не ударю проблему, CORS.
Не позволяйте CORS останавливаем вас!
Ресурс CORS или CROSS -ORSENT RESOMENT, может быть реальной проблемой с помощью клиентского веб-соска.
Для соображений безопасности браузеры ограничивают HTTP-запросы по перекрестным происхождениям, инициированные из скриптов. И поскольку мы используем JavaScript на стороне клиента на переднем конце для веб-соскабливания, могут возникнуть ошибки CORS.
Вот пример, пытаясь соскребать данные профиля из кодовых главений …
var name = "codemzy";$.get('https://www.codewars.com/users/' + name, function(response) { console.log(response);});На момент написания запуск вышеуказанного кода дает вам ошибку, связанную с CORS.
Если нет Access-Control-Allow-light Заголовок из места, где вы соскабливаете, вы можете столкнуться с проблемами.
Плохая новость в том, что вам нужно запустить эти виды запросов на стороне сервера, чтобы обойти эту проблему.
Whaaaaaaat, это предполагается, что клиентский веб-соскоб?!
Хорошие новости – это благодаря большому количеству других замечательных разработчиков, которые сталкивались с теми же проблемами, вам не нужно коснуться самого конца.
Оставаясь твердо в нашем скрипте переднего конца, мы можем использовать междоменные инструменты, такие как Любое происхождение , Какое-либо происхождение , Все происхождение , Crossorigin И, вероятно, намного больше. Я обнаружил, что вам часто нужно тестировать несколько из них, чтобы найти тот, который будет работать на сайте, вы пытаетесь соскребать.
Вернуться к нашим примеру кодовых направлений, мы можем отправить нашу запрос через междоменный инструмент для обхода проблемы CORS.
var name = "codemzy";var url = "http://anyorigin.com/go?url=" + encodeURIComponent("https://www.codewars.com/users/") + name + "&callback=?";$.get(url, function(response) { console.log(response);});И просто как магия, у нас наш ответ.
Оригинал: “https://www.freecodecamp.org/news/client-side-web-scraping-with-javascript-using-jquery-and-regex-5b57a271cb86/”