Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在获取数据时,如何迭代不同的URL?_Javascript_Json_Asynchronous_Web Scraping_Axios - Fatal编程技术网

Javascript 在获取数据时,如何迭代不同的URL?

Javascript 在获取数据时,如何迭代不同的URL?,javascript,json,asynchronous,web-scraping,axios,Javascript,Json,Asynchronous,Web Scraping,Axios,我在一些评论员的帮助下更新了代码。简短总结: -我想从800多页的页面中提取包含产品信息的HTML,并将数据解析为JSON并保存在JSON文件中。当我一次喜欢20页时,代码可以工作,但是当我尝试执行所有页面时,我得到以下错误: Error: Max redirects exceeded. 这是全部代码: // Import required modules const axios = require('axios'); const cheerio = require('cheerio'); c

我在一些评论员的帮助下更新了代码。简短总结: -我想从800多页的页面中提取包含产品信息的HTML,并将数据解析为JSON并保存在JSON文件中。当我一次喜欢20页时,代码可以工作,但是当我尝试执行所有页面时,我得到以下错误:

Error: Max redirects exceeded.
这是全部代码:

// Import required modules
const axios = require('axios');
const cheerio = require('cheerio');
const fs = require('fs');

const url = "http://johndevisser.marktplaza.nl/?p=";

async function getProductsHtml(data) {
    const $ = await cheerio.load(data);
    let productsHTML = [];
    $("div.item").each((i, prod) => {
        productsHTML.push(($(prod).html()));
    });
    return productsHTML;
};

async function parseProducts(html) {
  let products = [];
  for (item in html) {
    // Store the data we already have
    const $ = await cheerio.load(html[item]);
    let product = {};
    let mpUrl = $("a").attr("href");
    product["title"] = $("a").attr("title");
    product["mpUrl"] = mpUrl;
    product["imgUrl"] = $("img").attr("src");
    let priceText = $("span.subtext").text().split("\xa0")[1].replace(",", ".");
    product["price"] = parseFloat(priceText);
    products.push(product);
  }
  return products;
}

async function addDescriptionToProducts(prods) {
  for (i in prods) {
    const response = await axios.get(prods[i]["mpUrl"])
    const $ = cheerio.load(response.data);
    description = $("div.description p").text();
    prods[i]["descr"] = description;
  }
  return prods
}

async function getProductsFromPage(i) {
  try {
      const page = await axios.get(`http://johndevisser.marktplaza.nl/?p=${i}`);
      console.log("GET request succeeded!");
      // Get the Array with HTML of each product
      const productsHTML = await getProductsHtml(page.data);
      console.log("HTML array obtained!");
      // Get the Array of objects with meta info
      const productsParsed = await parseProducts(productsHTML);
      console.log("Products parsed!")
      // Add description to each product
      const productsMeta = await addDescriptionToProducts(productsParsed);
      console.log("Descriptions added!")
      // Return the Array with all product information
      return productsMeta;
    } catch(e) {
      console.log(e);
    }
};

async function saveAllProducts() {
  try {
    const allProducts = await getAllProducts();
    let jsonProducts = await JSON.stringify(allProducts);
        fs.writeFile("products.json", jsonProducts, "utf8", (e) => {
          if (e) {
            console.log(e)
          }
        });
  } catch(e) {
    console.log(e);
  }
}

async function getAllProducts() {
  try {
    let allProducts = [];
    for (let i = 1; i < 855; i++) {
      const productsFromPage = await getProductsFromPage(i);
      allProducts = [...allProducts, ...productsFromPage];
      console.log("Saved products from page " + i);
    }
    return allProducts
  } catch(e) {
    console.log(e);
  }
}

