crawlo 1.2.8__py3-none-any.whl → 1.2.9__py3-none-any.whl
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.
Potentially problematic release.
This version of crawlo might be problematic. Click here for more details.
- crawlo/__init__.py +63 -61
- crawlo/__version__.py +1 -1
- crawlo/cli.py +75 -75
- crawlo/commands/__init__.py +14 -14
- crawlo/commands/check.py +594 -594
- crawlo/commands/genspider.py +151 -151
- crawlo/commands/help.py +138 -138
- crawlo/commands/list.py +155 -155
- crawlo/commands/run.py +323 -323
- crawlo/commands/startproject.py +436 -436
- crawlo/commands/stats.py +187 -187
- crawlo/commands/utils.py +186 -186
- crawlo/config.py +312 -312
- crawlo/config_validator.py +277 -251
- crawlo/core/__init__.py +2 -2
- crawlo/core/engine.py +366 -365
- crawlo/core/processor.py +40 -40
- crawlo/core/scheduler.py +256 -251
- crawlo/crawler.py +1103 -1100
- crawlo/data/__init__.py +5 -5
- crawlo/data/user_agents.py +194 -107
- crawlo/downloader/__init__.py +273 -266
- crawlo/downloader/aiohttp_downloader.py +226 -228
- crawlo/downloader/cffi_downloader.py +245 -256
- crawlo/downloader/httpx_downloader.py +259 -259
- crawlo/downloader/hybrid_downloader.py +212 -212
- crawlo/downloader/playwright_downloader.py +402 -402
- crawlo/downloader/selenium_downloader.py +472 -472
- crawlo/event.py +11 -11
- crawlo/exceptions.py +81 -81
- crawlo/extension/__init__.py +39 -39
- crawlo/extension/health_check.py +141 -141
- crawlo/extension/log_interval.py +57 -57
- crawlo/extension/log_stats.py +81 -81
- crawlo/extension/logging_extension.py +43 -43
- crawlo/extension/memory_monitor.py +104 -104
- crawlo/extension/performance_profiler.py +133 -133
- crawlo/extension/request_recorder.py +107 -107
- crawlo/filters/__init__.py +154 -154
- crawlo/filters/aioredis_filter.py +234 -234
- crawlo/filters/memory_filter.py +269 -269
- crawlo/items/__init__.py +23 -23
- crawlo/items/base.py +21 -21
- crawlo/items/fields.py +52 -52
- crawlo/items/items.py +104 -104
- crawlo/middleware/__init__.py +21 -21
- crawlo/middleware/default_header.py +132 -132
- crawlo/middleware/download_delay.py +104 -104
- crawlo/middleware/middleware_manager.py +136 -136
- crawlo/middleware/offsite.py +114 -114
- crawlo/middleware/proxy.py +386 -368
- crawlo/middleware/request_ignore.py +86 -86
- crawlo/middleware/response_code.py +163 -163
- crawlo/middleware/response_filter.py +136 -136
- crawlo/middleware/retry.py +124 -124
- crawlo/middleware/simple_proxy.py +65 -0
- crawlo/mode_manager.py +211 -211
- crawlo/network/__init__.py +21 -21
- crawlo/network/request.py +379 -338
- crawlo/network/response.py +359 -359
- crawlo/pipelines/__init__.py +21 -21
- crawlo/pipelines/bloom_dedup_pipeline.py +157 -157
- crawlo/pipelines/console_pipeline.py +39 -39
- crawlo/pipelines/csv_pipeline.py +316 -316
- crawlo/pipelines/database_dedup_pipeline.py +223 -223
- crawlo/pipelines/json_pipeline.py +218 -218
- crawlo/pipelines/memory_dedup_pipeline.py +115 -115
- crawlo/pipelines/mongo_pipeline.py +131 -131
- crawlo/pipelines/mysql_pipeline.py +317 -317
- crawlo/pipelines/pipeline_manager.py +62 -62
- crawlo/pipelines/redis_dedup_pipeline.py +167 -167
- crawlo/project.py +290 -315
- crawlo/queue/pqueue.py +37 -37
- crawlo/queue/queue_manager.py +379 -378
- crawlo/queue/redis_priority_queue.py +306 -306
- crawlo/settings/__init__.py +7 -7
- crawlo/settings/default_settings.py +216 -220
- crawlo/settings/setting_manager.py +163 -122
- crawlo/spider/__init__.py +639 -639
- crawlo/stats_collector.py +59 -59
- crawlo/subscriber.py +129 -129
- crawlo/task_manager.py +30 -30
- crawlo/templates/crawlo.cfg.tmpl +10 -10
- crawlo/templates/project/__init__.py.tmpl +3 -3
- crawlo/templates/project/items.py.tmpl +17 -17
- crawlo/templates/project/middlewares.py.tmpl +118 -118
- crawlo/templates/project/pipelines.py.tmpl +96 -96
- crawlo/templates/project/settings.py.tmpl +261 -288
- crawlo/templates/project/settings_distributed.py.tmpl +174 -157
- crawlo/templates/project/settings_gentle.py.tmpl +95 -100
- crawlo/templates/project/settings_high_performance.py.tmpl +125 -134
- crawlo/templates/project/settings_minimal.py.tmpl +30 -0
- crawlo/templates/project/settings_simple.py.tmpl +96 -98
- crawlo/templates/project/spiders/__init__.py.tmpl +5 -5
- crawlo/templates/run.py.tmpl +47 -47
- crawlo/templates/spider/spider.py.tmpl +143 -143
- crawlo/tools/__init__.py +200 -182
- crawlo/tools/anti_crawler.py +268 -268
- crawlo/tools/authenticated_proxy.py +240 -240
- crawlo/{cleaners → tools}/data_formatter.py +225 -225
- crawlo/tools/data_validator.py +180 -180
- crawlo/tools/date_tools.py +290 -36
- crawlo/tools/distributed_coordinator.py +388 -387
- crawlo/{cleaners → tools}/encoding_converter.py +127 -126
- crawlo/tools/request_tools.py +83 -0
- crawlo/tools/retry_mechanism.py +224 -221
- crawlo/tools/scenario_adapter.py +262 -262
- crawlo/{cleaners → tools}/text_cleaner.py +232 -232
- crawlo/utils/__init__.py +35 -35
- crawlo/utils/batch_processor.py +259 -259
- crawlo/utils/controlled_spider_mixin.py +439 -439
- crawlo/utils/db_helper.py +343 -343
- crawlo/utils/enhanced_error_handler.py +356 -356
- crawlo/utils/env_config.py +142 -142
- crawlo/utils/error_handler.py +123 -123
- crawlo/utils/func_tools.py +82 -82
- crawlo/utils/large_scale_config.py +286 -286
- crawlo/utils/large_scale_helper.py +344 -344
- crawlo/utils/log.py +187 -128
- crawlo/utils/performance_monitor.py +285 -285
- crawlo/utils/queue_helper.py +175 -175
- crawlo/utils/redis_connection_pool.py +351 -351
- crawlo/utils/redis_key_validator.py +198 -198
- crawlo/utils/request.py +267 -267
- crawlo/utils/request_serializer.py +218 -218
- crawlo/utils/spider_loader.py +61 -61
- crawlo/utils/system.py +11 -11
- crawlo/utils/tools.py +4 -4
- crawlo/utils/url.py +39 -39
- {crawlo-1.2.8.dist-info → crawlo-1.2.9.dist-info}/METADATA +1011 -764
- crawlo-1.2.9.dist-info/RECORD +219 -0
- examples/__init__.py +7 -7
- tests/DOUBLE_CRAWLO_PREFIX_FIX_REPORT.md +81 -81
- tests/__init__.py +7 -7
- tests/advanced_tools_example.py +275 -275
- tests/authenticated_proxy_example.py +107 -237
- tests/cleaners_example.py +160 -160
- tests/config_validation_demo.py +143 -103
- tests/controlled_spider_example.py +205 -205
- tests/date_tools_example.py +180 -180
- tests/debug_pipelines.py +67 -0
- tests/dynamic_loading_example.py +523 -523
- tests/dynamic_loading_test.py +104 -104
- tests/env_config_example.py +133 -133
- tests/error_handling_example.py +171 -171
- tests/redis_key_validation_demo.py +130 -130
- tests/request_params_example.py +151 -0
- tests/response_improvements_example.py +144 -144
- tests/test_advanced_tools.py +148 -148
- tests/test_all_redis_key_configs.py +145 -145
- tests/test_authenticated_proxy.py +141 -141
- tests/test_cleaners.py +54 -54
- tests/test_comprehensive.py +146 -146
- tests/test_config_consistency.py +80 -80
- tests/test_config_merge.py +153 -0
- tests/test_config_validator.py +182 -193
- tests/test_crawlo_proxy_integration.py +109 -173
- tests/test_date_tools.py +123 -123
- tests/test_default_header_middleware.py +158 -158
- tests/test_distributed.py +65 -0
- tests/test_double_crawlo_fix.py +207 -207
- tests/test_double_crawlo_fix_simple.py +124 -124
- tests/test_download_delay_middleware.py +221 -221
- tests/test_downloader_proxy_compatibility.py +268 -268
- tests/test_dynamic_downloaders_proxy.py +124 -124
- tests/test_dynamic_proxy.py +92 -92
- tests/test_dynamic_proxy_config.py +146 -146
- tests/test_dynamic_proxy_real.py +109 -109
- tests/test_edge_cases.py +303 -303
- tests/test_enhanced_error_handler.py +270 -270
- tests/test_env_config.py +121 -121
- tests/test_error_handler_compatibility.py +112 -112
- tests/test_final_validation.py +153 -153
- tests/test_framework_env_usage.py +103 -103
- tests/test_integration.py +169 -357
- tests/test_item_dedup_redis_key.py +122 -122
- tests/test_mode_consistency.py +51 -51
- tests/test_offsite_middleware.py +221 -221
- tests/test_parsel.py +29 -29
- tests/test_performance.py +327 -327
- tests/test_proxy_api.py +264 -264
- tests/test_proxy_health_check.py +32 -32
- tests/test_proxy_middleware.py +121 -121
- tests/test_proxy_middleware_enhanced.py +216 -216
- tests/test_proxy_middleware_integration.py +136 -136
- tests/test_proxy_middleware_refactored.py +185 -0
- tests/test_proxy_providers.py +56 -56
- tests/test_proxy_stats.py +19 -19
- tests/test_proxy_strategies.py +59 -59
- tests/test_queue_manager_double_crawlo.py +173 -173
- tests/test_queue_manager_redis_key.py +176 -176
- tests/test_random_user_agent.py +73 -0
- tests/test_real_scenario_proxy.py +195 -195
- tests/test_redis_config.py +28 -28
- tests/test_redis_connection_pool.py +294 -294
- tests/test_redis_key_naming.py +181 -181
- tests/test_redis_key_validator.py +123 -123
- tests/test_redis_queue.py +224 -224
- tests/test_request_ignore_middleware.py +182 -182
- tests/test_request_params.py +112 -0
- tests/test_request_serialization.py +70 -70
- tests/test_response_code_middleware.py +349 -349
- tests/test_response_filter_middleware.py +427 -427
- tests/test_response_improvements.py +152 -152
- tests/test_retry_middleware.py +241 -241
- tests/test_scheduler.py +252 -252
- tests/test_scheduler_config_update.py +133 -133
- tests/test_simple_response.py +61 -61
- tests/test_telecom_spider_redis_key.py +205 -205
- tests/test_template_content.py +87 -87
- tests/test_template_redis_key.py +134 -134
- tests/test_tools.py +159 -153
- tests/test_user_agents.py +97 -0
- tests/tools_example.py +260 -257
- tests/verify_distributed.py +117 -0
- crawlo/cleaners/__init__.py +0 -61
- crawlo/utils/date_tools.py +0 -290
- crawlo-1.2.8.dist-info/RECORD +0 -209
- {crawlo-1.2.8.dist-info → crawlo-1.2.9.dist-info}/WHEEL +0 -0
- {crawlo-1.2.8.dist-info → crawlo-1.2.9.dist-info}/entry_points.txt +0 -0
- {crawlo-1.2.8.dist-info → crawlo-1.2.9.dist-info}/top_level.txt +0 -0
tests/dynamic_loading_test.py
CHANGED
|
@@ -1,105 +1,105 @@
|
|
|
1
|
-
#!/usr/bin/python
|
|
2
|
-
# -*- coding: UTF-8 -*-
|
|
3
|
-
"""
|
|
4
|
-
动态加载功能测试示例
|
|
5
|
-
==================
|
|
6
|
-
测试新添加的动态加载功能是否符合预期
|
|
7
|
-
"""
|
|
8
|
-
import asyncio
|
|
9
|
-
from crawlo import Spider, Request
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class TabControlTestSpider(Spider):
|
|
13
|
-
"""标签页控制测试爬虫"""
|
|
14
|
-
name = 'tab_control_test_spider'
|
|
15
|
-
|
|
16
|
-
custom_settings = {
|
|
17
|
-
'DOWNLOADER_TYPE': 'playwright',
|
|
18
|
-
'PLAYWRIGHT_BROWSER_TYPE': 'chromium',
|
|
19
|
-
'PLAYWRIGHT_HEADLESS': True,
|
|
20
|
-
'PLAYWRIGHT_SINGLE_BROWSER_MODE': True,
|
|
21
|
-
'PLAYWRIGHT_MAX_PAGES_PER_BROWSER': 3, # 限制最大页面数为3
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
def start_requests(self):
|
|
25
|
-
# 测试多个URL,验证标签页控制功能
|
|
26
|
-
urls = [
|
|
27
|
-
'https://httpbin.org/html', # 简单HTML页面
|
|
28
|
-
'https://httpbin.org/json', # JSON页面
|
|
29
|
-
'https://httpbin.org/xml', # XML页面
|
|
30
|
-
'https://httpbin.org/robots.txt', # 文本页面
|
|
31
|
-
'https://httpbin.org/headers', # 请求头页面
|
|
32
|
-
]
|
|
33
|
-
|
|
34
|
-
for url in urls:
|
|
35
|
-
yield Request(url=url, callback=self.parse)
|
|
36
|
-
|
|
37
|
-
def parse(self, response):
|
|
38
|
-
"""解析响应"""
|
|
39
|
-
print(f"成功下载页面: {response.url}")
|
|
40
|
-
print(f"响应状态码: {response.status_code}")
|
|
41
|
-
print(f"响应内容长度: {len(response.text)}")
|
|
42
|
-
yield {'url': response.url, 'status': response.status_code}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
class PaginationTestSpider(Spider):
|
|
46
|
-
"""翻页功能测试爬虫"""
|
|
47
|
-
name = 'pagination_test_spider'
|
|
48
|
-
|
|
49
|
-
custom_settings = {
|
|
50
|
-
'DOWNLOADER_TYPE': 'playwright',
|
|
51
|
-
'PLAYWRIGHT_BROWSER_TYPE': 'chromium',
|
|
52
|
-
'PLAYWRIGHT_HEADLESS': True,
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
def start_requests(self):
|
|
56
|
-
# 测试带有翻页操作的请求
|
|
57
|
-
request = Request(
|
|
58
|
-
url='https://httpbin.org/html',
|
|
59
|
-
callback=self.parse_with_pagination
|
|
60
|
-
).set_dynamic_loader(
|
|
61
|
-
True,
|
|
62
|
-
{
|
|
63
|
-
"pagination_actions": [
|
|
64
|
-
# 模拟鼠标滑动
|
|
65
|
-
{
|
|
66
|
-
"type": "scroll",
|
|
67
|
-
"params": {
|
|
68
|
-
"count": 2,
|
|
69
|
-
"distance": 300,
|
|
70
|
-
"delay": 500
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
]
|
|
74
|
-
}
|
|
75
|
-
)
|
|
76
|
-
yield request
|
|
77
|
-
|
|
78
|
-
def parse_with_pagination(self, response):
|
|
79
|
-
"""解析带翻页操作的响应"""
|
|
80
|
-
print(f"成功下载页面: {response.url}")
|
|
81
|
-
yield {'url': response.url, 'status': response.status_code}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
# 运行测试
|
|
85
|
-
async def run_tests():
|
|
86
|
-
"""运行测试"""
|
|
87
|
-
print("=== 动态加载功能测试 ===\n")
|
|
88
|
-
|
|
89
|
-
# 测试1: 标签页控制功能
|
|
90
|
-
print("1. 测试标签页控制功能:")
|
|
91
|
-
print(" 配置最大页面数为3,请求5个URL")
|
|
92
|
-
print(" 预期结果: 正常下载所有页面,但只创建3个标签页\n")
|
|
93
|
-
|
|
94
|
-
# 测试2: 翻页功能
|
|
95
|
-
print("2. 测试翻页功能:")
|
|
96
|
-
print(" 配置鼠标滑动翻页操作")
|
|
97
|
-
print(" 预期结果: 页面加载完成后执行滑动操作\n")
|
|
98
|
-
|
|
99
|
-
print("请运行以下命令来执行测试:")
|
|
100
|
-
print("crawlo crawl tab_control_test_spider")
|
|
101
|
-
print("crawlo crawl pagination_test_spider")
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
if __name__ == '__main__':
|
|
1
|
+
#!/usr/bin/python
|
|
2
|
+
# -*- coding: UTF-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
动态加载功能测试示例
|
|
5
|
+
==================
|
|
6
|
+
测试新添加的动态加载功能是否符合预期
|
|
7
|
+
"""
|
|
8
|
+
import asyncio
|
|
9
|
+
from crawlo import Spider, Request
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class TabControlTestSpider(Spider):
|
|
13
|
+
"""标签页控制测试爬虫"""
|
|
14
|
+
name = 'tab_control_test_spider'
|
|
15
|
+
|
|
16
|
+
custom_settings = {
|
|
17
|
+
'DOWNLOADER_TYPE': 'playwright',
|
|
18
|
+
'PLAYWRIGHT_BROWSER_TYPE': 'chromium',
|
|
19
|
+
'PLAYWRIGHT_HEADLESS': True,
|
|
20
|
+
'PLAYWRIGHT_SINGLE_BROWSER_MODE': True,
|
|
21
|
+
'PLAYWRIGHT_MAX_PAGES_PER_BROWSER': 3, # 限制最大页面数为3
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
def start_requests(self):
|
|
25
|
+
# 测试多个URL,验证标签页控制功能
|
|
26
|
+
urls = [
|
|
27
|
+
'https://httpbin.org/html', # 简单HTML页面
|
|
28
|
+
'https://httpbin.org/json', # JSON页面
|
|
29
|
+
'https://httpbin.org/xml', # XML页面
|
|
30
|
+
'https://httpbin.org/robots.txt', # 文本页面
|
|
31
|
+
'https://httpbin.org/headers', # 请求头页面
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
for url in urls:
|
|
35
|
+
yield Request(url=url, callback=self.parse)
|
|
36
|
+
|
|
37
|
+
def parse(self, response):
|
|
38
|
+
"""解析响应"""
|
|
39
|
+
print(f"成功下载页面: {response.url}")
|
|
40
|
+
print(f"响应状态码: {response.status_code}")
|
|
41
|
+
print(f"响应内容长度: {len(response.text)}")
|
|
42
|
+
yield {'url': response.url, 'status': response.status_code}
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class PaginationTestSpider(Spider):
|
|
46
|
+
"""翻页功能测试爬虫"""
|
|
47
|
+
name = 'pagination_test_spider'
|
|
48
|
+
|
|
49
|
+
custom_settings = {
|
|
50
|
+
'DOWNLOADER_TYPE': 'playwright',
|
|
51
|
+
'PLAYWRIGHT_BROWSER_TYPE': 'chromium',
|
|
52
|
+
'PLAYWRIGHT_HEADLESS': True,
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
def start_requests(self):
|
|
56
|
+
# 测试带有翻页操作的请求
|
|
57
|
+
request = Request(
|
|
58
|
+
url='https://httpbin.org/html',
|
|
59
|
+
callback=self.parse_with_pagination
|
|
60
|
+
).set_dynamic_loader(
|
|
61
|
+
True,
|
|
62
|
+
{
|
|
63
|
+
"pagination_actions": [
|
|
64
|
+
# 模拟鼠标滑动
|
|
65
|
+
{
|
|
66
|
+
"type": "scroll",
|
|
67
|
+
"params": {
|
|
68
|
+
"count": 2,
|
|
69
|
+
"distance": 300,
|
|
70
|
+
"delay": 500
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
}
|
|
75
|
+
)
|
|
76
|
+
yield request
|
|
77
|
+
|
|
78
|
+
def parse_with_pagination(self, response):
|
|
79
|
+
"""解析带翻页操作的响应"""
|
|
80
|
+
print(f"成功下载页面: {response.url}")
|
|
81
|
+
yield {'url': response.url, 'status': response.status_code}
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
# 运行测试
|
|
85
|
+
async def run_tests():
|
|
86
|
+
"""运行测试"""
|
|
87
|
+
print("=== 动态加载功能测试 ===\n")
|
|
88
|
+
|
|
89
|
+
# 测试1: 标签页控制功能
|
|
90
|
+
print("1. 测试标签页控制功能:")
|
|
91
|
+
print(" 配置最大页面数为3,请求5个URL")
|
|
92
|
+
print(" 预期结果: 正常下载所有页面,但只创建3个标签页\n")
|
|
93
|
+
|
|
94
|
+
# 测试2: 翻页功能
|
|
95
|
+
print("2. 测试翻页功能:")
|
|
96
|
+
print(" 配置鼠标滑动翻页操作")
|
|
97
|
+
print(" 预期结果: 页面加载完成后执行滑动操作\n")
|
|
98
|
+
|
|
99
|
+
print("请运行以下命令来执行测试:")
|
|
100
|
+
print("crawlo crawl tab_control_test_spider")
|
|
101
|
+
print("crawlo crawl pagination_test_spider")
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
if __name__ == '__main__':
|
|
105
105
|
asyncio.run(run_tests())
|
tests/env_config_example.py
CHANGED
|
@@ -1,134 +1,134 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
|
-
"""
|
|
4
|
-
环境变量配置工具使用示例
|
|
5
|
-
展示如何在 Crawlo 项目中正确使用环境变量配置工具
|
|
6
|
-
"""
|
|
7
|
-
import os
|
|
8
|
-
import sys
|
|
9
|
-
|
|
10
|
-
# 添加项目根目录到Python路径
|
|
11
|
-
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
|
|
12
|
-
|
|
13
|
-
from crawlo.utils.env_config import get_env_var, get_redis_config, get_runtime_config
|
|
14
|
-
from crawlo.settings.setting_manager import SettingManager
|
|
15
|
-
from crawlo.settings import default_settings
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
def example_basic_usage():
|
|
19
|
-
"""基本使用示例"""
|
|
20
|
-
print("=== 基本环境变量使用示例 ===")
|
|
21
|
-
|
|
22
|
-
# 获取字符串环境变量
|
|
23
|
-
project_name = get_env_var('PROJECT_NAME', 'my_crawler', str)
|
|
24
|
-
print(f"项目名称: {project_name}")
|
|
25
|
-
|
|
26
|
-
# 获取整数环境变量
|
|
27
|
-
concurrency = get_env_var('CONCURRENCY', 8, int)
|
|
28
|
-
print(f"并发数: {concurrency}")
|
|
29
|
-
|
|
30
|
-
# 获取布尔环境变量
|
|
31
|
-
debug_mode = get_env_var('DEBUG_MODE', False, bool)
|
|
32
|
-
print(f"调试模式: {debug_mode}")
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
def example_redis_config():
|
|
36
|
-
"""Redis配置示例"""
|
|
37
|
-
print("\n=== Redis配置示例 ===")
|
|
38
|
-
|
|
39
|
-
# 获取Redis配置
|
|
40
|
-
redis_config = get_redis_config()
|
|
41
|
-
print(f"Redis主机: {redis_config['REDIS_HOST']}")
|
|
42
|
-
print(f"Redis端口: {redis_config['REDIS_PORT']}")
|
|
43
|
-
print(f"Redis密码: {'*' * len(redis_config['REDIS_PASSWORD']) if redis_config['REDIS_PASSWORD'] else '无'}")
|
|
44
|
-
print(f"Redis数据库: {redis_config['REDIS_DB']}")
|
|
45
|
-
|
|
46
|
-
# 生成Redis URL
|
|
47
|
-
if redis_config['REDIS_PASSWORD']:
|
|
48
|
-
redis_url = f"redis://:{redis_config['REDIS_PASSWORD']}@{redis_config['REDIS_HOST']}:{redis_config['REDIS_PORT']}/{redis_config['REDIS_DB']}"
|
|
49
|
-
else:
|
|
50
|
-
redis_url = f"redis://{redis_config['REDIS_HOST']}:{redis_config['REDIS_PORT']}/{redis_config['REDIS_DB']}"
|
|
51
|
-
|
|
52
|
-
print(f"Redis URL: {redis_url}")
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
def example_runtime_config():
|
|
56
|
-
"""运行时配置示例"""
|
|
57
|
-
print("\n=== 运行时配置示例 ===")
|
|
58
|
-
|
|
59
|
-
# 获取运行时配置
|
|
60
|
-
runtime_config = get_runtime_config()
|
|
61
|
-
print(f"运行模式: {runtime_config['CRAWLO_MODE']}")
|
|
62
|
-
print(f"项目名称: {runtime_config['PROJECT_NAME']}")
|
|
63
|
-
print(f"并发数: {runtime_config['CONCURRENCY']}")
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
def example_settings_integration():
|
|
67
|
-
"""与Settings集成示例"""
|
|
68
|
-
print("\n=== 与Settings集成示例 ===")
|
|
69
|
-
|
|
70
|
-
# 创建设置管理器
|
|
71
|
-
settings = SettingManager()
|
|
72
|
-
|
|
73
|
-
# 更新Redis相关设置
|
|
74
|
-
redis_config = get_redis_config()
|
|
75
|
-
settings.set('REDIS_HOST', redis_config['REDIS_HOST'])
|
|
76
|
-
settings.set('REDIS_PORT', redis_config['REDIS_PORT'])
|
|
77
|
-
settings.set('REDIS_PASSWORD', redis_config['REDIS_PASSWORD'])
|
|
78
|
-
settings.set('REDIS_DB', redis_config['REDIS_DB'])
|
|
79
|
-
|
|
80
|
-
# 更新运行时设置
|
|
81
|
-
runtime_config = get_runtime_config()
|
|
82
|
-
settings.set('PROJECT_NAME', runtime_config['PROJECT_NAME'])
|
|
83
|
-
settings.set('RUN_MODE', runtime_config['CRAWLO_MODE'])
|
|
84
|
-
settings.set('CONCURRENCY', runtime_config['CONCURRENCY'])
|
|
85
|
-
|
|
86
|
-
# 显示一些关键设置
|
|
87
|
-
print(f"项目名称: {settings.get('PROJECT_NAME')}")
|
|
88
|
-
print(f"运行模式: {settings.get('RUN_MODE')}")
|
|
89
|
-
print(f"并发数: {settings.get_int('CONCURRENCY')}")
|
|
90
|
-
print(f"Redis主机: {settings.get('REDIS_HOST')}")
|
|
91
|
-
print(f"Redis端口: {settings.get_int('REDIS_PORT')}")
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
def example_env_setup():
|
|
95
|
-
"""环境变量设置示例"""
|
|
96
|
-
print("\n=== 环境变量设置示例 ===")
|
|
97
|
-
print("在命令行中设置环境变量的示例:")
|
|
98
|
-
print(" Windows (PowerShell):")
|
|
99
|
-
print(" $env:PROJECT_NAME = \"my_distributed_crawler\"")
|
|
100
|
-
print(" $env:REDIS_HOST = \"redis.example.com\"")
|
|
101
|
-
print(" $env:REDIS_PORT = \"6380\"")
|
|
102
|
-
print(" $env:CONCURRENCY = \"16\"")
|
|
103
|
-
print(" $env:CRAWLO_MODE = \"distributed\"")
|
|
104
|
-
print()
|
|
105
|
-
print(" Linux/macOS:")
|
|
106
|
-
print(" export PROJECT_NAME=\"my_distributed_crawler\"")
|
|
107
|
-
print(" export REDIS_HOST=\"redis.example.com\"")
|
|
108
|
-
print(" export REDIS_PORT=\"6380\"")
|
|
109
|
-
print(" export CONCURRENCY=\"16\"")
|
|
110
|
-
print(" export CRAWLO_MODE=\"distributed\"")
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
if __name__ == '__main__':
|
|
114
|
-
# 设置一些测试环境变量
|
|
115
|
-
os.environ['PROJECT_NAME'] = 'test_crawler'
|
|
116
|
-
os.environ['CONCURRENCY'] = '12'
|
|
117
|
-
os.environ['DEBUG_MODE'] = 'true'
|
|
118
|
-
os.environ['REDIS_HOST'] = 'redis.test.com'
|
|
119
|
-
os.environ['REDIS_PORT'] = '6380'
|
|
120
|
-
os.environ['REDIS_PASSWORD'] = 'test_password'
|
|
121
|
-
os.environ['CRAWLO_MODE'] = 'distributed'
|
|
122
|
-
|
|
123
|
-
# 运行示例
|
|
124
|
-
example_basic_usage()
|
|
125
|
-
example_redis_config()
|
|
126
|
-
example_runtime_config()
|
|
127
|
-
example_settings_integration()
|
|
128
|
-
example_env_setup()
|
|
129
|
-
|
|
130
|
-
# 清理测试环境变量
|
|
131
|
-
for var in ['PROJECT_NAME', 'CONCURRENCY', 'DEBUG_MODE', 'REDIS_HOST',
|
|
132
|
-
'REDIS_PORT', 'REDIS_PASSWORD', 'CRAWLO_MODE']:
|
|
133
|
-
if var in os.environ:
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
环境变量配置工具使用示例
|
|
5
|
+
展示如何在 Crawlo 项目中正确使用环境变量配置工具
|
|
6
|
+
"""
|
|
7
|
+
import os
|
|
8
|
+
import sys
|
|
9
|
+
|
|
10
|
+
# 添加项目根目录到Python路径
|
|
11
|
+
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
|
|
12
|
+
|
|
13
|
+
from crawlo.utils.env_config import get_env_var, get_redis_config, get_runtime_config
|
|
14
|
+
from crawlo.settings.setting_manager import SettingManager
|
|
15
|
+
from crawlo.settings import default_settings
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def example_basic_usage():
|
|
19
|
+
"""基本使用示例"""
|
|
20
|
+
print("=== 基本环境变量使用示例 ===")
|
|
21
|
+
|
|
22
|
+
# 获取字符串环境变量
|
|
23
|
+
project_name = get_env_var('PROJECT_NAME', 'my_crawler', str)
|
|
24
|
+
print(f"项目名称: {project_name}")
|
|
25
|
+
|
|
26
|
+
# 获取整数环境变量
|
|
27
|
+
concurrency = get_env_var('CONCURRENCY', 8, int)
|
|
28
|
+
print(f"并发数: {concurrency}")
|
|
29
|
+
|
|
30
|
+
# 获取布尔环境变量
|
|
31
|
+
debug_mode = get_env_var('DEBUG_MODE', False, bool)
|
|
32
|
+
print(f"调试模式: {debug_mode}")
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def example_redis_config():
|
|
36
|
+
"""Redis配置示例"""
|
|
37
|
+
print("\n=== Redis配置示例 ===")
|
|
38
|
+
|
|
39
|
+
# 获取Redis配置
|
|
40
|
+
redis_config = get_redis_config()
|
|
41
|
+
print(f"Redis主机: {redis_config['REDIS_HOST']}")
|
|
42
|
+
print(f"Redis端口: {redis_config['REDIS_PORT']}")
|
|
43
|
+
print(f"Redis密码: {'*' * len(redis_config['REDIS_PASSWORD']) if redis_config['REDIS_PASSWORD'] else '无'}")
|
|
44
|
+
print(f"Redis数据库: {redis_config['REDIS_DB']}")
|
|
45
|
+
|
|
46
|
+
# 生成Redis URL
|
|
47
|
+
if redis_config['REDIS_PASSWORD']:
|
|
48
|
+
redis_url = f"redis://:{redis_config['REDIS_PASSWORD']}@{redis_config['REDIS_HOST']}:{redis_config['REDIS_PORT']}/{redis_config['REDIS_DB']}"
|
|
49
|
+
else:
|
|
50
|
+
redis_url = f"redis://{redis_config['REDIS_HOST']}:{redis_config['REDIS_PORT']}/{redis_config['REDIS_DB']}"
|
|
51
|
+
|
|
52
|
+
print(f"Redis URL: {redis_url}")
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def example_runtime_config():
|
|
56
|
+
"""运行时配置示例"""
|
|
57
|
+
print("\n=== 运行时配置示例 ===")
|
|
58
|
+
|
|
59
|
+
# 获取运行时配置
|
|
60
|
+
runtime_config = get_runtime_config()
|
|
61
|
+
print(f"运行模式: {runtime_config['CRAWLO_MODE']}")
|
|
62
|
+
print(f"项目名称: {runtime_config['PROJECT_NAME']}")
|
|
63
|
+
print(f"并发数: {runtime_config['CONCURRENCY']}")
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def example_settings_integration():
|
|
67
|
+
"""与Settings集成示例"""
|
|
68
|
+
print("\n=== 与Settings集成示例 ===")
|
|
69
|
+
|
|
70
|
+
# 创建设置管理器
|
|
71
|
+
settings = SettingManager()
|
|
72
|
+
|
|
73
|
+
# 更新Redis相关设置
|
|
74
|
+
redis_config = get_redis_config()
|
|
75
|
+
settings.set('REDIS_HOST', redis_config['REDIS_HOST'])
|
|
76
|
+
settings.set('REDIS_PORT', redis_config['REDIS_PORT'])
|
|
77
|
+
settings.set('REDIS_PASSWORD', redis_config['REDIS_PASSWORD'])
|
|
78
|
+
settings.set('REDIS_DB', redis_config['REDIS_DB'])
|
|
79
|
+
|
|
80
|
+
# 更新运行时设置
|
|
81
|
+
runtime_config = get_runtime_config()
|
|
82
|
+
settings.set('PROJECT_NAME', runtime_config['PROJECT_NAME'])
|
|
83
|
+
settings.set('RUN_MODE', runtime_config['CRAWLO_MODE'])
|
|
84
|
+
settings.set('CONCURRENCY', runtime_config['CONCURRENCY'])
|
|
85
|
+
|
|
86
|
+
# 显示一些关键设置
|
|
87
|
+
print(f"项目名称: {settings.get('PROJECT_NAME')}")
|
|
88
|
+
print(f"运行模式: {settings.get('RUN_MODE')}")
|
|
89
|
+
print(f"并发数: {settings.get_int('CONCURRENCY')}")
|
|
90
|
+
print(f"Redis主机: {settings.get('REDIS_HOST')}")
|
|
91
|
+
print(f"Redis端口: {settings.get_int('REDIS_PORT')}")
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def example_env_setup():
|
|
95
|
+
"""环境变量设置示例"""
|
|
96
|
+
print("\n=== 环境变量设置示例 ===")
|
|
97
|
+
print("在命令行中设置环境变量的示例:")
|
|
98
|
+
print(" Windows (PowerShell):")
|
|
99
|
+
print(" $env:PROJECT_NAME = \"my_distributed_crawler\"")
|
|
100
|
+
print(" $env:REDIS_HOST = \"redis.example.com\"")
|
|
101
|
+
print(" $env:REDIS_PORT = \"6380\"")
|
|
102
|
+
print(" $env:CONCURRENCY = \"16\"")
|
|
103
|
+
print(" $env:CRAWLO_MODE = \"distributed\"")
|
|
104
|
+
print()
|
|
105
|
+
print(" Linux/macOS:")
|
|
106
|
+
print(" export PROJECT_NAME=\"my_distributed_crawler\"")
|
|
107
|
+
print(" export REDIS_HOST=\"redis.example.com\"")
|
|
108
|
+
print(" export REDIS_PORT=\"6380\"")
|
|
109
|
+
print(" export CONCURRENCY=\"16\"")
|
|
110
|
+
print(" export CRAWLO_MODE=\"distributed\"")
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
if __name__ == '__main__':
|
|
114
|
+
# 设置一些测试环境变量
|
|
115
|
+
os.environ['PROJECT_NAME'] = 'test_crawler'
|
|
116
|
+
os.environ['CONCURRENCY'] = '12'
|
|
117
|
+
os.environ['DEBUG_MODE'] = 'true'
|
|
118
|
+
os.environ['REDIS_HOST'] = 'redis.test.com'
|
|
119
|
+
os.environ['REDIS_PORT'] = '6380'
|
|
120
|
+
os.environ['REDIS_PASSWORD'] = 'test_password'
|
|
121
|
+
os.environ['CRAWLO_MODE'] = 'distributed'
|
|
122
|
+
|
|
123
|
+
# 运行示例
|
|
124
|
+
example_basic_usage()
|
|
125
|
+
example_redis_config()
|
|
126
|
+
example_runtime_config()
|
|
127
|
+
example_settings_integration()
|
|
128
|
+
example_env_setup()
|
|
129
|
+
|
|
130
|
+
# 清理测试环境变量
|
|
131
|
+
for var in ['PROJECT_NAME', 'CONCURRENCY', 'DEBUG_MODE', 'REDIS_HOST',
|
|
132
|
+
'REDIS_PORT', 'REDIS_PASSWORD', 'CRAWLO_MODE']:
|
|
133
|
+
if var in os.environ:
|
|
134
134
|
del os.environ[var]
|