পুতুলের সমস্যা সমাধান করুন

হেডলেস ক্রোম উইন্ডোজে চালু হয় না

কিছু ক্রোম নীতি নির্দিষ্ট এক্সটেনশন সহ চলমান Chrome বা Chromium প্রয়োগ করতে পারে৷

Puppeteer ডিফল্টরূপে --disable-extensions পতাকা পাস করে, এবং সেইজন্য যখন এই ধরনের নীতিগুলি সক্রিয় থাকে তখন এটি চালু করতে ব্যর্থ হয়।

এটিকে ঘিরে কাজ করতে, পতাকা ছাড়াই চালানোর চেষ্টা করুন:

const browser = await puppeteer.launch({
  ignoreDefaultArgs: ['--disable-extensions'],
});

প্রসঙ্গ: সংখ্যা 3681

হেডলেস ক্রোম ইউনিক্সে চালু হয় না

নিশ্চিত করুন যে সমস্ত প্রয়োজনীয় নির্ভরতা ইনস্টল করা আছে। আপনি ldd chrome | grep not কোন নির্ভরতা অনুপস্থিত তা পরীক্ষা করতে ldd chrome | grep not

ডেবিয়ান (উবুন্টু) নির্ভরতা

ca-certificates
fonts-liberation
libappindicator3-1
libasound2
libatk-bridge2.0-0
libatk1.0-0
libc6
libcairo2
libcups2
libdbus-1-3
libexpat1
libfontconfig1
libgbm1
libgcc1
libglib2.0-0
libgtk-3-0
libnspr4
libnss3
libpango-1.0-0
libpangocairo-1.0-0
libstdc++6
libx11-6
libx11-xcb1
libxcb1
libxcomposite1
libxcursor1
libxdamage1
libxext6
libxfixes3
libxi6
libxrandr2
libxrender1
libxss1
libxtst6
lsb-release
wget
xdg-utils

CentOS নির্ভরতা

alsa-lib.x86_64
atk.x86_64
cups-libs.x86_64
gtk3.x86_64
ipa-gothic-fonts
libXcomposite.x86_64
libXcursor.x86_64
libXdamage.x86_64
libXext.x86_64
libXi.x86_64
libXrandr.x86_64
libXScrnSaver.x86_64
libXtst.x86_64
pango.x86_64
xorg-x11-fonts-100dpi
xorg-x11-fonts-75dpi
xorg-x11-fonts-cyrillic
xorg-x11-fonts-misc
xorg-x11-fonts-Type1
xorg-x11-utils

নির্ভরতা ইনস্টল করার পরে আপনাকে এই কমান্ডটি ব্যবহার করে nss লাইব্রেরি আপডেট করতে হবে

yum update nss -y

আলোচনা দেখুন:

  • #290 - ডেবিয়ান সমস্যা সমাধান
  • #391 - CentOS সমস্যা সমাধান
  • #379 - আলপাইন সমস্যা সমাধান

হেডলেস ক্রোম GPU কম্পোজিটিং অক্ষম করে

হেডলেস মোডে GPU ত্বরণ সক্ষম করতে Chrome এবং Chromium-এর প্রয়োজন --use-gl=egl

const browser = await puppeteer.launch({
  headless: true,
  args: ['--use-gl=egl'],
});

Chrome ডাউনলোড করা হয়েছে কিন্তু Node.js-এ চালু হতে ব্যর্থ হয়েছে

ক্রোমিয়াম চালু করার চেষ্টা করার সময় আপনি যদি এমন একটি ত্রুটি পান যা এইরকম দেখায়:

(node:15505) UnhandledPromiseRejectionWarning: Error: Failed to launch the browser process!
spawn /Users/.../node_modules/puppeteer/.local-chromium/mac-756035/chrome-mac/Chromium.app/Contents/MacOS/Chromium ENOENT

এর মানে হল ব্রাউজারটি ডাউনলোড করা হয়েছে কিন্তু সঠিকভাবে বের করা যায়নি। সবচেয়ে সাধারণ কারণ হল Node.js v14.0.0-এ একটি বাগ যা extract-zip ভেঙেছে, মডিউল Puppeteer ব্রাউজার ডাউনলোডগুলিকে সঠিক জায়গায় বের করতে ব্যবহার করে। Node.js v14.1.0 এ বাগটি ঠিক করা হয়েছে, তাই নিশ্চিত করুন যে আপনি সেই সংস্করণটি চালাচ্ছেন বা উচ্চতর।

একটি Chrome Linux স্যান্ডবক্স সেট আপ করুন

