How to Configure Generated Spiders to Handle Rate Limiting and Captchas in SpiderCreator
You can configure generated spiders for rate limiting and captcha handling by modifying the LLM prompts in pipeline/spider_draft.py to request Scrapy settings and middleware, or by post-processing the combined output in pipeline/sp_combination.py to inject custom_settings and downloader middleware.
spidercreator is an open-source tool that generates Scrapy spider code by feeding recorded browser interactions to a large language model. While the core generation pipeline does not embed built-in throttling or captcha-solving logic, the architecture provides multiple hook points—prompt engineering and code post-processing—to configure generated spiders for production-grade rate limiting and anti-bot handling.
Understanding the SpiderCreator Architecture
The generation flow moves through several discrete pipeline stages. Knowing where each file lives allows you to intervene at the right moment to inject rate-limiting configurations or captcha middleware.
| File | Role | Intervention Point |
|---|---|---|
spidercreator.py |
Orchestrates recording → draft → candidates → execution → verification → final combination. | After make_scrapy_spider_draft (line 89) you can programmatically append settings to the draft. |
pipeline/spider_draft.py |
Sends recordings and a mermaid mind-map to the LLM; returns raw Scrapy code. | Modify DRAFT_SCRAPY_SPIDER_CREATION_PROMPT to request throttling and captcha logic. |
pipeline/sp_combination.py |
Merges multiple candidate spiders into one runnable script. | Wrap the combined spider in a custom_settings block before returning the final code (lines 81‑108). |
pipeline/sp_addr_remapping.py |
Rewrites URLs to local addresses. | Inject middleware imports here if you maintain a separate middlewares package. |
Implementing Rate Limiting in Generated Spiders
Scrapy provides two complementary mechanisms for rate limiting: a fixed DOWNLOAD_DELAY and the adaptive AutoThrottle extension.
Scrapy Settings for Throttling
Insert these keys into the spider’s custom_settings dictionary:
DOWNLOAD_DELAY: Base delay in seconds between requests to the same domain.AUTOTHROTTLE_ENABLED: Enable dynamic adjustment based on server latency.AUTOTHROTTLE_START_DELAY: Initial download delay for AutoThrottle.AUTOTHROTTLE_MAX_DELAY: Upper bound for the adaptive delay.CONCURRENT_REQUESTSandCONCURRENT_REQUESTS_PER_DOMAIN: Cap parallelism to reduce load.
Injecting Settings via LLM Prompts
In pipeline/spider_draft.py, locate the DRAFT_SCRAPY_SPIDER_CREATION_PROMPT variable (around lines 20‑28). Append instructions so the LLM emits the settings automatically:
DRAFT_SCRAPY_SPIDER_CREATION_PROMPT = """
...
- Respect the target website’s rate limits by adding Scrapy settings:
DOWNLOAD_DELAY = 2
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 2
AUTOTHROTTLE_MAX_DELAY = 60
"""
Because the prompt is fed directly to the model in pipeline/spider_draft.py (lines 35‑44), the generated spider will already contain the custom_settings block.
Post-Processing Settings in sp_combination.py
If you need to guarantee that every final spider includes throttling regardless of LLM output, modify pipeline/sp_combination.py. After the extract_first_python_code call (line 81), programmatically inject the settings:
# Inside pipeline/sp_combination.py after extracting code
settings_block = '''
custom_settings = {
"DOWNLOAD_DELAY": 2,
"AUTOTHROTTLE_ENABLED": True,
"AUTOTHROTTLE_START_DELAY": 2,
"AUTOTHROTTLE_MAX_DELAY": 60,
}
'''
# Insert before the first method definition or after the class line
Handling Captchas in Generated Spiders
Captchas require site-specific detection and solving logic. The most robust approach within the Scrapy ecosystem is a downloader middleware that intercepts responses, identifies challenge pages, and coordinates with a third-party solving service.
Downloader Middleware Approach
Create middlewares/captcha.py in your project root. The middleware implements process_response to detect captcha markers (e.g., specific DOM elements or URL patterns) and process_exception for retry logic.
Example CaptchaMiddleware Implementation
# middlewares/captcha.py
import base64
import requests
from scrapy import signals
from scrapy.exceptions import IgnoreRequest
class CaptchaMiddleware:
@classmethod
def from_crawler(cls, crawler):
# Read API key from Scrapy settings (never hard-code secrets)
return cls(crawler.settings.get("CAPTCHA_API_KEY"))
def __init__(self, api_key):
self.api_key = api_key
self.solver_url = "http://2captcha.com/in.php" # example endpoint
def process_response(self, request, response, spider):
# Detect captcha by checking for specific image or input
if response.css("img.captcha-img") or "captcha" in response.url.lower():
spider.logger.info("Captcha detected, sending to solving service...")
# Extract image URL or base64 data
img_url = response.css("img.captcha-img::attr(src)").get()
# Solve logic (pseudo-code; adapt to your provider's API)
solution = self._solve_captcha(img_url)
# Retry request with solved token
return request.replace(
meta={**request.meta, "captcha_solution": solution},
dont_filter=True
)
return response
def _solve_captcha(self, image_url):
# Implementation depends on 2Captcha, Anti-Captcha, etc.
# Return the solved token string
pass
Configuring Middleware in custom_settings
Reference the middleware in the spider’s custom_settings dictionary so Scrapy loads it into the downloader chain:
custom_settings = {
"DOWNLOADER_MIDDLEWARES": {
"myproject.middlewares.captcha.CaptchaMiddleware": 543,
},
"CAPTCHA_API_KEY": "YOUR_2CAPTCHA_KEY", # Inject via environment variable
}
To ensure the LLM generates this configuration, add the middleware requirements to the prompt in pipeline/spider_draft.py as described in the rate-limiting section.
End-to-End Configuration Example
Below is a complete, runnable spider that spidercreator could emit after applying the customisations outlined above. This example demonstrates the integration of both rate-limiting and captcha handling in a single custom_settings block:
import scrapy
from myproject.middlewares.captcha import CaptchaMiddleware
class RealEstateSpider(scrapy.Spider):
name = "real_estate"
start_urls = ["https://example.com/listings"]
custom_settings = {
# Rate limiting
"DOWNLOAD_DELAY": 2,
"AUTOTHROTTLE_ENABLED": True,
"AUTOTHROTTLE_START_DELAY": 2,
"AUTOTHROTTLE_MAX_DELAY": 60,
"CONCURRENT_REQUESTS": 8,
"CONCURRENT_REQUESTS_PER_DOMAIN": 4,
# Captcha handling
"DOWNLOADER_MIDDLEWARES": {
"myproject.middlewares.captcha.CaptchaMiddleware": 543,
},
"CAPTCHA_API_KEY": "YOUR_2CAPTCHA_KEY",
}
def parse(self, response):
# Extraction logic remains unchanged
yield {"title": response.css("h1::text").get()}
The spider now respects server load through adaptive throttling and can automatically solve captcha challenges via the injected middleware.
Summary
spidercreatorgenerates spiders via LLM prompts inpipeline/spider_draft.py, but does not include built-in rate limiting or captcha logic.- Rate limiting is implemented through Scrapy’s
custom_settingsusingDOWNLOAD_DELAYandAUTOTHROTTLE_ENABLED, either by prompting the LLM to include them or by post-processing inpipeline/sp_combination.py. - Captcha handling requires a custom downloader middleware (e.g.,
CaptchaMiddleware) that detects challenge pages and interfaces with solving services; configure it viaDOWNLOADER_MIDDLEWARESincustom_settings. - Prompt engineering in
pipeline/spider_draft.pyis the least invasive method—simply instruct the LLM to emit the required settings and middleware references. - Post-processing in
pipeline/sp_combination.pyguarantees compliance when you cannot rely on LLM output consistency.
Frequently Asked Questions
How do I add rate limiting to a spider generated by spidercreator?
You can add rate limiting by modifying the LLM prompt in pipeline/spider_draft.py to request Scrapy settings such as DOWNLOAD_DELAY and AUTOTHROTTLE_ENABLED inside a custom_settings dictionary. Alternatively, post-process the generated code in pipeline/sp_combination.py to programmatically inject these settings after the spider class definition.
Can spidercreator automatically solve captchas during scraping?
No, spidercreator does not include built-in captcha solving. However, you can configure generated spiders to handle captchas by adding a custom downloader middleware (such as CaptchaMiddleware) that detects captcha pages and sends them to a third-party solving service like 2Captcha. Include the middleware in DOWNLOADER_MIDDLEWARES within the spider’s custom_settings.
Where should I configure the captcha API key for a generated spider?
Store the captcha API key in the spider’s custom_settings dictionary under the key CAPTCHA_API_KEY, and read it via the from_crawler class method in your middleware. Never hard-code secrets directly into the generated spider code; instead, inject the value via environment variables or Scrapy’s settings mechanism when deploying the spider.
What is the difference between using DOWNLOAD_DELAY and AUTOTHROTTLE in Scrapy?
DOWNLOAD_DELAY enforces a fixed pause (in seconds) between consecutive requests to the same domain, providing predictable, static throttling. AUTOTHROTTLE_ENABLED activates the AutoThrottle extension, which dynamically adjusts the delay based on the target server’s response time and load, making it ideal for sites with variable performance or strict anti-bot measures.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →