Сокращение данных-это тонкое искусство превращения веб-сайтов в красивую машинную структуру данных. 👩 🎨
Многие варианты использования для соскоба. Самым популярным из них является поиск Google. Google Bots Scrape Websites, чтобы извлечь контент, анализировать соответствующие ключевые слова, найти ссылки на странице и многое другое.
Скраинг может быть ресурсной задачей, не только сетевой, но и процессором и памятью. Это зависит от инструмента, который вы используете для выполнения задачи. Подробнее об этом позже.
В Daily.dev , мы каждый день царапаем сотни постов и веб -сайтов в блоге. У нас есть два варианта использования для соскоб:
- Мы структурируем посты в блогах в разных формах и формы в одну структуру данных, которые мы полностью индексируем в нашей базе данных.
- Мы всегда ищем новые публикации, поэтому наш бот очищает сайт публикации и ищет метаданные, такие как заголовок, логотип, RSS -ссылка и многое другое.
Мы очищаем данные как автономное задание, а также задание в реальном времени по запросу пользователя. В этом посте я хотел бы поделиться своими идеями для создания эффективного трубопровода для соскоба.
Есть много инструментов и библиотек для очистки данных, Cheerio и Кукольник самые известные. Они противоположны друг от друга так, как они подходят к проблеме. Cheerio — это быстрая и худой реализация Core JQuery, разработанной специально для сервера. Это ни в коем случае не веб -браузер. С другой стороны, кукольник-это API высокого уровня для контроля Chrome. Кукольник управляет безголовым браузером (без пользовательского интерфейса). Будучи веб -браузером, особенно Chrome, последнее, что мы можем сказать о кукловом, это то, что он худой или быстр. Это потребляет много памяти, и для загрузки требуется время по сравнению с Cheerio. Кроме того, кукольник устанавливает Chrome и другие собственные зависимости, так что процесс установки может быть немного длинным. Тем не менее, кукольник-мой инструмент для соскоба данных просто потому, что Это веб -браузер! Разработчики создают веб -сайты для людей и браузеров, а не машины. Когда мы решили создать спа -салон (приложение для одной страницы), это намного труднее для таких библиотек, как Cheerio, чтобы соскрести его. Cheerio не запускает JavaScript, и иногда это требуется для загрузки данных, которые вы хотите очистить. Используя кукловолок, который является Chrome, вы можете выполнить JavaScript и необходимые сетевые запросы для загрузки всех данных, необходимых для соскоба. Ваша машина использует тот же браузер, который вы используете для извлечения значимых данных. Конечно, есть некоторые преимущества, которые Cheerio может быть лучшей альтернативой из-за его супер-фанатной и худой природы, но они редки, с моей точки зрения.
Давайте возьмем пример варианта использования для соскоба данных. Мы хотели бы создать веб -сервер, который, по запросу пользователя, царапает данное сообщение в блоге и возвращает «время чтения» поста. Интуитивно для каждого запроса мы создадили новый экземпляр кукловода, перейти к этой странице, соскребают контент и рассчитываем время чтения. Но и это большое Но каждый экземпляр кукловода требует времени для загрузки, а также они, как правило, являются очень процессором и памятью интенсивной.
Представляем шаблон бассейна! 🎉 Паттерн пула использует набор инициализированных объектов (в нашем случае экземпляры кукловода) — aka «The Pool» и также отвечает за их уничтожение. Вы, разработчик, можете запросить экземпляр из бассейна, и если есть доступный экземпляр, вы получите его сразу же, а если нет, бассейн создаст его для вас. Конфигурация может быть гораздо сложнее и может включать в себя минимальное и максимальное количество экземпляров, простоя и т. Д. Эта концепция не нова и широко используется для баз данных. Обычно мы управляем глобальным пулом соединений для нашего приложения. Мы не создаем новое соединение по каждому запросу. Мы просто повторно используем ту же концепцию, но для кукловода.
К счастью для нас, уже есть пакет Nodejs универсальный POOL Это реализует шаблон бассейна. Давайте сразу же использовать его, чтобы повысить нашу производительность и уменьшить накладные расходы:
import * as puppeteer from 'puppeteer'; import * as genericPool from 'generic-pool'; const pptrPool = genericPool.createPool( { create: () => puppeteer.launch({}), destroy: (client) => client.close(), }, { min: 1, max: 5 }, ); // Get an available browser instance const browser = await pptrPool.acquire(); // Scrape here your data! // Remember to release the instance back to the pool await pptrPool.release(browser);
Довольно просто и легко внедрить наш пользовательский пул. Вам нужно определить Создать
и уничтожить
функционирует, и все. Мы можем приобретать
Чтобы получить экземпляр и Выпуск
Чтобы вернуть его в бассейн. Обязательно настройте конфигурацию пула в соответствии с вашими потребностями, это просто образец.
Требуется время, опыт и много пота, чтобы понять концепцию двух контекстов в одном приложении. При очистке данных с кукловодом у вас есть контекст приложения, со всеми переменными и функциями, которые вы написали, и контекст страницы. Теперь контекст страницы ничего не знает о контексте приложения. Контекст страницы заботится только о JavaScript и функциях веб -сайта. Если вы хотите поделиться переменными между контекстами, вам необходимо явно перевести их. Не одурачивайте внешний вид функции стрелы! Можно подумать, что он разделяет закрытие, но это не так!
Вот пример:
import * as puppeteer from 'puppeteer'; const browser = await puppeteer.launch({}); const page = await browser.newPage(); const res = await page.goto('https://daily.dev/blog'); const myvar = 'hello'; await page.$eval('selector', (el) => console.log(myvar) // undefined ); await page.$eval('selector', (el, myvar) => console.log(myvar), // hello myvar, );
Мы используем $ eval
Функция для запуска пользовательской функции в контексте страницы. Внутри этой функции мы должны иметь логику скрепования. Теперь мы просто пытаемся зарегистрировать переменную из контекста приложения. В первом примере myvar
не определен, потому что контекст страницы не имеет доступа к контексту страницы. Во втором примере мы предоставляем myvar
В качестве параметра функции, и мы можем использовать его, как угодно.
К настоящему времени контейнеры являются моим универсальным магазином для создания артефактов приложений. Docker Облегчает их создание. Вы можете определить точные зависимости, необходимые для вашего приложения, не сталкиваясь с требованиями существующих или других приложений. Приложение получает отдельную и отдельную среду выполнения, контейнеры поддерживают каждый язык и структуру, о которых вы можете подумать, и вы можете развернуть эти контейнеры практически для любого услуги.
При работе с кукловодом Docker дает вам дополнительный уровень безопасности. Кукольник может потенциально выполнить вредоносный код JavaScript при соскобке неизвестных веб -сайтов. Используя кукольник внутри Docker в наихудшем сценарии, атакующий будет иметь доступ только к вашему контейнеру, а не к самому серверу. Таким образом, ограничение возможного ущерба, вредоносный код может заразить вашу систему.
Создание контейнера, который поддерживает кукловолок, немного сложно, поэтому мы пройдемся по нему шаг за шагом.
FROM node:14.3-slim RUN mkdir -p /opt/app WORKDIR /opt/app # Install latest chrome dev package and fonts to support major charsets (Chinese, Japanese, Arabic, Hebrew, Thai, and a few others) # Note: this installs the necessary libs to make the bundled version of Chromium that Puppeteer # installs, work. RUN apt-get update \ && apt-get install -y wget gnupg \ && wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \ && sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \ && apt-get update \ && apt-get install -y google-chrome-unstable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf python make gcc g++ \ --no-install-recommends \ && rm -rf /var/lib/apt/lists/* # Add Tini ENV TINI_VERSION v0.19.0 ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini RUN chmod +x /tini ENTRYPOINT ["/tini", "--"] # Add user so we don't need --no-sandbox. RUN groupadd -r pptruser && useradd -r -g pptruser -G audio,video pptruser \ && mkdir -p /home/pptruser/Downloads \ && chown -R pptruser:pptruser /home/pptruser \ && chown -R pptruser:pptruser /opt/app # Run everything after as non-privileged user. USER pptruser COPY package.json package-lock.json ./ RUN npm i --only=prod COPY build ./ CMD ["npm", "run", "start"]
Во -первых, мы установили наше базовое изображение контейнера в нашу любимую версию узла. Обязательно используйте тонкую версию. Я не смог использовать альпийскую версию. 😢 Мы создаем выделенную папку в наше приложение, чтобы отделить ее от оставшихся файлов контейнера. Теперь мы должны установить Chrome и его требования, которые будут использоваться кукловодом. После установки Chrome мы устанавливаем Тини позаботиться о любом процессе зомби, который может быть создан Chrome. Тини очень полезен для уменьшения утечек памяти и накладных расходов. По соображениям безопасности мы создаем специализированного пользователя для запуска Chrome и Puppeteer, чтобы не позволить злоумышленникам получить разрешения суперпользователя. Наконец, мы устанавливаем только производственные зависимости, копируем код приложения и запускаем его.
Вот и все! Это мои четыре совета для эффективного, обеспеченного и эффективного соскоба данных при производстве. Я также хотел бы услышать ваши советы. 🙏
Повседневная Предоставляет лучшие новости программирования каждую новую вкладку. Мы будем ранжировать сотни квалифицированных источников для вас, чтобы вы могли взломать будущее.
Оригинал: «https://dev.to/dailydotdev/pro-tips-for-data-scraping-in-production-4d44»