হোস্ট পরিবেশকে অবিশ্বস্ত ওয়েব সামগ্রী থেকে রক্ষা করার জন্য, Chrome একাধিক স্তর স্যান্ডবক্সিং ব্যবহার করে৷ এটি সঠিকভাবে কাজ করার জন্য, হোস্টটি প্রথমে কনফিগার করা উচিত। ক্রোমের ব্যবহারের জন্য যদি কোনো ভালো স্যান্ডবক্স না থাকে, তাহলে এটি No usable sandbox! .

আপনি যদি Chrome-এ খোলা বিষয়বস্তুকে পুরোপুরি বিশ্বাস করেন , তাহলে আপনি --no-sandbox আর্গুমেন্ট দিয়ে Chrome চালু করতে পারেন:

const browser = await puppeteer.launch({
  args: ['--no-sandbox', '--disable-setuid-sandbox'],
});

Chromium-এ একটি স্যান্ডবক্স কনফিগার করার 2টি উপায় রয়েছে৷

Sser নেমস্পেস ক্লোনিং শুধুমাত্র আধুনিক কার্নেল দ্বারা সমর্থিত। অনপ্রিভিলেজড ইউজার নেমস্পেসগুলি সাধারণত সক্রিয় করার জন্য ঠিক থাকে, কিন্তু কার্নেল বিশেষাধিকারে উন্নীত করার জন্য (আনস্যান্ডবক্সড) নন-রুট প্রক্রিয়াগুলির জন্য আরও কার্নেল আক্রমণ পৃষ্ঠ খুলতে পারে।

sudo sysctl -w kernel.unprivileged_userns_clone=1

[বিকল্প] সেটআপ সেটুইড স্যান্ডবক্স

সেটুইড স্যান্ডবক্সটি একটি স্বতন্ত্র এক্সিকিউটেবল হিসাবে আসে এবং এটি Chromium এর পাশে অবস্থিত যা Puppeteer ডাউনলোড করে। বিভিন্ন Chromium সংস্করণের জন্য এক্সিকিউটেবল একই স্যান্ডবক্স পুনরায় ব্যবহার করা ভাল, তাই প্রতি হোস্ট পরিবেশে নিম্নলিখিতগুলি শুধুমাত্র একবার করা যেতে পারে:

# cd to the downloaded instance
cd <project-dir-path>/node_modules/puppeteer/.local-chromium/linux-<revision>/chrome-linux/
sudo chown root:root chrome_sandbox
sudo chmod 4755 chrome_sandbox
# copy sandbox executable to a shared location
sudo cp -p chrome_sandbox /usr/local/sbin/chrome-devel-sandbox
# export CHROME_DEVEL_SANDBOX env variable
export CHROME_DEVEL_SANDBOX=/usr/local/sbin/chrome-devel-sandbox

আপনি ডিফল্টরূপে CHROME_DEVEL_SANDBOX env ভেরিয়েবল রপ্তানি করতে চাইতে পারেন৷ এই ক্ষেত্রে, ~/.bashrc বা .zshenv এ নিম্নলিখিত যোগ করুন:

export CHROME_DEVEL_SANDBOX=/usr/local/sbin/chrome-devel-sandbox

ট্র্যাভিস সিআই-তে পাপেটিয়ার চালান

আমরা v6.0.0 পর্যন্ত Travis CI-তে Puppeteer-এর জন্য আমাদের পরীক্ষা চালিয়েছিলাম, তারপরে আমরা GitHub অ্যাকশন-এ স্থানান্তরিত হয়েছি। আপনি রেফারেন্সের জন্য .travis.yml (v5.5.0) দেখতে পারেন।

এখানে কিছু সেরা অনুশীলন রয়েছে:

  • নন-হেডলেস মোডে Chromium চালানোর জন্য xvfb পরিষেবা চালু করা উচিত
  • ডিফল্টরূপে ট্র্যাভিসে জেনিয়াল লিনাক্সে চলে
  • ডিফল্টরূপে npm install চালায়
  • node_modules ডিফল্টরূপে ক্যাশে করা হয়

.travis.yml দেখতে এইরকম হতে পারে:

language: node_js
node_js: node
services: xvfb

script:
  - npm run test

