crawlo 1.2.9__py3-none-any.whl → 1.3.1__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/utils/log.py CHANGED
@@ -8,28 +8,20 @@ from logging import (
8
8
  INFO,
9
9
  getLevelName,
10
10
  )
11
- # 导入日志轮转处理器
12
- from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler
13
11
 
14
12
  LOG_FORMAT = '%(asctime)s - [%(name)s] - %(levelname)s: %(message)s'
15
13
 
16
14
 
17
15
  class LoggerManager:
16
+ """日志管理器,提供统一的日志配置和获取接口"""
18
17
  logger_cache = {}
19
18
  _default_filename = None
20
19
  _default_level = DEBUG # 设置为最低级别,由handler控制实际输出
21
- _default_file_level = INFO
22
- _default_console_level = INFO
20
+ _default_file_level = DEBUG # 默认为DEBUG级别,确保所有INFO级别日志都能写入文件
21
+ _default_console_level = DEBUG # 默认为DEBUG级别
23
22
  _default_log_format = LOG_FORMAT
24
23
  _default_encoding = 'utf-8'
25
- # 添加日志轮转相关默认配置
26
- _default_log_max_bytes = 10 * 1024 * 1024 # 10MB
27
- _default_log_backup_count = 5
28
- _default_log_when = 'midnight'
29
- _default_log_interval = 1
30
- _default_log_use_rotation = False
31
- _default_log_rotation_type = 'size' # 'size' or 'time'
32
- _default_log_rotation_suffix = None # 轮转文件后缀格式
24
+ _configured = False # 标记是否已配置
33
25
 
34
26
  @classmethod
35
27
  def _to_level(cls, level):
@@ -67,41 +59,26 @@ class LoggerManager:
67
59
  get_val = settings.get if hasattr(settings, 'get') else (lambda k, d=None: kwargs.get(k, d))
68
60
 
69
61
  filename = get_val('LOG_FILE')
70
- level = get_val('LOG_LEVEL', 'DEBUG') # 默认为DEBUG级别
71
- file_level = get_val('LOG_FILE_LEVEL', 'INFO')
72
- console_level = get_val('LOG_CONSOLE_LEVEL', 'INFO') # 保留LOG_CONSOLE_LEVEL配置
62
+ level = get_val('LOG_LEVEL', 'INFO') # 默认为INFO级别
63
+ file_level = get_val('LOG_FILE_LEVEL', level) # 默认继承LOG_LEVEL的值
64
+ # 根据项目规范,已完全移除LOG_CONSOLE_LEVEL支持,统一使用LOG_LEVEL控制控制台和文件的日志输出级别
73
65
  log_format = get_val('LOG_FORMAT', LOG_FORMAT)
74
66
  encoding = get_val('LOG_ENCODING', 'utf-8')
75
- # 获取日志轮转配置
76
- use_rotation = get_val('LOG_USE_ROTATION', False)
77
- rotation_type = get_val('LOG_ROTATION_TYPE', 'size')
78
- max_bytes = get_val('LOG_MAX_BYTES', cls._default_log_max_bytes)
79
- backup_count = get_val('LOG_BACKUP_COUNT', cls._default_log_backup_count)
80
- when = get_val('LOG_WHEN', cls._default_log_when)
81
- interval = get_val('LOG_INTERVAL', cls._default_log_interval)
82
- rotation_suffix = get_val('LOG_ROTATION_SUFFIX', cls._default_log_rotation_suffix) # 轮转文件后缀
83
67
 
84
68
  cls._default_filename = filename
85
69
  cls._default_level = cls._to_level(level)
86
70
  cls._default_file_level = cls._to_level(file_level)
87
- cls._default_console_level = cls._to_level(console_level)
71
+ # 控制台日志级别直接使用LOG_LEVEL的值,不再支持LOG_CONSOLE_LEVEL
72
+ cls._default_console_level = cls._default_level
88
73
  cls._default_log_format = log_format
89
74
  cls._default_encoding = encoding
90
- # 设置日志轮转配置
91
- cls._default_log_use_rotation = use_rotation
92
- cls._default_log_rotation_type = rotation_type
93
- cls._default_log_max_bytes = max_bytes
94
- cls._default_log_backup_count = backup_count
95
- cls._default_log_when = when
96
- cls._default_log_interval = interval
97
- cls._default_log_rotation_suffix = rotation_suffix
98
-
99
- # 移除对根日志记录器级别的修改,避免副作用
75
+
76
+ cls._configured = True
100
77
 
