Tuy nhiên, cách làm này không hoạt động - keo chau a

/imgposts/5760pt36.jpg

Puppeteer là một từ tiếng Anh, có nghĩa là người điều khiển rối. Nó khiến tôi liên tưởng đến bộ phim hoạt hình Naruto nổi tiếng...

Puppeteer là một dự án mã nguồn mở do Google phát triển.

Puppeteer cung cấp một thư viện dành cho Node.js để kiểm soát Chrome hoặc Chromium thông qua giao thức DevTools.

Ưu điểm:

  • Được hỗ trợ bởi Google, Puppeteer chắc chắn sẽ nhận được nhiều giao diện hơn so với Selenium.

Nhược điểm:

  • Hiện tại chỉ hỗ trợ ngôn ngữ Node.js
  • Tôi không thích Node.js lắm...
  • Tạo ảnh chụp màn hình trang web, tệp PDF
  • Thu thập nội dung trang web SPA (ứng dụng web trang đơn). Tôi nghĩ tính năng này là dành cho trình thu thập thông tin của Google để xử lý các trang web SPA sử dụng Vue.js, React.js, Angular.
  • Trích xuất nội dung từ trang web. Đối với nội dung được hiển thị động, nó rất hữu ích.
  • Tự động điền biểu mẫu, kiểm thử giao diện người dùng, mô phỏng đầu vào bàn phím, v.v.
  • Kiểm thử tự động

Tôi muốn tạo một phiên bản di động... hoặc ứng dụng WeChat Mini Program.

Phiên bản node cần phải là v7.6.0 trở lên. Để cài đặt nhiều phiên bản Node.js trên Ubuntu, bạn có thể tham khảo cách sử dụng NVM.

nvm install v9.5.0

Sau khi cài đặt Node.js, hãy thực hiện lệnh sau trong thư mục gốc của dự án:

npm i --save puppeteer
% npm i --save puppeteer
> puppeteer@1.0.0 install /home/zhongwei/work/puppeteer/node_modules/puppeteer
> node install.js
LỖI: Không tải xuống được Chromium r526987! Đặt biến môi trường "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" để bỏ qua việc tải xuống.

Từ thông báo lỗi, dường như máy đã bị chặn bởi hiệu trưởng Phương. Vì máy phát triển Ubuntu của tôi đã cài đặt sẵn phiên bản mới nhất của Chromium, tôi cảm thấy không cần thiết phải tải lại.

env PUPPETEER_SKIP_CHROMIUM_DOWNLOAD="true" npm i --save puppeteer
> puppeteer@1.0.0 install /home/zhongwei/work/puppeteer/node_modules/puppeteer
> node install.js
**THÔNG BÁO** Bỏ qua việc tải xuống Chromium. Biến môi trường "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" đã được tìm thấy.
npm WARN saveError ENOENT: không tìm thấy tập tin hoặc thư mục, mở '/home/zhongwei/work/puppeteer/package.json'
npm notice đã tạo một tệp khóa dưới dạng package-lock.json. Bạn nên commit tệp này.
npm WARN enoent ENOENT: không tìm thấy tập tin hoặc thư mục, mở '/home/zhongwei/work/puppeteer/package.json'
npm WARN puppeteer Không có mô tả
npm WARN puppeteer Không có trường repository.
npm WARN puppeteer Không có dữ liệu README
npm WARN puppeteer Không có trường license.
+ puppeteer@1.0.0
đã thêm 1 gói trong 0.924s

Tuy nhiên, cách làm này không hoạt động... Chương trình kiểm tra vẫn báo lỗi

node run.js 
(node:25615) UnhandledPromiseRejectionWarning: AssertionError [ERR_ASSERTION]: Phiên bản Chromium chưa được tải xuống. Chạy "yarn install" hoặc "npm install"

Tôi đã chỉ định đường dẫn trong mã nhưng vẫn báo lỗi

const browser = await puppeteer.launch({executablePath: '/usr/bin/chromium-browser'});

Thông báo lỗi

node run.js 
(node:29853) UnhandledPromiseRejectionWarning: Error: Hết thời gian sau 30000 ms khi cố gắng kết nối với Chrome! Phiên bản Chromium duy nhất được đảm bảo hoạt động là r526987

Rõ ràng, chỉ có phiên bản Chromium cụ thể mới có thể sử dụng Puppeteer. Theo tài liệu phát hành Puppeteer 1.0, chỉ phiên bản 65 r526987 được hỗ trợ, trong khi phiên bản cục bộ của tôi là 59... Tôi đột nhiên phát hiện ra rằng cnpm có thể đại diện tải xuống Chromium r526987... Thật đáng kinh ngạc!

cnpm install puppeteer
✔ Đã cài đặt 1 gói
✔ Liên kết 39 phiên bản mới nhất
Đang tải Chromium r526987 - 97.1 Mb [====================] 100% 0.0s 
Chromium đã được tải về /home/zhongwei/work/puppeteer/node_modules/_puppeteer@1.0.0@puppeteer/.local-chromium/linux-526987
✔ Chạy 1 kịch bản
✔ Tất cả các gói đã được cài đặt (41 gói đã được cài đặt từ npm registry, sử dụng 17s, tốc độ 27.52kB/s, json 45(68.11kB), tarball 406.4kB)
const puppeteer = require('puppeteer');
(async () => {
 const browser = await puppeteer.launch();
 const page = await browser.newPage();
 await page.goto('
 await page.screenshot({path: 'example.png'});
 await browser.close();
})();

Báo lỗi

async () => {
    ^
Cú pháp sai: Token không mong đợi

Thì ra, phiên bản Node mặc định trên Ubuntu của tôi là 6.10.0, không hỗ trợ từ khóa async, cần chuyển sang 9.5.0

nvm use 9.5.0

Sau khi thực thi, bạn sẽ thấy ảnh chụp màn hình đã được tạo!

sudo apt install -y gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 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 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget

Cài đặt font chữ Trung Quốc là đủ để giải quyết vấn đề

$ sudo apt-get install language-pack-zh-hant language-pack-zh-hans
$ sudo apt-get install fonts-droid-fallback ttf-wqy-zenhei ttf-wqy-microhei fonts-arphic-ukai fonts-arphic-uming

Thêm trước goto

 await page.setRequestInterception(true);
 page.on('request', request => {
  if (request.resourceType() === 'script')
   request.abort();
  else
   request.continue();
 });

fullPage: true Ví dụ:

await page.screenshot({path: 'rank.png', fullPage: true});