CircleCI-এ Puppeteer চালান

  1. আপনার কনফিগারেশনে একটি NodeJS ইমেজ দিয়ে শুরু করুন। yaml docker: - image: circleci/node:14 # Use your desired version environment: NODE_ENV: development # Only needed if puppeteer is in `devDependencies`
  2. libXtst6 এর মতো নির্ভরতাগুলি সম্ভবত apt-get এর সাথে ইনস্টল করা দরকার, তাই threetreeslight/puppeteer orb ( নির্দেশাবলী ) ব্যবহার করুন বা আপনার নিজস্ব কনফিগারে এর উত্সের অংশগুলি পেস্ট করুন।
  3. অবশেষে, আপনি যদি জেস্টের মাধ্যমে পাপেটিয়ার ব্যবহার করেন, তাহলে আপনি চাইল্ড প্রসেস তৈরি করতে একটি ত্রুটির সম্মুখীন হতে পারেন: shell [00:00.0] jest args: --e2e --spec --max-workers=36 Error: spawn ENOMEM at ChildProcess.spawn (internal/child_process.js:394:11) এটি সম্ভবত আপনার কন্টেইনারে অনুমোদিত সংখ্যার পরিবর্তে Jest সম্পূর্ণ মেশিনে ( 36 ) প্রক্রিয়ার সংখ্যা স্বয়ংক্রিয়ভাবে সনাক্ত করার কারণে ঘটে ( 2 )। এটি ঠিক করতে, আপনার পরীক্ষা কমান্ডে jest --maxWorkers=2 সেট করুন।

ডকারে পাপেটিয়ার চালান

হেডলেস ক্রোম আপ করা এবং ডকারে চালানো কঠিন হতে পারে। Puppeteer ইনস্টল করা বান্ডিল করা Chromium-এ প্রয়োজনীয় শেয়ার্ড লাইব্রেরি নির্ভরতা অনুপস্থিত।

ঠিক করতে, আপনাকে আপনার ডকারফাইলে অনুপস্থিত নির্ভরতা এবং সর্বশেষ Chromium প্যাকেজ ইনস্টল করতে হবে:

FROM node:14-slim

