@crawlee/core 3.17.1-beta.21 → 3.17.1-beta.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +5 -5
- package/storages/request_provider.js +14 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crawlee/core",
|
|
3
|
-
"version": "3.17.1-beta.
|
|
3
|
+
"version": "3.17.1-beta.22",
|
|
4
4
|
"description": "The scalable web crawling and scraping library for JavaScript/Node.js. Enables development of data extraction and web automation jobs (not only) with headless Chrome and Puppeteer.",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=16.0.0"
|
|
@@ -59,9 +59,9 @@
|
|
|
59
59
|
"@apify/pseudo_url": "^2.0.30",
|
|
60
60
|
"@apify/timeout": "^0.3.0",
|
|
61
61
|
"@apify/utilities": "^2.7.10",
|
|
62
|
-
"@crawlee/memory-storage": "3.17.1-beta.
|
|
63
|
-
"@crawlee/types": "3.17.1-beta.
|
|
64
|
-
"@crawlee/utils": "3.17.1-beta.
|
|
62
|
+
"@crawlee/memory-storage": "3.17.1-beta.22",
|
|
63
|
+
"@crawlee/types": "3.17.1-beta.22",
|
|
64
|
+
"@crawlee/utils": "3.17.1-beta.22",
|
|
65
65
|
"@sapphire/async-queue": "^1.5.1",
|
|
66
66
|
"@vladfrangu/async_event_emitter": "^2.2.2",
|
|
67
67
|
"csv-stringify": "^6.2.0",
|
|
@@ -83,5 +83,5 @@
|
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
},
|
|
86
|
-
"gitHead": "
|
|
86
|
+
"gitHead": "913fa8ac27d9a04e8a8b87df05d1c6c9ab7f3a87"
|
|
87
87
|
}
|
|
@@ -13,6 +13,11 @@ const request_1 = require("../request");
|
|
|
13
13
|
const access_checking_1 = require("./access_checking");
|
|
14
14
|
const storage_manager_1 = require("./storage_manager");
|
|
15
15
|
const utils_2 = require("./utils");
|
|
16
|
+
/**
|
|
17
|
+
* Maximum number of consecutive batch-add attempts that make no progress before the remaining
|
|
18
|
+
* unprocessed requests are skipped, so permanently rejected requests don't retry forever.
|
|
19
|
+
*/
|
|
20
|
+
const MAX_UNPROCESSED_REQUESTS_RETRIES = 3;
|
|
16
21
|
class RequestProvider {
|
|
17
22
|
constructor(options, config = configuration_1.Configuration.getGlobalConfig()) {
|
|
18
23
|
Object.defineProperty(this, "config", {
|
|
@@ -385,13 +390,20 @@ class RequestProvider {
|
|
|
385
390
|
const requestIterator = generateRequests();
|
|
386
391
|
const chunks = (0, utils_1.peekableAsyncIterable)((0, utils_1.chunkedAsyncIterable)(requestIterator, effectiveChunkSize));
|
|
387
392
|
const chunksIterator = chunks[Symbol.asyncIterator]();
|
|
388
|
-
const attemptToAddToQueueAndAddAnyUnprocessed = async (providedRequests, cache = true) => {
|
|
393
|
+
const attemptToAddToQueueAndAddAnyUnprocessed = async (providedRequests, cache = true, unsuccessfulAttempts = 0) => {
|
|
389
394
|
const resultsToReturn = [];
|
|
390
395
|
const apiResult = await this.addRequests(providedRequests, { forefront: options.forefront, cache });
|
|
391
396
|
resultsToReturn.push(...apiResult.processedRequests);
|
|
392
397
|
if (apiResult.unprocessedRequests.length) {
|
|
398
|
+
// Count attempts that make no progress, so permanently rejected requests (e.g. a malformed
|
|
399
|
+
// `userData` shape causing a 400) don't loop forever. Any progress resets the counter.
|
|
400
|
+
const attempts = apiResult.processedRequests.length ? 0 : unsuccessfulAttempts + 1;
|
|
401
|
+
if (attempts >= MAX_UNPROCESSED_REQUESTS_RETRIES) {
|
|
402
|
+
this.log.warning(`Some requests were consistently rejected by the request queue and will be skipped after ${MAX_UNPROCESSED_REQUESTS_RETRIES} attempts. This usually means the request data is malformed (e.g. an invalid 'userData' shape).`, { unprocessedRequests: apiResult.unprocessedRequests });
|
|
403
|
+
return resultsToReturn;
|
|
404
|
+
}
|
|
393
405
|
await (0, utils_1.sleep)(waitBetweenBatchesMillis);
|
|
394
|
-
resultsToReturn.push(...(await attemptToAddToQueueAndAddAnyUnprocessed(providedRequests.filter((r) => !apiResult.processedRequests.some((pr) => pr.uniqueKey === r.uniqueKey)), false)));
|
|
406
|
+
resultsToReturn.push(...(await attemptToAddToQueueAndAddAnyUnprocessed(providedRequests.filter((r) => !apiResult.processedRequests.some((pr) => pr.uniqueKey === r.uniqueKey)), false, attempts)));
|
|
395
407
|
}
|
|
396
408
|
return resultsToReturn;
|
|
397
409
|
};
|