diff --git a/src/scrapers/actors.js b/src/scrapers/actors.js index 127bd277..1aeb24ec 100644 --- a/src/scrapers/actors.js +++ b/src/scrapers/actors.js @@ -193,6 +193,7 @@ module.exports = { // etc '18vr': badoink, theflourishxxx: theflourish, + exploitedx, // only from known URL that will specify site fullpornnetwork, adultempire, allherluv: missax, @@ -213,7 +214,6 @@ module.exports = { cumlouder, dorcelclub: dorcel, doubleviewcasting: firstanalquest, - exploitedx, // only from known URL that will specify site firstanalquest, freeones, hitzefrei, diff --git a/src/scrapers/exploitedx.js b/src/scrapers/exploitedx.js index 5945c5ff..ce19525e 100755 --- a/src/scrapers/exploitedx.js +++ b/src/scrapers/exploitedx.js @@ -75,10 +75,11 @@ function scrapeScene({ query }, { url }) { function scrapeProfile({ query }, _entity) { const profile = {}; - const bio = Object.fromEntries(query.all('.detail-div p').map((detailEl) => [ - slugify(unprint.query.content(detailEl, 'strong'), '_'), - unprint.query.text(detailEl), - ])); + // all three selectors still apply to different sites + const keys = query.contents('h1 + div strong, .bio-items li strong, .detail-div p strong'); + const values = query.texts('h1 + div, .bio-items li, .detail-div p', { join: false }).flat(); + + const bio = Object.fromEntries(keys.map((key, index) => [slugify(key, '_'), values[index]])); profile.age = Number(bio.age) || null; profile.height = convert(bio.height, 'cm'); @@ -86,15 +87,18 @@ function scrapeProfile({ query }, _entity) { profile.description = [ bio.favorite_position && `Favorite position: ${bio.favorite_position}`, + bio.favorite_sex_toy && `Favorite sex toy: ${bio.favorite_sex_toy}`, bio.likes && `Likes: ${bio.likes}`, - ].filter(Boolean).join('\n'); + ].filter(Boolean).join('\n') || null; profile.avatar = [ - query.img('.model_bio_thumb', { attribute: 'src0_2x' }), - query.img('.model_bio_thumb', { attribute: 'src0_1x' }), - query.img('.model_bio_thumb', { attribute: 'src0_3x' }), // too big + query.img('.model-bio__image, .model_bio_thumb', { attribute: 'src0_2x' }), + query.img('.model-bio__image, .model_bio_thumb', { attribute: 'src0_1x' }), + query.img('.model-bio__image, .model_bio_thumb', { attribute: 'src0_3x' }), // too big ]; + console.log(bio); + return profile; } diff --git a/tests/profiles.js b/tests/profiles.js index 943a31ab..5efe187d 100644 --- a/tests/profiles.js +++ b/tests/profiles.js @@ -199,6 +199,12 @@ const actors = [ { entity: 'julesjordan', name: 'Vanna Bardot', fields: ['height', 'dateOfBirth', 'measurements', 'description', 'avatar'] }, { entity: 'amateurallure', name: 'Ava Amira', fields: ['avatar', 'description'] }, { entity: 'swallowsalon', name: 'Abella Danger', fields: ['avatar'] }, + // exploitedx + { entity: 'exploitedx', name: 'Amber Moore', url: 'https://exploitedcollegegirls.com/models/AmberMoore.html', fields: ['avatar', 'description', 'age', 'height', 'measurements'] }, + { entity: 'exploitedx', name: 'Amber Moore', url: 'https://bbcsurprise.com/models/AmberMoore.html', fields: ['avatar', 'age'] }, + { entity: 'exploitedx', name: 'Megan Marx', url: 'https://excogigirls.com/models/megan-marx.html', fields: ['avatar', 'description', 'age', 'height', 'measurements'] }, + { entity: 'exploitedx', name: 'Sophie Hunt', url: 'https://www.backroomcastingcouch.com/models/Sophie-Hunt.html', fields: ['avatar', 'age'] }, + { entity: 'exploitedx', name: 'Lao Latina', url: 'https://hotmilfsfuck.com/models/Lao-Latina.html', fields: ['avatar', 'description', 'age', 'height', 'measurements'] }, // etc. { entity: 'analvids', name: 'Veronica Leal', fields: ['avatar', 'gender', 'birthCountry', 'nationality', 'age', 'aliases', 'nationality'] }, { entity: 'bangbros', name: 'Kira Perez', fields: ['avatar', 'gender', 'ethnicity', 'hairColor'] },