hometify/bak/pisoscomScraper.js

56 lines
2.2 KiB
JavaScript

import puppeteer from 'puppeteer';
import Listing from '../../server/db/models/Listing';
//import { notifyNewListing } from './telegramBot';
export default async function scrapePisoscom() {
console.log('Starting Pisos.com scraping process');
const browser = await puppeteer.launch({ headless: true, args: ['--no-sandbox'] });
const page = await browser.newPage();
try {
await page.goto('https://www.pisos.com/venta/pisos-area_de_granada_granada_capital/', {
waitUntil: 'networkidle2',
});
console.log('Navigated to Pisos.com');
const listings = await page.evaluate(() => {
const results = [];
document.querySelectorAll('.ad-preview').forEach((element) => {
const title = element.querySelector('.ad-preview__title').innerText.trim();
const priceText = element.querySelector('.ad-preview__price').innerText.trim();
const price = parseFloat(priceText.replace(/[^\d]/g, ''));
const location = element.querySelector('.ad-preview__subtitle').innerText.trim();
const description = element.querySelector('.ad-preview__description').innerText.trim();
const phone = element.querySelector('.contact-box__phone').getAttribute('data-number');
const url = element.getAttribute('data-lnk-href');
if (title && price && location && description && url) {
results.push({ title, price, location, description, url, phone });
}
});
return results;
});
console.log(`Found ${listings.length} listings. Listing data: ${JSON.stringify(listings)}`);
for (const listingData of listings) {
try {
const listing = new Listing(listingData);
//await listing.save();
console.log(`Saved listing to database: ${listing.title}`);
//await notifyNewListing(listing);
console.log(`Sent notification for listing: ${listing.title}`);
} catch (innerError) {
console.error(`Error processing listing: ${innerError.message}`);
}
}
} catch (error) {
console.error('Error scraping Pisos.com:', error.message);
throw new Error('Failed to scrape Pisos.com');
} finally {
await browser.close();
console.log('Finished Pisos.com scraping process');
}
}