كيفية إنشاء مكشطة موقع مع وظائف Puppeteer و Firebase

دعنا ننشئ مكشطة موقع ويب بسيطة تقوم بتنزيل محتوى صفحة الويب واستخراج محتوى الصفحة. لهذا المثال ، سوف نستخدم New York Times
موقع الويب كمصدر للمحتوى. سيقوم المكشطة باستخراج عناوين الأخبار العشرة الأولى على الصفحة وعرضها على صفحة الويب. تتم عملية التجريف باستخدام متصفح Puppeteer بدون رأس ويتم نشر تطبيق الويب على وظائف Firebase.
1. تهيئة وظيفة Firebase
على افتراض أنك قمت بالفعل بإنشاء مشروع Firebase ، يمكنك تهيئة وظائف Firebase في بيئة محلية عن طريق تشغيل الأمر التالي:
mkdir scraper
cd scraper
npx firebase init functions
cd functions
npm install puppeteer
متابعة المطالبات لتهيئة المشروع. نقوم أيضًا بتثبيت حزمة Puppeteer من NPM لاستخدام متصفح Puppeteer Headless.
2. قم بإنشاء تطبيق Node.js
إنشاء جديد pptr.js
الملف في مجلد الوظائف الذي سيحتوي على رمز التطبيق لتجاهل محتوى الصفحة. سيقوم البرنامج النصي بتنزيل محتوى HTML للصفحة وحظر جميع الصور وورائح الأنماط ومقاطع الفيديو وخطوطها لتقليل مقدار الوقت الذي يستغرقه تنزيل الصفحة.
نحن نستخدم تعبير XPath لتحديد العناوين على الصفحة ملفوفة تحت h3
علامة. يمكنك استخدام أدوات Dev Chrome للعثور على XPath من العناوين.
const puppeteer = require('puppeteer');
const scrapeWebsite = async () => {
let stories = [];
const browser = await puppeteer.launch({
headless: true,
timeout: 20000,
ignoreHTTPSErrors: true,
slowMo: 0,
args: [
'--disable-gpu',
'--disable-dev-shm-usage',
'--disable-setuid-sandbox',
'--no-first-run',
'--no-sandbox',
'--no-zygote',
'--window-size=1280,720'
]
});
try {
const page = await browser.newPage();
await page.setViewport({ width: 1280, height: 720 });
// Block images, videos, fonts from downloading
await page.setRequestInterception(true);
page.on('request', (interceptedRequest) => {
const blockResources = ['script', 'stylesheet', 'image', 'media', 'font'];
if (blockResources.includes(interceptedRequest.resourceType())) {
interceptedRequest.abort();
} else {
interceptedRequest.continue();
}
});
// Change the user agent of the scraper
await page.setUserAgent(
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'
);
await page.goto('https://www.nytimes.com/', {
waitUntil: 'domcontentloaded'
});
const storySelector = 'section.story-wrapper h3';
// Only get the top 10 headlines
stories = await page.$$eval(storySelector, (divs) =>
divs.slice(0, 10).map((div, index) => `${index + 1}. ${div.innerText}`)
);
} catch (error) {
console.log(error);
} finally {
if (browser) {
await browser.close();
}
}
return stories;
};
module.exports = scrapeWebsite;
3. اكتب وظيفة Firebase
داخل index.js
ملف ، استيراد وظيفة مكشطة وتصديرها كدالة Firebase. نحن أيضًا نكتب وظيفة مجدولة ستعمل كل يوم ، وسوف نسمي وظيفة المكشطة.
من المهم زيادة ذاكرة الوظيفة وحدود الوقت لأن الكروم مع Puppeteer هو مورد ثقيل.
// index.js
const functions = require('firebase-functions');
const scrapeWebsite = require('./pptr');
exports.scrape = functions
.runWith({
timeoutSeconds: 120,
memory: '512MB' || '2GB'
})
.region('us-central1')
.https.onRequest(async (req, res) => {
const stories = await scrapeWebsite();
res.type('html').send(stories.join('<br>'));
});
exports.scrapingSchedule = functions.pubsub
.schedule('09:00')
.timeZone('America/New_York')
.onRun(async (context) => {
const stories = await scrapeWebsite();
console.log('The NYT headlines are scraped every day at 9 AM EST', stories);
return null;
});
4. نشر الوظيفة
إذا كنت ترغب في اختبار الوظيفة محليًا ، فيمكنك تشغيل npm run serve
القيادة وانتقل إلى نقطة نهاية الوظيفة على المضيف المحلي. عندما تكون مستعدًا لنشر الوظيفة على السحابة ، يكون الأمر npm run deploy
.
5. اختبار الوظيفة المجدولة
إذا كنت ترغب في اختبار الوظيفة المجدولة محليًا ، فيمكنك تشغيل الأمر npm run shell
لفتح قذيفة تفاعلية لاستدعاء الوظائف يدويًا مع بيانات الاختبار. هنا اكتب اسم الوظيفة scrapingSchedule()
واضغط على إدخال للحصول على إخراج الوظيفة.
اكتشاف المزيد من مرابع التكنولوجيا
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.