# 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-stable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf libxss1 \
      --no-install-recommends \
    && rm -rf /var/lib/apt/lists/*

# If running Docker >= 1.13.0 use docker run's --init arg to reap zombie processes, otherwise
# uncomment the following lines to have `dumb-init` as PID 1
# ADD https://github.com/Yelp/dumb-init/releases/download/v1.2.2/dumb-init_1.2.2_x86_64 /usr/local/bin/dumb-init
# RUN chmod +x /usr/local/bin/dumb-init
# ENTRYPOINT ["dumb-init", "--"]

# Uncomment to skip the chromium download when installing puppeteer. If you do,
# you'll need to launch puppeteer with:
#     browser.launch({executablePath: 'google-chrome-stable'})
# ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true

# Install puppeteer so it's available in the container.
RUN npm init -y &&  \
    npm i puppeteer \
    # Add user so we don't need --no-sandbox.
    # same layer as npm install to keep re-chowned files from using up several hundred MBs more space
    && 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 /node_modules \
    && chown -R pptruser:pptruser /package.json \
    && chown -R pptruser:pptruser /package-lock.json

# Run everything after as non-privileged user.
USER pptruser

CMD ["google-chrome-stable"]

ধারক তৈরি করুন:

docker build -t puppeteer-chrome-linux .

কমান্ড হিসাবে node -e "<yourscript.js content as a string>" পাস করে কন্টেইনার চালান:

 docker run -i --init --rm --cap-add=SYS_ADMIN \
   --name puppeteer-chrome puppeteer-chrome-linux \
   node -e "`cat yourscript.js`"

https://github.com/ebidel/try-puppeteer-এ একটি সম্পূর্ণ উদাহরণ রয়েছে যা অ্যাপ ইঞ্জিন ফ্লেক্স (নোড) এ চলমান একটি ওয়েব সার্ভার থেকে এই ডকারফাইলটি কীভাবে চালাতে হয় তা দেখায়।

আল্পাইনে চালান

আল্পাইনে সমর্থিত নতুন Chromium প্যাকেজ হল 100, যা Puppeteer v13.5.0 এর সাথে মিলে যায়।

উদাহরণ ডকারফাইল:

FROM alpine

# Installs latest Chromium (100) package.
RUN apk add --no-cache \
      chromium \
      nss \
      freetype \
      harfbuzz \
      ca-certificates \
      ttf-freefont \
      nodejs \
      yarn

...

# Tell Puppeteer to skip installing Chrome. We'll be using the installed package.
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \
    PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser

# Puppeteer v13.5.0 works with Chromium 100.
RUN yarn add puppeteer@13.5.0

# Add user so we don't need --no-sandbox.
RUN addgroup -S pptruser && adduser -S -G pptruser pptruser \
    && mkdir -p /home/pptruser/Downloads /app \
    && chown -R pptruser:pptruser /home/pptruser \
    && chown -R pptruser:pptruser /app

# Run everything after as non-privileged user.
USER pptruser

...

ডকারের সাথে সেরা অনুশীলন

ডিফল্টরূপে, ডকার একটি /dev/shm শেয়ার্ড মেমরি স্পেস 64MB সহ একটি ধারক চালায়। এটি সাধারণত Chrome-এর জন্য খুব ছোট এবং বড় পৃষ্ঠাগুলি রেন্ডার করার সময় Chrome ক্র্যাশ হতে পারে৷ ঠিক করতে, /dev/shm এর আকার বাড়াতে docker run --shm-size=1gb দিয়ে কন্টেইনার চালান। Chrome 65 থেকে, এটি আর প্রয়োজন নেই। পরিবর্তে, --disable-dev-shm-usage পতাকা দিয়ে ব্রাউজারটি চালু করুন:

const browser = await puppeteer.launch({
  args: ['--disable-dev-shm-usage'],
});

এটি শেয়ার করা মেমরি ফাইলগুলিকে /dev/shm এর পরিবর্তে /tmp এ লেখে। crbug.com/736452 পর্যালোচনা করুন।

ক্রোম লঞ্চ করার সময় আপনি কি অন্যান্য অদ্ভুত ত্রুটি দেখতে পাচ্ছেন? স্থানীয়ভাবে বিকাশ করার সময় docker run --cap-add=SYS_ADMIN দিয়ে আপনার কন্টেইনার চালানোর চেষ্টা করুন। যেহেতু ডকারফাইল একটি pptr ব্যবহারকারীকে একটি অ-সুবিধাপ্রাপ্ত ব্যবহারকারী হিসাবে যুক্ত করে, এটিতে সমস্ত প্রয়োজনীয় সুবিধা নাও থাকতে পারে।

আপনি যদি অনেক জম্বি ক্রোম প্রক্রিয়ার চারপাশে আটকে থাকা অভিজ্ঞতার সম্মুখীন হন তবে dumb-init চেক করা মূল্যবান। PID=1 এর সাথে প্রক্রিয়াগুলির জন্য বিশেষ চিকিত্সা রয়েছে, যা কিছু ক্ষেত্রে (যেমন ডকারের সাথে) সঠিকভাবে ক্রোমকে শেষ করা কঠিন করে তোলে।

মেঘের মধ্যে পাপেটিয়ার চালান

গুগল অ্যাপ ইঞ্জিনে

অ্যাপ ইঞ্জিন স্ট্যান্ডার্ড এনভায়রনমেন্টের Node.js রানটাইম হেডলেস ক্রোম চালানোর জন্য প্রয়োজনীয় সমস্ত সিস্টেম প্যাকেজের সাথে আসে।

puppeteer ব্যবহার করতে, আপনার package.json এ নির্ভরতা হিসেবে মডিউলটিকে তালিকাভুক্ত করুন এবং Google App Engine-এ স্থাপন করুন। অফিসিয়াল টিউটোরিয়াল অনুসরণ করে অ্যাপ ইঞ্জিনে puppeteer ব্যবহার সম্পর্কে আরও পড়ুন।

গুগল ক্লাউড ফাংশনে

Google ক্লাউড ফাংশনের Node.js 10 রানটাইম হেডলেস ক্রোম চালানোর জন্য প্রয়োজনীয় সমস্ত সিস্টেম প্যাকেজের সাথে আসে।

puppeteer ব্যবহার করতে, আপনার package.json এ মডিউলটিকে নির্ভরতা হিসেবে তালিকাভুক্ত করুন এবং nodejs10 রানটাইম ব্যবহার করে Google ক্লাউড ফাংশনে আপনার ফাংশন স্থাপন করুন।

গুগল ক্লাউড রানে পাপেটিয়ার চালান

Google ক্লাউড রানের ডিফল্ট Node.js রানটাইম হেডলেস ক্রোম চালানোর জন্য প্রয়োজনীয় সিস্টেম প্যাকেজের সাথে আসে না। আপনার নিজস্ব Dockerfile সেট আপ করুন এবং অনুপস্থিত নির্ভরতা অন্তর্ভুক্ত করুন

হেরোকুতে

Heroku তে Puppeteer চালানোর জন্য কিছু অতিরিক্ত নির্ভরতা প্রয়োজন যা লিনাক্স বক্সে অন্তর্ভুক্ত নয় যা Heroku আপনার জন্য স্পিন করে। স্থাপনার উপর নির্ভরতা যোগ করতে, সেটিংস > বিল্ডপ্যাকগুলির অধীনে আপনার অ্যাপের জন্য বিল্ডপ্যাকগুলির তালিকায় Puppeteer Heroku বিল্ডপ্যাক যোগ করুন।

বিল্ডপ্যাকের URL হল https://github.com/jontewks/puppeteer-heroku-buildpack

পাপেটিয়ার চালু করার সময় আপনি '--no-sandbox' মোড ব্যবহার করছেন তা নিশ্চিত করুন। এটি আপনার .launch() কলে একটি যুক্তি হিসাবে পাস করে করা যেতে পারে: puppeteer.launch({ args: ['--no-sandbox'] }); .

আপনি যখন বিল্ডপ্যাক যোগ করুন ক্লিক করেন, তখন সেই URLটি ইনপুটে পেস্ট করুন এবং সংরক্ষণ করুন ক্লিক করুন। পরবর্তী স্থাপনে, আপনার অ্যাপটি পাপেটিয়ার চালানোর জন্য প্রয়োজনীয় নির্ভরতাগুলিও ইনস্টল করবে।

আপনি যদি চাইনিজ, জাপানি বা কোরিয়ান অক্ষর রেন্ডার করতে চান তবে আপনাকে https://github.com/CoffeeAndCode/puppeteer-heroku-buildpack এর মত অতিরিক্ত ফন্ট ফাইল সহ একটি বিল্ডপ্যাক ব্যবহার করতে হবে

@ timleland থেকে আরেকটি গাইড রয়েছে যাতে একটি নমুনা প্রকল্প রয়েছে।

এডব্লিউএস ল্যাম্বডায়

AWS Lambda স্থাপনার প্যাকেজের আকার ~50MB-এ সীমাবদ্ধ করে । এটি ল্যাম্বডাতে হেডলেস ক্রোম (এবং সেইজন্য পাপেটিয়ার) চালানোর জন্য চ্যালেঞ্জ উপস্থাপন করে। সম্প্রদায় কয়েকটি সংস্থান একত্র করেছে যা সমস্যাগুলির চারপাশে কাজ করে:

AWS EC2 উদাহরণ Amazon-Linux চলমান

আপনার যদি CI/CD পাইপলাইনে amazon-linux চালানোর একটি EC2 উদাহরণ থাকে এবং আপনি amazon-linux-এ Puppeteer পরীক্ষা চালাতে চান, তাহলে এই পদক্ষেপগুলি অনুসরণ করুন৷

  1. Chromium ইনস্টল করতে, আপনাকে প্রথমে amazon-linux-extras সক্ষম করতে হবে, যা EPEL (এন্টারপ্রাইজ লিনাক্সের জন্য অতিরিক্ত প্যাকেজ) এর অংশ:

    sudo amazon-linux-extras install epel -y
    
  2. পরবর্তী, Chromium ইনস্টল করুন:

    sudo yum install -y chromium
    

এখন Puppeteer আপনার পরীক্ষা চালানোর জন্য Chromium চালু করতে পারে। আপনি যদি EPEL সক্ষম না করেন এবং npm install এর অংশ হিসাবে Chromium ইনস্টল করা চালিয়ে যান, libatk-1.0.so.0 এবং আরও অনেক প্যাকেজের অনুপলব্ধতার কারণে Puppeteer Chromium চালু করতে পারবে না।

কোড ট্রান্সপিলেশন সমস্যা

আপনি যদি ব্যাবেল বা টাইপস্ক্রিপ্টের মতো একটি জাভাস্ক্রিপ্ট ট্রান্সপিলার ব্যবহার করেন, তাহলে একটি async ফাংশন সহ evaluate() কল করা কাজ নাও করতে পারে। এর কারণ হল যখন puppeteer ফাংশনকে সিরিয়ালাইজ করার জন্য Function.prototype.toString() ব্যবহার করে যখন ট্রান্সপিলাররা আউটপুট কোড এমনভাবে পরিবর্তন করতে পারে যে এটি puppeteer এর সাথে বেমানান।

এই সমস্যার কিছু সমাধান হল ট্রান্সপিলারকে কোডের সাথে বিশৃঙ্খলা না করার জন্য নির্দেশ দেওয়া, উদাহরণস্বরূপ, সর্বশেষ ecma সংস্করণ ব্যবহার করার জন্য TypeScript কনফিগার করুন ( "target": "es2018" )। আরেকটি সমাধান ফাংশনের পরিবর্তে স্ট্রিং টেমপ্লেট ব্যবহার করা হতে পারে:

await page.evaluate(`(async() => {
   console.log('1');
})()`);