101
78
  @classmethod
102
79
  def get_logger(cls, name='default', level=None, filename=None):
103
80
  """
104
- 简化接口,只暴露必要参数
81
+ 获取logger实例
105
82
  """
106
83
  # 确定最终参数
107
84
  # 如果传入了level参数,则使用它,否则使用默认级别
@@ -110,7 +87,7 @@ class LoggerManager:
110
87
  else:
111
88
  # Logger级别设置为DEBUG(最低级别),由handler控制实际输出
112
89
  final_level = DEBUG
113
-
90
+
114
91
  final_filename = filename if filename is not None else cls._default_filename
115
92
 
116
93
  # 安全的字符串化 key,避免任何 unhashable 类型
@@ -146,32 +123,9 @@ class LoggerManager:
146
123
  if log_dir and not os.path.exists(log_dir):
147
124
  os.makedirs(log_dir, exist_ok=True)
148
125
 
149
- # 检查是否启用日志轮转
150
- if cls._default_log_use_rotation:
151
- if cls._default_log_rotation_type == 'size':
152
- # 使用大小轮转
153
- fh = RotatingFileHandler(
154
- final_filename,
155
- maxBytes=cls._default_log_max_bytes,
156
- backupCount=cls._default_log_backup_count,
157
- encoding=cls._default_encoding
158
- )
159
- else:
160
- # 使用时间轮转
161
- fh = TimedRotatingFileHandler(
162
- final_filename,
163
- when=cls._default_log_when,
164
- interval=cls._default_log_interval,
165
- backupCount=cls._default_log_backup_count,
166
- encoding=cls._default_encoding
167
- )
168
- # 如果提供了自定义后缀格式,则设置
169
- if cls._default_log_rotation_suffix:
170
- fh.suffix = cls._default_log_rotation_suffix
171
- else:
172
- # 使用普通文件处理器(默认行为,会追加到文件)
173
- fh = FileHandler(final_filename, mode='a', encoding=cls._default_encoding)
174
-
126
+ # 使用普通文件处理器(移除日志轮转功能)
127
+ fh = FileHandler(final_filename, mode='a', encoding=cls._default_encoding)
128
+
175
129
  fh.setFormatter(formatter)
176
130
  fh.setLevel(cls._default_file_level)
177
131
  _logger.addHandler(fh)
@@ -183,6 +137,11 @@ class LoggerManager:
183
137
  cls.logger_cache[key] = _logger
184
138
  return _logger
185
139
 
140
+ @classmethod
141
+ def is_configured(cls):
142
+ """检查日志系统是否已配置"""
143
+ return cls._configured
144
+
186
145
 
187
146
  # 全局快捷函数
188
147
  get_logger = LoggerManager.get_logger
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crawlo
3
- Version: 1.2.9
3
+ Version: 1.3.1
4
4
  Summary: Crawlo 是一款基于异步IO的高性能Python爬虫框架,支持分布式抓取。
5
5
  Home-page: https://github.com/crawl-coder/Crawlo.git
6
6
  Author: crawl-coder
@@ -56,7 +56,7 @@ Requires-Dist: selenium>=3.141.0; extra == "all"
56
56
 
57
57
  <p align="center">
58
58
  <a href="https://www.python.org/downloads/">
59
- <img src="https://img.shields.io/badge/python-3.8%2B-blue" alt="Python Version">
59
+ <img src="https://img.shields.io/badge/python-%3C%3D3.12-blue" alt="Python Version">
60
60
  </a>
61
61
  <a href="LICENSE">
62
62
  <img src="https://img.shields.io/badge/license-MIT-green" alt="License">
@@ -429,13 +429,22 @@ Crawlo框架的中间件、管道和扩展组件采用模块化设计,框架
429
429
 
430
430
  用户可以通过`CUSTOM_MIDDLEWARES`配置自定义中间件:
431
431
 
432
- ```python
432
+ ``python
433
433
  # settings.py
434
434
  CUSTOM_MIDDLEWARES = [
435
435
  'myproject.middlewares.CustomMiddleware',
436
436
  ]
437
437
  ```
438
438
 
