【问题标题】:Nodejs web scraping with 3 requests inside 3 loops在 3 个循环内使用 3 个请求进行 Nodejs Web 抓取
【发布时间】:2019-01-25 14:11:21
【问题描述】:

我的任务是抓取网站类别内容并将其制作为 json 文件。我只能硬编码主页 URL。每个类别都使用ajax,每个类别有多个页面。

  1. 我应该请求主页网址(例如:http://www.example.com/category.php,获取多少个类别并保存类别标题
  2. 获得总类别后,我将使用 for 循环 向(例如:http://www.example.com/category.php?category=i)请求
  3. 当我访问每个类别时,我应该请求计算每个类别中有多少页并使用 for 循环(例如:http://www.example.com/category.php?category=i&page=x
  4. 当我访问每个页面时,我应该计算其中有多少内容并使用for循环获取数据并将其保存在变量中
  5. 我应该生成一个 JSON 文件来保存结果。

在 3 个循环内生成 3 个请求的 node.js 代码结构是什么?

【问题讨论】:

  • @RobertColumbia 在循环中执行请求的代码是什么?

标签: javascript arrays node.js object node-modules


【解决方案1】:

尝试使用Async waterfall

示例 sn-p:

async.waterfall([
    firstFunction,
    secondFunction,
    lastFunction,
], (err, result) => {
    if(err){}
    
});
function firstFunction(callback) {
    callback(null);
}
function secondFunction(callback) {
    callback(null);
}
function lastFunction(callback) {
    callback(null);
}

【讨论】:

    【解决方案2】:

    在循环内执行请求的代码与在循环外执行请求的代码没有什么不同,唯一的大区别是如何处理它。当然,只需一个请求,您通常可以编写一个简单的函数来完成这一切,但是对于这样的事情,您最好这样做:

    • 为每个单独的部分创建一个异步函数,该函数可能在以后的其他地方(例如,另一个项目)有用,例如:抓取类别列表,抓取每个类别中的页面列表,以及抓取实际每个类别的列表中的页面。

    • 在使用循环时,为请求创建一个数组,为响应创建另一个数组,或者使用 map 或另一个循环对单个变量执行此操作,但是而不是等待每个请求而不是await 任何,而只是映射请求-> Promise(response)。在 map/whatever 循环之后,使用await Promise.all(arrayOfResponses) 等待所有请求完成(当然,您可以将其限制为仅部分请求,以防止它暂时禁止您的 IP,或者如果它是服务器则关闭该站点弱)。

    当您完成一个这样的功能时,其他功能会容易得多。您甚至可以编写一个可用于所有请求的通用函数,然后根据需要调用它并在函数之外的任何地方等待它(因此它对单个请求和数组都很有用)。

    不过,制作机器人的一个重要部分是也要努力表现得很好,这样你就不会惹上麻烦。其中一部分是考虑网站及其带宽,因此您不会像上面提到的那样将其关闭,但您可能还希望防止您在网站上的个人帐户(如果有)因您的机器人而受到惩罚。

    设置一个合适的用户代理可以对此有所帮助,http://www.user-agents.org 可以作为一个很好的灵感。请注意其中有多少包含产品名称、版本和网站,有些还包含用于联系机器人处理程序的电子邮件地址。这些有助于识别机器人,如果它出现问题,请让他们联系,而不是立即禁止用户代理或 IP 地址。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多