Я недавно играл с puppeteer
, с конечной целью научиться чистить Glassdoor для обзоров его компаний, и Я столкнулся со странной проблемой. По какой-то причине мой селектор JQuery (установленный здесь) никогда не может найти отзывы о холдинговой компании <div class="hreview">
, несмотря на то, что логика очистки моего скрипта работает безупречно на другом сайте.
Сначала я проверил свой скрипт на хакерских новостях, и он успешно напечатал номер и название каждой статьи:
const puppeteer = require("puppeteer");
const fs = require('fs');
const $ = require('cheerio');
// Function to help with cheerio's JQuery down the line
function jq_helper(current_selector, child_element_name) {
if (!$(current_selector).children(child_element_name).length) {
console.log(`${child_element_name} does not exist`);
return [];
}
else {
var scraped_data = $(current_selector).children(child_element_name).text();
console.log(scraped_data);
return scraped_data;
}
}
// puppeteer usage as normal
puppeteer.launch({ headless: false }).then(async browser => {
const page = await browser.newPage()
const navigationPromise = page.waitForNavigation()
await page.setViewport({ width: 1440, height: 794 })
await page.goto('https://news.ycombinator.com/news')
await navigationPromise
var data = [];
const html = await page.content();
$(".athing", html).each(function() {
console.log("\nMain scraping function underway.")
// Getting number of each link
var element1 = ".title[valign='top'][align='right']"
var number = jq_helper(this, element1)
data.push({'number': number})
// Traversing to next level of descendants - getting title and link of each article
current_level = $(this).children(".title:not([valign])")
// Getting title and link of article
var element2 = ".storylink"
link = jq_helper(current_level, element2)
data.push({'link': link})
});
fs.writeFile('scrape_hackernews.txt', JSON.stringify(data), (err) => {
// throws an error, you could also catch it here
if (err) throw err;
// success case, the file was saved
console.log('\nFile saved!');
});
await browser.close()
})
Однако приведенная выше логика очистки завершается с ошибкой glassdoor в приведенном ниже сценарии, и каждый выбранный html-элемент сообщается как отсутствующий:
const puppeteer = require("puppeteer");
const $ = require('cheerio');
const fs = require('fs');
// Function to help with cheerio's JQuery down the line
function jq_helper(current_selector, child_element_name) {
if (!$(current_selector).children(child_element_name).length) {
console.log(`${child_element_name} does not exist`);
return [];
}
else {
var scraped_data = $(current_selector).children(child_element_name).text();
console.log(scraped_data);
return scraped_data;
}
}
// puppeteer usage as normal
puppeteer.launch({ headless: false }).then(async browser => {
const page = await browser.newPage()
const navigationPromise = page.waitForNavigation()
await page.setViewport({ width: 1440, height: 794 })
await page.goto('https://www.glassdoor.com/Reviews/Grubhub-Reviews-E419089.htm')
await navigationPromise
var data = [];
const html = await page.content();
$(".hreview", html).each(function() {
console.log("\nMain scraping function happening.")
// Getting date of review
var element1 = ".d-flex justify-content-between"
var date = jq_helper(this, element1);
data.push({'date': date})
// Traversing next level
current_level = $(this).children(".row mt").children(".col-sm-11 pl-sm-lg mx-0")
// Getting title
var element2 = ".h2 summary strong mt-0 mb-xsm"
var title = jq_helper(current_level, element2)
data.push({'title': title})
// Getting stars
var element3 = ".mr-xsm d-lg-inline-block"
var stars = jq_helper(current_level, element3)
data.push({'stars': stars})
// Getting employee info
var element4 = ".d-lg-inline-block"
var employee_info = jq_helper(current_level, element4)
data.push({'employee_info': employee_info})
// Traversing next level
current_level = $(current_level).children("div")
// Getting review sub-title
var element5 = ".mainText mb-0"
var title = jq_helper(current_level, element5)
data.push({'title': title})
// Traversing next level
current_level = $(current_level).children(".description")
// Getting all pieces of review
var element6 = ".mt-md"
var review = jq_helper(current_level, element6)
data.push({'review': review})
});
fs.writeFile('scrape_example.txt', JSON.stringify(data), (err) => {
// throws an error, you could also catch it here
if (err) throw err;
// success case, the file was saved
console.log('\nFile saved!');
});
await browser.close()
})
Может ли кто-нибудь начать меня, чтобы мой сценарий мог найти первый элемент, который он ищет, и я мог бы пойти оттуда? Я не знаю, откуда эта ошибка.
Заранее благодарим.