javascript - 有没有办法从 Node.js 中的特定位置向网站发送请求?

标签 javascript node.js web-scraping request

我是 node.js 和网络抓取的新手。我想从 amazon.com 提取数据。除了价格和库存信息之外,我还想拉到加拿大的 cargo 价格(顺便说一句,我的国家是土耳其,所以当我点击amazon.com时会自动显示到土耳其的 cargo 价格)。也许你们中有些人知道亚马逊网站的左上角有一个名为“Deliver to XXX country”的按钮,可以让客户了解到任何国家的 cargo 价格。但是存在一个问题,当我选择(单击按钮)一个我想要了解那里的 cargo 价格的国家时,指示所选国家/地区的网址没有变化。只是页面 html 内容发生了变化(到该国家的 cargo 价格出现或更改为其他价格水平)。那么,我如何操作我的请求模块,就好像我从加拿大进入网站 (amazon.com)(例如使用 VPN)一样?这在node.js“request-promise”模块中可能吗?或者我可以从更改的网站 html 内容中检测到它吗?我希望我能解释一下我想做什么。如果您访问此示例产品链接或任何其他产品,并在页面上浏览一番后,这将帮助您更清楚地了解情况。

https://www.amazon.com/gp/product/B072HW9W92

最佳答案

您所看到的是一个使用 JavaScript 来更新页面信息而不是为其加载新网址的网站。

要获取您需要的信息,普通的 HTTP 请求是不够的:您需要使用我们所说的 headless browser 。基本上,您将编写代码来启动没有界面的网络浏览器,并在其中执行您想要的任何操作。

使用它,您将能够执行这种场景:

  1. Visit https://example.com
  2. Click on element that has class "class1"
  3. Wait for new page load
  4. Grab the content of element that has id "id2"

并有效地获取您需要的所有数据。这将比 HTTP 请求更加占用 CPU/内存,但在您描述的场景中您无法绕过它。

我最近最喜欢的是puppeteer .

这是一个使用 Puppeteer 的工作片段,它完全按照您想要做的事情进行。我通过了 headless: false 选项让您看看发生了什么。

const puppeteer = require("puppeteer");

(async() => {
    const browser = await puppeteer.launch({headless: false, args: ['--no-sandbox']});
    const page = await browser.newPage();
    await page.goto("https://www.amazon.com/dp/B072HW9W92/");

    await page.click(".nav-a.nav-a-2.a-popover-trigger");
    await page.waitFor(500);

    await page.click(".a-button-text.a-declarative[role='radiogroup']");
    await page.waitFor(500);

    await page.click(`[data-value='{"stringVal":"CA"}']`);
    await page.waitFor(500);

    await page.click(`[name='glowDoneButton']`);
})();

这是它工作的 gif:

Puppeteer on Amazon

关于javascript - 有没有办法从 Node.js 中的特定位置向网站发送请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54599906/

相关文章:

javascript - 如何自动测试某些 javascript API 的一组用例?

javascript - 如何修复丢失的 @angular/Core 模块?

node.js - 在 Typescript 中编写和运行 node.js 应用程序

python - 使用 Python 中的 BeautifulSoup 揭示网站上缺失的标签

javascript - 使用 Decimal.js 计算两个数字之间的百分比增加/减少的正确方法是什么?

javascript - Angular 与 ng-repeat 作斗争

javascript - Python - 使用 selenium 的 javascript 网页抓取无法正常工作

javascript - 识别并提取图像的标题/说明(数据剪贴Pinterest)

javascript - document.getElementById() 通过分配动态变量

node.js - 如何在虚拟机中将node js服务托管到nginx服务器中?