node.js에서 puppeteer를 통해 데이터를 스크랩하려고합니다.
현재 well.ca의 특정 섹션에있는 모든 데이터를 스크랩하는 스크립트를 작성하려고합니다.
지금은 node.js를 통해 구현하려는 방법론 / 로직이 있습니다.
1-사이트의 의학 건강 섹션으로 이동
2-dom 선택기를 사용하여 dom 선택기를 .panel-body-content
통해 href 배열을 가져와 panel-body-content a[href]
하위 섹션을 긁어냅니다.
3-for 루프를 사용하여 각 링크 (하위 섹션)를 반복합니다.
4 각 하위 섹션 링크에 대해 다음을 col-lg-5ths col-md-3 col-sm-4 col-xs-6
통해 값이있는 각 클래스의 href를 가져 와서 각 제품에 대한 또 다른 href 배열을 가져옵니다..col-lg-5ths col-md-3 col-sm-4 col-xs-6 a[href]
5-하위 섹션 내의 각 제품을 반복합니다.
6-각 제품에 대한 스크랩 데이터
현재 저는 위 코드의 대부분을 작성했습니다.
const puppeteer = require('puppeteer');
const chromeOptions = {
headless: false,
defaultViewport: null,
};
(async function main() {
const browser = await puppeteer.launch(chromeOptions);
try {
const page = await browser.newPage();
await page.goto("https://well.ca/categories/medicine-health_2.html");
console.log("::::::: OPEN WELL ::::::::::");
// href attribute
const hrefs1 = await page.evaluate(
() => Array.from(
document.querySelectorAll('.panel-body-content a[href]'),
a => a.getAttribute('href')
)
);
console.log(hrefs1);
const urls = hrefs1
for (let i = 0; i < urls.length; i++) {
const url = urls[i];
await page.goto(url);
}
const hrefs2 = await page.evaluate(
() => Array.from(
document.querySelectorAll('.col-lg-5ths col-md-3 col-sm-4 col-xs-6 a[href]'),
a => a.getAttribute('href')
)
);
모든 제품의 각 href에 대한 배열을 얻으려고 할 때 배열에 아무것도 수신하지 않습니다.
중첩 된 for 루프를 추가하여 모든 하위 섹션의 모든 제품에 대한 모든 href의 배열을 가져온 다음 각 제품 링크를 방문하려면 어떻게해야합니까?
.col-lg-5ths col-md-3 col-sm-4 col-xs-6
ID 가있는 클래스 내에있는 모든 href를 가져 오는 올바른 DOM 선택기는 무엇입니까?product_grid_link
각 하위 섹션에서 제품의 href를 통해 각 제품에서 정보를 가져 오는 후속 루프를 추가하려면 어떻게 코드에 포함시킬 수 있습니까?
어떤 도움이라도 대단히 감사하겠습니다.
일부 링크가 중복 된 것으로 보이므로 최종 페이지의 모든 링크를 수집하고 링크 목록의 중복을 제거한 다음 최종 페이지를 긁어내는 것이 좋습니다. (나중에 사용할 수 있도록 최종 페이지의 링크를 파일에 저장할 수도 있습니다.)이 스크립트는 5395 개의 링크 (중복 제거)를 수집합니다.
'use strict';
const puppeteer = require('puppeteer');
(async function main() {
try {
const browser = await puppeteer.launch({ headless: false, defaultViewport: null });
const [page] = await browser.pages();
await page.goto('https://well.ca/categories/medicine-health_2.html');
const hrefsCategoriesDeduped = new Set(await page.evaluate(
() => Array.from(
document.querySelectorAll('.panel-body-content a[href]'),
a => a.href
)
));
const hrefsPages = [];
for (const url of hrefsCategoriesDeduped) {
await page.goto(url);
hrefsPages.push(...await page.evaluate(
() => Array.from(
document.querySelectorAll('.col-lg-5ths.col-md-3.col-sm-4.col-xs-6 a[href]'),
a => a.href
)
));
}
const hrefsPagesDeduped = new Set(hrefsPages);
// hrefsPagesDeduped can be converted back to an array
// and saved in a JSON file now if needed.
for (const url of hrefsPagesDeduped) {
await page.goto(url);
// Scrape the page.
}
await browser.close();
} catch (err) {
console.error(err);
}
})();
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다