Adding images to scraping data (#157)

* Fredy now supports pulling the main Image from the listing and send it together with the usual information
This commit is contained in:
Christian Kellner
2025-08-30 21:21:34 +02:00
committed by GitHub
parent da743c8279
commit f0b146fd7f
26 changed files with 1141 additions and 1135 deletions

View File

@@ -2,10 +2,12 @@ import utils, { buildHash } from '../utils.js';
let appliedBlackList = [];
function normalize(o) {
const link = `https://www.1a-immobilienmarkt.de/expose/${o.id}.html`;
const baseUrl = 'https://www.1a-immobilienmarkt.de';
const link = `${baseUrl}/expose/${o.id}.html`;
const price = normalizePrice(o.price);
const id = buildHash(o.id, price);
return Object.assign(o, { id, price, link });
const image = baseUrl + o.image;
return Object.assign(o, { id, price, link, image });
}
/**
@@ -41,6 +43,7 @@ const config = {
price: '.inner_object_data .single_data_price | removeNewline | trim',
size: '.tabelle .tabelle_inhalt_infos .single_data_box | removeNewline | trim',
title: '.inner_object_data .tabelle_inhalt_titel_black | removeNewline | trim',
image: '.inner_object_pic img@src',
},
normalize: normalize,
filter: applyBlacklist,

View File

@@ -1,26 +1,34 @@
import utils, { buildHash } from '../utils.js';
let appliedBlackList = [];
function shortenLink(link) {
return link.substring(0, link.indexOf('?'));
}
function parseId(shortenedLink) {
return shortenedLink.substring(shortenedLink.lastIndexOf('/') + 1);
}
function normalize(o) {
const baseUrl = 'https://www.immobilien.de';
const size = o.size || 'N/A m²';
const price = o.price || 'N/A €';
const title = o.title || 'No title available';
const address = o.address || 'No address available';
const shortLink = shortenLink(o.link);
const link = `https://www.immobilien.de/${shortLink}`;
const link = `${baseUrl}/${shortLink}`;
const image = baseUrl + o.image;
const id = buildHash(parseId(shortLink), o.price);
return Object.assign(o, { id, price, size, title, address, link });
return Object.assign(o, { id, price, size, title, address, link, image });
}
function applyBlacklist(o) {
const titleNotBlacklisted = !utils.isOneOf(o.title, appliedBlackList);
const descNotBlacklisted = !utils.isOneOf(o.description, appliedBlackList);
return titleNotBlacklisted && descNotBlacklisted;
}
const config = {
url: null,
crawlContainer: '._ref',
@@ -34,6 +42,7 @@ const config = {
description: '.list_entry .description | trim',
link: '@href',
address: '.list_entry .place',
image: '.list_entry img@src',
},
normalize: normalize,
filter: applyBlacklist,

View File

@@ -33,6 +33,7 @@ const config = {
price: 'div[data-testid="cardmfe-price-testid"] | trim',
size: 'div[data-testid="cardmfe-keyfacts-testid"] | trim',
address: 'div[data-testid="cardmfe-description-box-address"] | trim',
image: 'div[data-testid="cardmfe-picture-box-test-id"] img@src',
},
normalize: normalize,
filter: applyBlacklist,

View File

@@ -62,6 +62,7 @@ async function getListings(url) {
.map((expose) => {
const item = expose.item;
const [price, size] = item.attributes;
const { preview: image } = item.titlePicture;
return {
id: item.id,
price: price?.value,
@@ -69,6 +70,7 @@ async function getListings(url) {
title: item.title,
link: `${metaInformation.baseUrl}expose/${item.id}`,
address: item.address?.line,
image,
};
});
}

View File

@@ -31,6 +31,7 @@ const config = {
title: '.js-item-title-link@title | trim',
link: '.ci-search-result__link@href',
description: '.js-show-more-item-sm | removeNewline | trim',
image: 'img@src',
},
normalize: normalize,
filter: applyBlacklist,

View File

@@ -26,6 +26,7 @@ const config = {
title: 'div[data-testid="cardmfe-description-box-text-test-id"] > div:nth-of-type(2)',
link: 'a@href',
address: 'div[data-testid="cardmfe-description-box-address"] | removeNewline | trim',
image: 'div[data-testid="cardMfe-card-pictureBox-opacity"] img@src',
},
normalize: normalize,
filter: applyBlacklist,

View File

@@ -32,6 +32,7 @@ const config = {
link: '.aditem-main .text-module-begin a@href | removeNewline | trim',
description: '.aditem-main .aditem-main--middle--description | removeNewline | trim',
address: '.aditem-main--top--left | trim | removeNewline',
image: 'img@src',
},
normalize: normalize,
filter: applyBlacklist,

View File

@@ -29,6 +29,7 @@ const config = {
link: 'a@href',
address: '.nbk-project-card__description | removeNewline | trim',
price: '.nbk-project-card__spec-item .nbk-project-card__spec-value | removeNewline | trim',
image: '.nbk-project-card__image@src',
},
normalize: normalize,
filter: applyBlacklist,

View File

@@ -5,7 +5,8 @@ let appliedBlackList = [];
function normalize(o) {
const id = buildHash(o.id, o.price);
const link = `https://www.wg-gesucht.de${o.link}`;
return Object.assign(o, { id, link });
const image = o.image != null ? o.image.replace('small', 'large') : null;
return Object.assign(o, { id, link, image });
}
function applyBlacklist(o) {
@@ -26,6 +27,7 @@ const config = {
size: '.middle .text-right |removeNewline |trim',
title: '.truncate_title a |removeNewline |trim',
link: '.truncate_title a@href',
image: '.img-responsive@src',
},
normalize: normalize,
filter: applyBlacklist,