439
+ > **注意**:DefaultHeaderMiddleware 和 OffsiteMiddleware 需要相应的配置才能启用:
440
+ > - DefaultHeaderMiddleware 需要配置 `DEFAULT_REQUEST_HEADERS` 或 `USER_AGENT` 参数
441
+ > - OffsiteMiddleware 需要配置 `ALLOWED_DOMAINS` 参数
442
+ >
443
+ > 如果未配置相应参数,这些中间件会因为 NotConfiguredError 而被禁用。
444
+
445
+ > **注意**:中间件的顺序很重要。SimpleProxyMiddleware 通常放在列表末尾,
446
+ > 这样可以在所有默认中间件处理后再应用代理设置。
447
+
439
448
  #### 管道配置
440
449
 
441
450
  框架默认加载以下管道:
@@ -930,7 +939,7 @@ Crawlo框架内置了多种中间件,其中代理中间件有两种实现:
930
939
 
931
940
  如果需要使用简化版代理中间件,可以在配置文件中替换默认的代理中间件:
932
941
 
933
- ```python
942
+ ``python
934
943
  # settings.py
935
944
  MIDDLEWARES = [
936
945
  # 注释掉复杂版代理中间件
@@ -1,13 +1,13 @@
1
1
  crawlo/__init__.py,sha256=qZzTmb7hw5h_qcP2EYGUZcoSScxlKZFJ76CjSeS7UfA,1381
2
- crawlo/__version__.py,sha256=S2h29KjM2QfA587KjqKjzd2pK0GLkBmHIq8WDOutUiI,21
2
+ crawlo/__version__.py,sha256=P2DFKJQEJRlJhF0IW0Lwt4G4uMYyJJ5ymhv-XrCcPGo,22
3
3
  crawlo/cli.py,sha256=OXprmcTUbFK02ptw_Gq8Gk4-ZCU-WEMJgzU1ztgP6Bk,2327
4
4
  crawlo/config.py,sha256=dNoNyTkXLe2msQ7bZx3YTQItk1m49nIg5-g89FQDNwE,9486
5
5
  crawlo/config_validator.py,sha256=gsiLqf5swWd9ISDvoLqCdG7iSXr-ZdBPD4iT6ug1ua4,11239
6
- crawlo/crawler.py,sha256=cXvzTF3W6LeZNll4hbMLK-E1xDpZL5M9fgtd_8Gk6eI,39863
6
+ crawlo/crawler.py,sha256=Fiu9O_eFHKCfzgzFe0O9gpzWGyneY-imI8-9O4hiWqU,42608
7
7
  crawlo/event.py,sha256=7-y6HNv_EIJSYQNzsj0mVK-Gg4ON3wdQeMdQjfFJPlw,313
8
8
  crawlo/exceptions.py,sha256=sMay0wnWLfc_FXWslqxm60qz6b66LXs3EdN_w8ygE9k,1166
9
- crawlo/mode_manager.py,sha256=D8LOgqkqN4yglCKtXw56mq41r30FvxCUb5JOitSTp_U,7502
10
- crawlo/project.py,sha256=vHqDrGFgRThzFuF2RxDtSHxPerruR3liwXuGC3cVda8,10796
9
+ crawlo/mode_manager.py,sha256=IN3CsWW1pzKnzHxvULxJTTx3Vw2kxJilfeLuDWfxm4Q,4890
10
+ crawlo/project.py,sha256=swSTcan4Ky7sYfCatpNLKsVxztmPkIVwjdo3u6dgcpI,11128
11
11
  crawlo/stats_collector.py,sha256=NkO09CB-220qz5rxFcD_dedGfr2VPFrDo4hya0Zh8Qc,1577
12
12
  crawlo/subscriber.py,sha256=D3hzE7Pc_zJjc-zR7lct5pt32bz6LsDYeC8uHlS4Hso,4986
13
13
  crawlo/task_manager.py,sha256=19InAxS9oJ9EMj20Aw2urN-v6BeC22dkgPuW-B9-4UI,819
@@ -16,12 +16,12 @@ crawlo/commands/check.py,sha256=7pD43s97DD-fSLO9OEOuNcNr7o-2g94rJULL8fUzdaI,2260
16
16
  crawlo/commands/genspider.py,sha256=HhtvBLkIuhYtJUzom6PquItiC22vU9LNpOkjDUiqdM4,4937
17
17
  crawlo/commands/help.py,sha256=gwfHibRpdYDmZO6waUMOEn8SMJ_ubdjL-prD5fiuVY8,4973
18
18
  crawlo/commands/list.py,sha256=BqlPjBa5FLotjAlyZ3-nGmXg5cWcCNbHi8U5znb2_D8,5722
19
- crawlo/commands/run.py,sha256=b_HxEmaze0jpPNIrPbm5lyPYZ20--eUVKJZpXoATf0M,12088
19
+ crawlo/commands/run.py,sha256=KcJ4h4D7lavB6qQDpYMrbgJMgY5vCSLHaLckos5EUNY,11793
20
20
  crawlo/commands/startproject.py,sha256=aqKRJarKqTf5XjJnGXwjRpp0uYF16LreFbwwQLGpK-0,16070
21
21
  crawlo/commands/stats.py,sha256=8wTubR1RQ1JPTlpOKArcGcQ39bM-0cuH27lDpndnwPQ,6014
22
- crawlo/commands/utils.py,sha256=pXiFzwVIVXdSPO2Fty_u19P1lsE8HmuE8gTMamKZZUs,5047
22
+ crawlo/commands/utils.py,sha256=Psfu2tKrmDloMq0WnfXLaxx0lJFitMZ-FWS3HAIrziQ,5382
23
23
  crawlo/core/__init__.py,sha256=PnFyJdVNHBoPmV1sW0AHQXijeoSTQ8cMYrbNM1JK8kA,41
24
- crawlo/core/engine.py,sha256=NIWbfRL_Lzjl6yYQ6LSfRJmDHBxjtk6x3nOWrnzaHME,14569
24
+ crawlo/core/engine.py,sha256=Hy0K_g9My6aQ3CPkxAcCiPsumdwh4O8qRhmFlNoErd4,14496
25
25
  crawlo/core/processor.py,sha256=qmCqAeqhwYu-UE86evYesaGt9qpuSIfH-ZIZKcXFCZc,1140
26
26
  crawlo/core/scheduler.py,sha256=D-YzXVvnP6DEkovmz9hThhzIe2UgRrQLNt9pJCPEPwY,12593
27
27
  crawlo/data/__init__.py,sha256=8MgDxcMhx-emFARcLAw_ODOZNz0neYBcx7kEbzothd8,116
@@ -37,7 +37,7 @@ crawlo/extension/__init__.py,sha256=FbOwJ4jh60xCbSh7P9CUGJsGAC-VH4MyOtCftRMlxbk,
37
37
  crawlo/extension/health_check.py,sha256=0GveZgUtFwjYEKlm3qbwIvCmb4FR0qrIKc8cEF1yQV8,5516
38
38
  crawlo/extension/log_interval.py,sha256=VCIeNqXcWDnxj4m6l77cjqgRzV8LfsPMb22X0Xc1Vwc,2417
39
39
  crawlo/extension/log_stats.py,sha256=vrChs3bj_Dvay3kxxkBOp4-w0K-IG-2XZ0PoSUahTPs,2908
40
- crawlo/extension/logging_extension.py,sha256=ET6VAu1J2qNMz4NnG1G3zQLRhbsvV7l6xRIuQLE6DaE,1626
40
+ crawlo/extension/logging_extension.py,sha256=RfL1wI4nz-1Xtg420Ktp7RXnOPnZSHwO0Zpg1w4fO4M,1726
41
41
  crawlo/extension/memory_monitor.py,sha256=4aszl3C0GMQbqFhGZjZq5iQuXQR1sOz06VHjjEHgkyE,4290
42
42
  crawlo/extension/performance_profiler.py,sha256=EPiNuXuPPDU0Jtgy8arYHpr_8ASK13cCI2BytdJnu_I,4899
43
43
  crawlo/extension/request_recorder.py,sha256=RC23yzXClnVv9j2ljQvjBkUfWznfnDHsrQejKhE9y5E,4074
@@ -51,8 +51,8 @@ crawlo/items/items.py,sha256=e-3nXI9ckD64vcDxxQiAU6ufbtJMs09gbZQcYjxgwHY,3374
51
51
  crawlo/middleware/__init__.py,sha256=ldaGFNbiJnK9Fx12Vdf9fDNfzXxoETtShp5r-vodtw0,549
52
52
  crawlo/middleware/default_header.py,sha256=wQ7BrUHd-hRosFoKsReV9hwNNr_jwK6V0ZfxL6MOGrk,5032
53
53
  crawlo/middleware/download_delay.py,sha256=zt9R5g2HWErWA_MAOnGcw_D8l6HD769Kyaw-Hv-vcTc,3438
54
- crawlo/middleware/middleware_manager.py,sha256=_JnJ50u3u4zFKkNZDae8M8FHcK-V2LkbcX7DkBdtJ2M,6279
55
- crawlo/middleware/offsite.py,sha256=b3BMwNKGR41YGJGHt1S0H7yXujEkztVvonUQGO05hoM,4026
54
+ crawlo/middleware/middleware_manager.py,sha256=9Sj9rrWK6R9NZq9eT38sWRGuBKLKfjSgEAxu-5NCWgU,6278
55
+ crawlo/middleware/offsite.py,sha256=cR0nVAygxAGbkmyI8yqiRtrZWTRLWddUiToMYGmhrfs,4084
56
56
  crawlo/middleware/proxy.py,sha256=NquB6tqHAgHs3-2_1_5220kJYfjNG5JyHRJyo_2j4wo,15636
57
57
  crawlo/middleware/request_ignore.py,sha256=xcyZ1c7r_HhbzR3r9pfjsLGW7L7FBVeYvlNt8cpP2wY,2577
58
58
  crawlo/middleware/response_code.py,sha256=-Aa9Mm9nJN-WdddN7iTanJRMA83_LYYgSEz3XLQGvMo,4934
@@ -70,16 +70,16 @@ crawlo/pipelines/database_dedup_pipeline.py,sha256=Ao_5jvVPl5QikxXhPeIrcB7_3tinR
70
70
  crawlo/pipelines/json_pipeline.py,sha256=vlu1nqbD2mtqtExt9cL5nibx1CwJM1RNqd4WGjZRHAY,8367
71
71
  crawlo/pipelines/memory_dedup_pipeline.py,sha256=oIksbIrmSw9s9jMh6JJMfVbv6hzseVMV_g9S8UHQUP4,3837
72
72
  crawlo/pipelines/mongo_pipeline.py,sha256=k7gNqAO-g2MtIfArphC6z5ZzkKVRkBKcv-2ImziPFA0,5706
73
- crawlo/pipelines/mysql_pipeline.py,sha256=G2DMhdh0ihBBolIul4YVTDz2JbrZGJauDtWF-gqRW0w,13473
74
- crawlo/pipelines/pipeline_manager.py,sha256=DuIRl6FYbrKKUCrtSHnq4pnRImpZPYtg1YRcgUd1xTk,2425
73
+ crawlo/pipelines/mysql_pipeline.py,sha256=CKll3rNFXc0-BGQ_0A6QOSm2-ymHtdjdybX6bSB8i2g,13500
74
+ crawlo/pipelines/pipeline_manager.py,sha256=R4zXYaMUseZsv5d7vbsNPFuXGjO_KWyDve0bHpqsL7Y,3079
75
75
  crawlo/pipelines/redis_dedup_pipeline.py,sha256=POYRiWAOp1pqDW9iTPJ8h3VcpLALeLrpw74MvJJqPiM,6342
76
76
  crawlo/queue/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
77
  crawlo/queue/pqueue.py,sha256=yzF900ko2RReVNZtfk_VV3PzSXEUALI6SHf97geuu6s,1058
78
78
  crawlo/queue/queue_manager.py,sha256=XqS_oVbNQJWdtokOuDDPK-FzMrVdnZ3UKp1MF_DMJww,14941
79
79
  crawlo/queue/redis_priority_queue.py,sha256=k1OChSMRovSMkbbJ9388axfhpYeMevuJTe-3N1oYhbA,13126
80
80
  crawlo/settings/__init__.py,sha256=xsukVKn_h2Hopm1Nj-bXkhbfyS62QTTvJi7fhZUwR9M,123
81
- crawlo/settings/default_settings.py,sha256=98URrj6QBrx_pmJ1yvK-MSAW8VrZ-pl0FfiZEHV0ZnI,9183
82
- crawlo/settings/setting_manager.py,sha256=55iJJambnFliZxwhNd7BtlgCV6eviuPRBrrIgyrmZgw,5659
81
+ crawlo/settings/default_settings.py,sha256=VKaCb8JnHx_B-Zi3hN6Mt0QIdv0YRhFlhVEZ2fhx84o,9193
82
+ crawlo/settings/setting_manager.py,sha256=4uuMpGVYzxjmQjvlGqfZ8hDaoSh34OAoL0LCATsMCkI,7512
83
83
  crawlo/spider/__init__.py,sha256=ZnSAL9PXLZSIH-Jdv-P6RuWmQUdukr8KPLQK6SXZZaU,20435
84
84
  crawlo/templates/crawlo.cfg.tmpl,sha256=9BAmwEibS5Tvy6HIcGXPb0BGeuesmibebmTW0iAEkmo,230
85
85
  crawlo/templates/run.py.tmpl,sha256=v_g-LQMYJ6pC8TZgyWj0yB2yTTKrwy9lEJufAYCXyxY,1228
@@ -117,7 +117,7 @@ crawlo/utils/error_handler.py,sha256=q6NqHxjYrKdswfmhshMYMmfBIr0M2YWPYxts4ScHl4Y
117
117
  crawlo/utils/func_tools.py,sha256=WUZEGpWMuDDX7g-QySM7iaiC74erW2SSkZoUvDw1NjM,2369
118
118
  crawlo/utils/large_scale_config.py,sha256=j7wQ5ty7pQlBRygw2vhRJ7OI19RYBZKPfYMP3WeF2WI,8154
119
119
  crawlo/utils/large_scale_helper.py,sha256=Kxdy3WMuqjzQTyCc6z4xEYxXDi4xnYKJzsVwaBYZrrg,12108
120
- crawlo/utils/log.py,sha256=AcRx6_9U6fY-6GEZP77Il2o3FZZm5Cx0MFubIK9R3oI,7501
120
+ crawlo/utils/log.py,sha256=vAMACdX8N3kTIRegmKDE1oVImESufeGEskoRmNQQkJo,5281
121
121
  crawlo/utils/performance_monitor.py,sha256=Q9xxuXBIfFoig_U-FQPOUuPAh1axO3MzYgpielDyku0,9547
122
122
  crawlo/utils/queue_helper.py,sha256=xpUUTOqlU1xz2Pb9NKAVGo3AfAO-7Xvx8Lm1q65Dgck,4743
123
123
  crawlo/utils/redis_connection_pool.py,sha256=amGjhaKpodMrw9X56qxZ6f3OTZhjrI89sSVGqgwAQGU,11050
@@ -212,8 +212,8 @@ tests/test_tools.py,sha256=9t9FXZ61MfdB70nck9NYzCq97yd3SLVlLiMybEAlClk,5345
212
212
  tests/test_user_agents.py,sha256=rUotyuE2iJDi2LQBrUh980U-dAMTs4ARPMJxICOoQFY,3231
213
213
  tests/tools_example.py,sha256=MtIypR-OFiWwi-skurwmq4fM0cGTt-GUX4hSekYs7BY,7739
214
214
  tests/verify_distributed.py,sha256=krnYYA5Qx9xXDMWc9YF5DxPSplGvawDg2n0l-3CAqoM,3928
215
- crawlo-1.2.9.dist-info/METADATA,sha256=wyjBzrx9hUZzlt0r1JPu33ouyrm_iJtphQAi2THb7LA,26298
216
- crawlo-1.2.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
217
- crawlo-1.2.9.dist-info/entry_points.txt,sha256=5HoVoTSPxI8SCa5B7pQYxLSrkOdiunyO9tqNsLMv52g,43
218
- crawlo-1.2.9.dist-info/top_level.txt,sha256=keG_67pbZ_wZL2dmDRA9RMaNHTaV_x_oxZ9DKNgwvR0,22
219
- crawlo-1.2.9.dist-info/RECORD,,
215
+ crawlo-1.3.1.dist-info/METADATA,sha256=6m0OV78Iso8DwQFiIB0_mWkYSDymuhjw69F9aVKwtCo,26813
216
+ crawlo-1.3.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
217
+ crawlo-1.3.1.dist-info/entry_points.txt,sha256=5HoVoTSPxI8SCa5B7pQYxLSrkOdiunyO9tqNsLMv52g,43
218
+ crawlo-1.3.1.dist-info/top_level.txt,sha256=keG_67pbZ_wZL2dmDRA9RMaNHTaV_x_oxZ9DKNgwvR0,22
219
+ crawlo-1.3.1.dist-info/RECORD,,
File without changes