【发布时间】:2019-11-29 16:14:29
【问题描述】:
我在一些评论者的帮助下更新了代码。一个简短的总结: - 我想从 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();
【问题讨论】:
-
显示你的代码,你是如何迭代的?
-
如前所述,我目前不在,因为我尝试的两件事没有奏效。您如何建议我遍历所有不同的 URL?
-
async function fetchAndUpdateProducts(pageNumber) {...}然后你在其他地方循环for (let i=0; i<800; i++) { fetchAndUpdateProducts(i); } -
那行不通,因为我会在不同的 JSON 文件中获取数据,而不是全部合并为一个。
-
好吧
fs.appendFile不是邪恶的:)
标签: javascript json asynchronous web-scraping axios