56 lines
2.2 KiB
JavaScript
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');
|
|
}
|
|
}
|