saveAllProducts();
//导入所需的模块
const axios=require('axios');
const cheerio=需要(“cheerio”);
常数fs=要求('fs');
常量url=”http://johndevisser.marktplaza.nl/?p=";
异步函数getProductsHtml(数据){
const$=等待cheerio.load(数据);
设productsHTML=[];
$(“分类项目”)。每个((i,prod)=>{
productsHTML.push(($(prod.html());
});
返回产品shtml;
};
异步函数解析产品(html){
让产品=[];
用于(html格式的项目){
//存储我们已有的数据
const$=等待cheerio.load(html[项目]);
设乘积={};
设mpUrl=$(“a”).attr(“href”);
产品[“标题]=$(“a”).attr(“标题”);
产品[“mpUrl”]=mpUrl;
产品[“imgUrl”]=$(“img”).attr(“src”);
让priceText=$(“span.subtext”).text().split(“\xa0”)[1]。替换(“,”,”);
产品[“价格”]=parseFloat(价格文本);
产品。推(产品);
}
退货产品;
}
异步函数addDescriptionToProducts(产品){
for(我在prods中){
const response=wait axios.get(prods[i][“mpUrl”])
const$=cheerio.load(response.data);
description=$(“div.description p”).text();
产品[i][“描述”]=描述;
}
回击棒
}
异步函数getProductsFromPage(i){
试一试{
const page=等待axios.get(`http://johndevisser.marktplaza.nl/?p=${i}`);
log(“获取请求成功!”);
//使用每个产品的HTML获取数组
const productsHTML=wait getProductsHtml(page.data);
log(“获得HTML数组!”);
//获取具有元信息的对象数组
const productsParsed=等待解析产品(productsHTML);
log(“已解析的产品!”)
//为每个产品添加说明
const productsMeta=等待添加描述产品(productsParsed);
log(“添加了说明!”)
//返回包含所有产品信息的数组
返回产品数据;
}捕获(e){
控制台日志(e);
}
};
异步函数saveAllProducts(){
试一试{
const allProducts=wait getAllProducts();
让jsonProducts=wait JSON.stringify(所有产品);
fs.writeFile(“products.json”,jsonProducts,“utf8”,(e)=>{
如果(e){
控制台日志(e)
}
});
}捕获(e){
控制台日志(e);
}
}
异步函数getAllProducts(){
试一试{
让所有产品=[];
for(设i=1;i<855;i++){
const productsFromPage=等待getProductsFromPage(i);
allProducts=[…allProducts,…productsFromPage];
console.log(“从第“+i页保存的产品”);
}
退回所有产品
}捕获(e){
控制台日志(e);
}
}
saveAllProducts();

以下是获取所有数据并进行迭代的方法

比如说,你有1-800页

const pageCount=800;
常量承诺=[];
对于(让page=0;page{
//响应将按顺序列出每页的响应列表
//因此,现在相应地操作这些数据,并在这里写入您的文件/
const data=responses.flat();

});在尝试获取所有800种产品之前,我强烈建议您退后一步,看看您当前的代码。有几件事使得这个脚本运行800次变得更加困难

  • getProducts
    接收页面html并将产品的html放入全局变量中。这被称为副作用,使代码变得比需要的更复杂
  • parseProducts
    接收产品html数组,但不使用它。相反,它使用全局变量
  • parseProducts
    解析每个产品html,并将元数据放入另一个全局变量中
  • fetchAndUpdateProducts
    正在做两件事;解析页面并写入json
  • 由于这些原因,
    fetchAndUpdateProducts
    中的流程变得有点不清晰,调试变得困难

    所以我建议从一个新的方法开始,就像这样

    异步getProductsFromPage(i){
    试一试{
    const page=等待axios.get(`http://johndevisser.marktplaza.nl/?p=${i}`);
    //使用每个产品的HTML获取数组
    const productsHTML=getProductsHtml(response.data);
    //获取具有元信息的对象数组
    const productsParsed=parseProducts(productsHTML);
    //为每个产品添加说明
    const productsMeta=等待添加描述产品(productsParsed);
    //返回包含所有产品信息的数组
    返回产品数据;
    }捕获(e){
    }
    
    }
    显示您的代码,以及您的迭代方式?如前所述,由于我尝试的两种方法都不起作用,所以我现在还不知道。您建议我如何迭代所有不同的URL?
    async function fetchAndUpdateProducts(pageNumber){…}
    然后您在其他地方循环
    for(让I=0;这不起作用,因为我会在不同的JSON文件中获取数据,而不是将所有数据合并在一个文件中。那么
    fs.appendFile
    不是邪恶的:)这不会与现有的try/catch和async/await冲突吗?我编辑了这篇文章来展示整个代码,希望能有所帮助!我在这方面取得了巨大的进步,谢谢!除了,现在我收到一个错误,说“超过了最大重定向。我将更新代码。我发现了问题,显然其中一个产品的标题中只有希腊字符,这以某种方式阻止了整个页面。网站上的产品页面不是acc