From 76718542f2398b033c70897d260d090d0592b1e3 Mon Sep 17 00:00:00 2001 From: jinhojang6 Date: Sat, 1 Jun 2024 00:04:14 +0900 Subject: [PATCH] feat: save thumbnails locally --- events.json | 4 ++-- scrape.js | 40 ++++++++++++++++++++++++-------- static/events/la2/thumbnail.png | Bin 0 -> 10173 bytes static/events/la3/thumbnail.png | Bin 0 -> 8886 bytes 4 files changed, 32 insertions(+), 12 deletions(-) create mode 100644 static/events/la2/thumbnail.png create mode 100644 static/events/la3/thumbnail.png diff --git a/events.json b/events.json index 07b588b..40a8c71 100644 --- a/events.json +++ b/events.json @@ -3,14 +3,14 @@ "title": "Logos Assembly: Belgrade", "location": "Beograd", "href": "https://lu.ma/LA2", - "thumbnail": "https://images.lumacdn.com/cdn-cgi/image/format=auto,fit=cover,dpr=2,quality=75,width=180,height=180/event-covers/e9/6d3a2f12-1c8c-42e9-8196-c1d240948030", + "thumbnail": "/events/la2/thumbnail.png", "date": "Jun 3\n4:30 PM" }, { "title": "Logos Assembly: Brno", "location": "Studentský klub U Kachničky", "href": "https://lu.ma/la3", - "thumbnail": "https://images.lumacdn.com/cdn-cgi/image/format=auto,fit=cover,dpr=2,quality=75,width=180,height=180/event-covers/16/6718e8d5-8ce9-4247-8dbb-4f6e8d60392d", + "thumbnail": "/events/la3/thumbnail.png", "date": "Jun 13\n4:00 PM" } ] \ No newline at end of file diff --git a/scrape.js b/scrape.js index 3e93a65..49c2304 100644 --- a/scrape.js +++ b/scrape.js @@ -1,10 +1,10 @@ const fetch = require('node-fetch') const fs = require('fs') +const path = require('path') const { JSDOM } = require('jsdom') // URL to scrape const url = 'https://lu.ma/logosevents' - const urlCompact = 'https://lu.ma/logosevents?compact=true' // Function to fetch and parse HTML @@ -21,11 +21,9 @@ async function scrapeData() { // Select elements with the .event-link class const eventLinks = document.querySelectorAll('a.event-link.content-link') - eventLinks.forEach(eventLink => { + for (const eventLink of eventLinks) { const title = eventLink.getAttribute('aria-label') - const href = eventLink.href - const eventContent = eventLink.nextElementSibling const location = eventContent @@ -38,15 +36,21 @@ async function scrapeData() { .querySelector('.jsx-2921306942 > .date') ?.textContent.trim() + // Download and save the image + let imagePath = '' + if (thumbnail) { + imagePath = await downloadImage(thumbnail, href) + } + // Push the extracted data to the events array events.push({ title, - date: date, + date, location, href: `https://lu.ma${href}`, - thumbnail, + thumbnail: imagePath.replace('static', ''), // Remove 'static' from the path }) - }) + } // Write data to a JSON file fs.writeFileSync('events.json', JSON.stringify(events, null, 2)) @@ -67,7 +71,6 @@ async function scrapeEventDate() { const events = [] - console.log('html', html) const eventData = document.querySelectorAll('.section') eventData?.forEach(event => { @@ -79,8 +82,6 @@ async function scrapeEventDate() { .querySelector('.time.text-tertiary-alpha') ?.textContent.trim() - console.log('time', time) - const href = event.querySelector('a')?.href if (date && href) { @@ -108,6 +109,25 @@ async function scrapeEventDate() { } } +// Function to download image +async function downloadImage(url, href) { + const response = await fetch(url) + const buffer = await response.buffer() + const cleanHref = href + .split('/') + .pop() + .toLowerCase() // Use the last part of the href, in lowercase + const folder = path.join(__dirname, 'static', 'events', cleanHref) + + // Create directory if it doesn't exist + fs.mkdirSync(folder, { recursive: true }) + + const imagePath = path.join(folder, 'thumbnail.png') + fs.writeFileSync(imagePath, buffer) + console.log(`Image downloaded: ${imagePath}`) + return path.join('/events', cleanHref, 'thumbnail.png') // Ensure the path does not include 'static' +} + async function main() { await scrapeData() await scrapeEventDate() diff --git a/static/events/la2/thumbnail.png b/static/events/la2/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..1b6a6fa295c136b008aa7a7536d8301e5561dd46 GIT binary patch literal 10173 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 literal 0 HcmV?d00001