Javascript 如何使用Puppeter求解和定位元素 刮屏问题

Javascript 如何使用Puppeter求解和定位元素 刮屏问题,javascript,node.js,dom,puppeteer,Javascript,Node.js,Dom,Puppeteer,我试图学习如何使用querySelector定位元素 在这个使用Puppeter的NodeJS屏幕抓取应用程序中,我想添加一个在Marketplace上列出的项目的“位置” 在我尝试添加此新节点之前,脚本运行良好,它将输出以下内容: [ { itemTitle: 'Iphone 7 Unlocked 32GB Gold', itemPrice: '$195', itemURL: 'https://facebook.com//marketplace/item/10943

我试图学习如何使用querySelector定位元素

在这个使用Puppeter的NodeJS屏幕抓取应用程序中,我想添加一个在Marketplace上列出的项目的“位置”

在我尝试添加此新节点之前,脚本运行良好,它将输出以下内容:

[
  {
    itemTitle: 'Iphone 7 Unlocked 32GB Gold',
    itemPrice: '$195',
    itemURL: 'https://facebook.com//marketplace/item/1094335687596621/',
    itemImg: 'https://scontent-mia3-1.xx.fbcdn.net/v/t1.0-0/c0.29.261.261a/p261x260/94707992_155656332613238_7356296336775315456_o.jpg?_nc_cat=108&_nc_sid=843cd7&_nc_oc=AQk4lXrzsGBkPFIWqx-sRgcDWuNd2kZlc1XJavKl0ZLJBcZZfaLFFUpZbSTTStFuT9U&_nc_ht=scontent-mia3-1.xx&oh=bc6f948b7c5930f1f81f85cbdf889ad5&oe=5ECEB781'
  },
  {
    itemTitle: 'iPhone X 64gb Unlocked Everything Works',
    itemPrice: '$180',
    itemURL: 'https://facebook.com//marketplace/item/2576925735968131/',
    itemImg: 'https://scontent-mia3-2.xx.fbcdn.net/v/t1.0-0/c0.83.750.750a/s261x260/84641729_222957132082738_3587337422137982976_o.jpg?_nc_cat=105&_nc_sid=843cd7&_nc_oc=AQmueUdOvX-NNTmxZOZp5gvyt-Szz9emk0it5HseboNA38BvQvKV0FT7mDwtqJo6z1g&_nc_ht=scontent-mia3-2.xx&oh=fbf3ffe04007566227eb76c608dd7fae&oe=5ECF5178'
  }
]

以上结果的选择器 以下是用于获取这些结果的内容:

const itemTitle = item.querySelector('div > div > span > div > a > div > div > div > span > div > span > div[class="l9j0dhe7 stjgntxs ni8dbmo4"').innerText;
const itemPrice = item.querySelector('div > div > span > div > a > div > div > div > div > span[class="oi732d6d ik7dh3pa d2edcug0 qv66sw1b c1et5uql a8c37x1j s89635nw ew0dbk1b a5q79mjw g1cxx5fr lrazzd5p oo9gr5id"').innerText;
const itemURL = `https://facebook.com/${item.getAttribute('href')}`;
const itemImg = item.querySelector('div > div > span > div > a > div > div > div > div > div > div > img').getAttribute('src');             
现在我想添加项目的位置:

这是我试图抓住的跨度:

因此,我尝试在Chrome开发工具中检查元素和COPY->XPATH,并得到以下结果:

//*[@id="u_0_c"]/div/div[1]/div/div/div/div/div[2]/div/div[2]/div/div/div[1]/div/span/div/a/div/div[2]/div[3]/span/div/span
当我将其插入现有代码时

var location = item.querySelectorAll('div[@id="u_0_c"]/div/div[1]/div/div/div/div/div[2]/div/div[2]/div/div/div[1]/div/span/div/a/div/div[2]/div[3]/span/div/span').innerText;
它坏了。各种各样的错误

我该怎么做? 这不是我写的代码。选择器看起来非常复杂。我使用CHrome的开发工具是否正确?我做错了什么

全部来源
谢谢你的关注。如有任何帮助,我们将不胜感激。

我想这正是您需要的:

基本上,如果您从chrome DevTools获得XPATH,您不能只使用querySelector,您需要使用
document.evaluate
函数


最好的

我读了你发送的链接。那里有很多好信息。最终为我工作的是一个我从未听说过的未知开发工具函数$x(‘这里的x路径’)-这给了我所需要的信息。差不多了。它给了我这个:span.oi732d6d ik7dh3pa d2edcug0 qv66sw1b c1et5uql a8c37x1j s89635nw ew0dbk1b a5q79mjw g1cx5fr lrazzd5p oo9gr5id-我不得不对它进行一些修改,比如:querySelector('span[class=“oi732d6d ik7dh3pa d2edcug0 qv66sw1b c1et5uqql8c7x1j s8935nw ew0dbk1b a8c7fr lrazzd5p”).text)那就成功了!谢谢你。
const puppeteer = require('puppeteer');

const getItems = async searchTerm => {
    //{headless: false, defaultViewport: null} --> put this in launch() method below as parameter for developtment purposes --> opens up browser window
    const browser = await puppeteer.launch({
        headless: false,
        defaultViewport: null
    });
    const page = await browser.newPage();
 /* Go to page */
 await page.goto(`https://facebook.com/marketplace/search/?query=${encodeURI(searchTerm)}`);


    const itemList = await page.waitForSelector('div > div > span > div > a[tabindex="0"]')
        .then(() => page.evaluate(() => {
            const itemArray = [];
            const itemNodeList = document.querySelectorAll('div > div > span > div > a[tabindex="0"]');

            itemNodeList.forEach(item => {
                const itemTitle = item.querySelector('div > div > span > div > a > div > div > div > span > div > span > div[class="l9j0dhe7 stjgntxs ni8dbmo4"').innerText;
                const itemPrice = item.querySelector('div > div > span > div > a > div > div > div > div > span[class="oi732d6d ik7dh3pa d2edcug0 qv66sw1b c1et5uql a8c37x1j s89635nw ew0dbk1b a5q79mjw g1cxx5fr lrazzd5p oo9gr5id"').innerText;
                const itemURL = `https://facebook.com/${item.getAttribute('href')}`;
                const itemImg = item.querySelector('div > div > span > div > a > div > div > div > div > div > div > img').getAttribute('src');
                //var location = item.querySelectorAll('div[@id="u_0_c"]/div/div[1]/div/div/div/div/div[2]/div/div[2]/div/div/div[1]/div/span/div/a/div/div[2]/div[3]/span/div/span').innerText;
                itemArray.push({
                    itemTitle,
                    itemPrice,
                    itemURL,
                    itemImg
                });
            });
            return itemArray;
        }))
        .catch(() => console.log("Selector error."));

    return itemList;

}

const initScraper = async () => {
    const items = await getItems('iphone');
    items.sort(function (a, b) {
        return a.itemPrice - b.itemPrice
    });
    console.log(items);
}

initScraper();