Руководство по заполнению ямы кукловода
предисловие
Оригинальный адрес:Zhangzippo.GitHub.IO/posts/2019/…
Я считаю, что каждый столкнется с различными проблемами при использовании puppeteer. Например, когда он хорошо работает на Mac, обнаруживается, что он сталкивается с различными проблемами на Centos / Docker. Вот ямы, с которыми я столкнулся. Давайте поговорим об этом.
Установить
Во-первых, это проблема установки, это не проблема на Mac, вот проблема на Centos, puppeteer содержит два пакета puppeteer VS puppeteer-core, в чем разница? Проще говоря, puppeteer = api+chromeium (последний), puppeteer-core = только Api, чиновник сказал:
puppeteer-core
а такжеpuppeteer
различные места:
puppeteer-core
Chromium не загружается автоматически при установке.puppeteer-core
игнорировать всеPUPPETEER_*
переменная окружения.
Когда вы устанавливаете chromeium самостоятельно, вам нужно указать путь запуска chromeium при запуске (puppeteer.launch()).Конечно, в вашей собственной установке есть проблема с обновлением, которая может не совпадать с API puppeteer из-за несвоевременное обновление, поэтому мы рекомендуем установить puppeteer напрямую. Затем, когда вы установите его на Centos, он, несомненно, сообщит об ошибке. Из-за отсутствия зависимостей запуска Chrome я столкнулся с ямами как на Centos6, так и на 7. Ниже приведены официально перечисленные зависимости для Centos:
pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf2.x86_64 alsa-lib.x86_64 atk.x86_64 gtk3.x86_64 ipa-gothic-fonts xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc
Все, что нужно, это установить yum. Конечно, это может быть и не так.Когда вы запускаете chromeium (рекомендуется протестировать на сервере, перейдите в каталог node_modules/puppeteer/.local-chromium/linux-496140/chrome-linux/chrome для выполнения ./chrome для тестирования , Успешная операция означает, что вызов API через puppeteer также будет успешным) Вы можете столкнуться, например:
ошибка при загрузке общих библиотек: libpangocairo-1.0.so.0: невозможно открыть файл общего объекта: нет такого файла или каталога Такая ошибка указывает на то, что у вас отсутствует файл so.Вы можете выполнить эту команду в каталоге исполняемого файла, чтобы увидеть, какие зависимости отсутствуют: ldd chrome | grep не После выполнения команды она отобразит зависимости, которых вам сейчас не хватает.Если вы не знаете, в каком пакете находится соответствующий .so, выполните эту команду: yum предоставляет | grep xx.so.0
Найдите соответствующий пакет и установите его с помощью yum install. Обратите внимание, что это 32- или 64-разрядная версия. Не устанавливайте его неправильно. Когда результат ldd chrome | grep not пуст, это означает, что все зависимости были установлены.Когда я тестировал на centos6.5, я установил все зависимости и все равно выдавало, что не хватает определенной зависимости.После проверки я обнаружил, что он существует в пакете firefox.сегмент fault.com/ah/119000001…Мы с автором этой статьи столкнулись с такой же проблемой и решили ее.Однако я так и не решил ее проделав то же самое.Все равно не могу запустить хром,а хром зависит от пакетов других браузеров.В версии 6.5 есть ограниченная поддержка хрома, поэтому я сменил его на centos7.6 и продолжил, установка прошла гладко.. Никаких ям. Другие могут столкнуться с невозможностью загрузки хрома, это указано в .npmrc для загрузки исходного кода.
PUPPETEER_DOWNLOAD_HOST = npm.taobao.org/mirrors
запускать
Думаете после установки ям не будет? нет нет нет. Запуск также может привести вас один раз, Если вы начнете напрямую, будет сообщено об этой ошибке:
No usable sandbox! Update your kernel or see chromium.Google source.com/chromium/… хотя… for more information on developing with the SUID sandbox. If you want to livedangerously and need an immediate workaround, you can try using --no-sandbox.
Что ты имеешь в виду? То есть обычно вы должны запускать хром в песочнице, но вы его не настроили. Соответствующий URL-адрес и документация puppeteer описывают, как создать песочницу, следующим образом:GitHub.com/Google CHROM…
Однако я не смог этого сделать и все же сообщил об ошибке, поэтому я использовал PlanB, чтобы добавить --no-sandbox.Официальный пример:
const browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox']});
Мы можем выполнить ./chrome --no-sandbox --disable-setuid-sandbox при тестировании Затем, если вы выполните ./chrome напрямую (пример в js по умолчанию имеет значение headless=true ), вы снова увидите эту ошибку:
Gtk-WARNING **: 23:01:03.809: невозможно открыть дисплей Я не очень знаком с линуксом, но это значит, что вы не можете открыть графический интерфейс, не заходите на Байду, если вы тоже новичок в линуксе. Мы можем просто добавить --headless сзади, и это не проблема, чтобы начать прямо сейчас.
кукловод
Проблем с запуском нет, что еще делать? Я столкнулся с некоторыми проблемами при использовании здесь.Позвольте мне поделиться с вами.Если вы также столкнулись с этим, обратите внимание на устранение неполадок.
- Возникли проблемы с получением ошибок страницы Конечно, есть много возможностей, таких как отсутствие блокировки файлов cookie, с чем легко справиться, и другая ситуация заключается в том, что на некоторых веб-сайтах есть механизм предотвращения сканирования, чтобы определить, что знак UA не на стороне браузера или имеет безголовый знак (будет включен UA по умолчанию в безголовом режиме Chrome), поэтому в итоге вы получите не ту страницу, которую хотите, и вы можете не получить нужную страницу в различных ситуациях перенаправления. В настоящее время лучше всего вызовите метод page.text после метода page = await page.goto();(), чтобы проверить, соответствует ли страница ожидаемому
- ситуация тайм-аута С этим, скорее всего, столкнется каждый.Тайм-аут по умолчанию для метода goto для загрузки страницы составляет 30 секунд.Вы можете изменить его, или вы можете напрямую написать 0 для ожидания. Я столкнулся с некоторыми ситуациями, из-за которых страница загружалась очень медленно, особенно когда вы устанавливаете waitUntil = networkidle0, как решить эту проблему? Используйте метод page.on('requestfailed'), чтобы увидеть, какие ресурсы блокируют переход на страницу, метод page.on('request') перехватывает соответствующий запрос abort(), и я сталкиваюсь с автономными машинами в приложении, которые не могут быть accessed За ситуацией с доменным именем в интрасети долгое время было трудно следить.
конец
Может сзади будет много ям, гляньте...