Я пытаюсь использовать Cheerio для очистки. Однако у меня возникла небольшая проблема. Все значения href, которые я получаю на стороне клиента, начинаются с «/url?q=". Например вот так:
'/url?q=https://www.nimh.nih.gov/health/topics/auti… pkCZkQFnoECAYQAg&usg=AOvVaw1E4L1bLVm9OdBSFMkjJftQ'
Элемент из поиска Google:
<a jsname = "UWckNb" href = "https://www.nimh.nih.gov/health/topics/autism-spectrum-disorders-asd"...
Он не содержит "/url?q = "
. Откуда берется "/url?q = "
?
app.get('/scrape', (req, res) => {
request('https://www.google.com/search?q=asd', (error, response, html) => {
if (response.statusCode == 200) {
const $ = cheerio.load(html);
const results = [];
const links = $('a');
links.each((index, link) => {
const href = $(link).prop('href');
const h3 = $(link).find('h3');
if (h3.length > 0) {
const textContent = h3.text().trim();
results.push({ href, textContent });
}
});
const responseData = {
links: results,
total: results.length
};
res.json(responseData);
} else {
console.error('Unexpected status code:', response.statusCode);
res.status(500).send('Unexpected status code.');
}
});
});
Я знаю, что могу решить это следующим образом:
const actualUrl = decodeURIComponent(href.split('/url?q=')[1].split('&')[0]);
Но хотелось бы знать, где это "/url?q = "
, что я делаю не так?
🤔 А знаете ли вы, что...
Синтаксис JavaScript схож с синтаксисом языка программирования Java, но они не связаны.
Именно так URL-адреса находятся в статическом HTML-коде, отправленном с сервера. Очевидно, некоторые JS запускаются после загрузки и обрезают hrefs, но поскольку Cheerio не запускает JS, вы мало что можете с этим поделать, кроме переключения на библиотеку автоматизации браузера, такую как Puppeteer. Будьте осторожны с тем, что вы видите в инструментах разработчика — они включают в себя динамические сценарии JS.
Я бы был осторожен с decodeURIComponent(href.split('/url?q=')[1].split('&')[0]);
, потому что за &
могут быть параметры запроса, которые имеют значение для страницы. Я не уверен, что это за шаблон, но &sa=U
, похоже, это постфикс Google.
Также:
a > h3
или использовать класс, который кажется довольно стабильным (этот прошлогодний ответ, в котором используется класс, все еще действителен и более прямой)..length
клиенту. Массивы имеют встроенную длину, поэтому они могут легко получить к ней доступ. Кэшированная длина — плохая практика, поскольку она не нужна и может легко рассинхронизироваться с фактической длиной.request
. Он устарел, и обратные вызовы вышли из моды. Предпочитайте промисы — выборка теперь является стандартной в Node 18+, а также есть axios, который также предпочтительнее request
.