🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scrapling_dev
This report summarizes scanner evidence for D4Vinci/Scrapling, a Python project with 86,680 GitHub stars. SynthScan examined 50,596 lines of code across 226 source files, recording 1075 pattern matches distributed across 15 syntactic categories. The legacy adjusted pattern signal is 25.3 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 824 finding(s).
Are imports declared and package/API names verified? 106 finding(s).
Are wrappers, guards, and repeated structures necessary? 918 finding(s).
Which changes need focused human review? 1075 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1075 distinct pattern matches across 15 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/core/test_storage_core.py | 19 | def test_returns_default_when_url_is_none(self): | CODE |
| LOW⚡ | tests/core/test_storage_core.py | 23 | def test_returns_default_when_url_is_empty(self): | CODE |
| LOW⚡ | tests/core/test_storage_core.py | 27 | def test_returns_fld_for_valid_url(self): | CODE |
| LOW⚡ | tests/core/test_storage_core.py | 43 | def test_deterministic_output(self): | CODE |
| LOW⚡ | tests/core/test_storage_core.py | 48 | def test_different_input_different_output(self): | CODE |
| LOW⚡ | tests/core/test_storage_core.py | 53 | def test_strips_and_lowercases(self): | CODE |
| LOW⚡ | tests/core/test_storage_core.py | 58 | def test_includes_length_suffix(self): | CODE |
| LOW | tests/core/test_storage_core.py | 70 | def test_sqlite_storage_creation(self): | CODE |
| LOW | tests/core/test_storage_core.py | 75 | def test_sqlite_storage_with_file(self): | CODE |
| LOW | tests/core/test_storage_core.py | 91 | def test_sqlite_storage_initialization_args(self): | CODE |
| LOW | tests/core/test_storage_core.py | 125 | def test_retrieve_nonexistent_returns_none(self): | CODE |
| LOW | tests/core/test_storage_core.py | 129 | def test_save_overwrites_existing(self): | CODE |
| LOW | tests/core/test_storage_core.py | 167 | def test_element_path_is_stored(self): | CODE |
| LOW | tests/core/test_storage_core.py | 178 | def test_element_with_children_and_siblings(self): | CODE |
| LOW | tests/core/test_storage_core.py | 254 | def test_element_no_attributes(self): | CODE |
| LOW | tests/core/test_storage_core.py | 260 | def test_element_strips_whitespace_attributes(self): | CODE |
| LOW⚡ | tests/core/test_shell_core.py | 14 | def test_simple_cookie_parsing(self): | CODE |
| LOW⚡ | tests/core/test_shell_core.py | 21 | def test_multiple_cookies_parsing(self): | CODE |
| LOW⚡ | tests/core/test_shell_core.py | 31 | def test_cookie_with_attributes(self): | CODE |
| LOW | tests/core/test_shell_core.py | 43 | def test_malformed_cookie_handling(self): | CODE |
| LOW | tests/core/test_shell_core.py | 67 | def test_headers_with_cookies(self): | CODE |
| LOW | tests/core/test_shell_core.py | 80 | def test_headers_without_colons(self): | CODE |
| LOW | tests/core/test_shell_core.py | 92 | def test_invalid_header_format(self): | CODE |
| LOW | tests/core/test_shell_core.py | 102 | def test_headers_with_multiple_colons(self): | CODE |
| LOW | tests/core/test_shell_core.py | 113 | def test_headers_with_whitespace(self): | CODE |
| LOW | tests/core/test_shell_core.py | 125 | def test_parse_cookies_disabled(self): | CODE |
| LOW | tests/core/test_shell_core.py | 187 | def test_request_field_access(self): | CODE |
| LOW | tests/core/test_shell_core.py | 212 | def test_known_logging_levels(self): | CODE |
| LOW | tests/core/test_shell_core.py | 220 | def test_logging_level_values(self): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 156 | def test_browser_encoding_unquoted_charset(): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 163 | def test_browser_encoding_quoted_charset(): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 171 | def test_browser_encoding_defaults_when_missing(): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 230 | def test_generate_headers_basic(self): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 238 | def test_generate_headers_browser_mode(self): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 245 | def test_driven_browser_version(self): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 251 | def test_browser_useragent_follows_the_driven_browser(self, monkeypatch, browser_mode): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 259 | def test_http_mode_useragent_is_not_rewritten(self, monkeypatch): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 266 | def test_browser_mode_useragent_falls_back_without_a_driven_version(self, monkeypatch): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 274 | def test_generate_headers_survives_unavailable_minimum(self, monkeypatch): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 282 | def test_generate_headers_desktop_os_stays_desktop(self, monkeypatch, os_name): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 290 | def test_generate_headers_android_is_mobile(self, monkeypatch): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 297 | def test_generate_headers_unknown_os(self, monkeypatch): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 409 | def test_continues_non_blocked_domain(self): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 415 | def test_resource_blocking_takes_priority_over_domain(self): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 422 | def test_domain_blocking_with_resources_disabled(self): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 429 | def test_no_blocking_continues(self): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 435 | def test_does_not_block_partial_domain_match(self): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 442 | def test_multiple_blocked_domains(self): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 530 | def test_ad_domains_is_frozenset(self): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 535 | def test_ad_domains_has_entries(self): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 540 | def test_ad_domains_contains_known_entries(self): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 550 | def test_block_ads_populates_blocked_domains(self): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 558 | def test_block_ads_false_leaves_blocked_domains_none(self): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 564 | def test_block_ads_merges_with_user_domains(self): | CODE |
| LOW⚡ | tests/fetchers/test_utils.py | 573 | def test_block_ads_does_not_modify_original_set(self): | CODE |
| LOW | tests/fetchers/test_utils.py | 141 | def test_parsing_response_status(status_map): | CODE |
| LOW | tests/fetchers/test_utils.py | 188 | def test_proxy_string_with_auth(self): | CODE |
| LOW | tests/fetchers/test_utils.py | 210 | def test_invalid_proxy_string(self): | CODE |
| LOW | tests/fetchers/test_utils.py | 326 | def test_response_with_bytes_content(self): | CODE |
| LOW | tests/fetchers/test_utils.py | 385 | def test_blocks_disabled_resource_types(self): | CODE |
| 699 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/spiders/test_engine.py | 184 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 186 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 200 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 202 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 237 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 239 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 278 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 280 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 314 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 316 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 336 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 338 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 534 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 536 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 564 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 566 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 597 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 599 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 637 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 639 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 797 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 799 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 818 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 820 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 872 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_engine.py | 874 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/spiders/test_engine.py | 18 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/spiders/test_engine.py | 20 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/spiders/test_engine.py | 935 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/spiders/test_engine.py | 937 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/spiders/test_force_stop_checkpoint.py | 25 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/spiders/test_force_stop_checkpoint.py | 27 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_force_stop_checkpoint.py | 126 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_force_stop_checkpoint.py | 128 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_throttle.py | 210 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_throttle.py | 212 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_robotstxt.py | 296 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_robotstxt.py | 298 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_robotstxt.py | 390 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_robotstxt.py | 392 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_robotstxt.py | 469 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_robotstxt.py | 471 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/spiders/test_robotstxt.py | 10 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/spiders/test_robotstxt.py | 12 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/spiders/test_robotstxt.py | 40 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/spiders/test_robotstxt.py | 42 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/spiders/test_robotstxt.py | 356 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/spiders/test_robotstxt.py | 358 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/spiders/test_robotstxt.py | 68 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | tests/spiders/test_robotstxt.py | 70 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | tests/spiders/test_robotstxt.py | 151 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | tests/spiders/test_robotstxt.py | 153 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | tests/spiders/test_robotstxt.py | 227 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | tests/spiders/test_robotstxt.py | 229 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM | tests/spiders/test_cache.py | 193 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/spiders/test_cache.py | 195 | # --------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/fetchers/test_impersonate_list.py | 4 | CODE | |
| LOW | tests/fetchers/test_impersonate_list.py | 4 | CODE | |
| LOW | tests/fetchers/test_merge_request_args.py | 6 | CODE | |
| LOW | tests/spiders/test_result.py | 9 | CODE | |
| LOW | tests/spiders/test_engine.py | 6 | CODE | |
| LOW | tests/spiders/test_engine.py | 14 | CODE | |
| LOW | tests/spiders/test_request.py | 5 | CODE | |
| LOW | tests/spiders/test_session.py | 3 | CODE | |
| LOW | tests/spiders/test_session.py | 5 | CODE | |
| LOW | tests/spiders/test_spider.py | 12 | CODE | |
| LOW | tests/spiders/test_force_stop_checkpoint.py | 22 | CODE | |
| LOW | tests/spiders/test_links.py | 5 | CODE | |
| LOW | tests/spiders/test_checkpoint.py | 8 | CODE | |
| LOW | tests/parser/test_parser_advanced.py | 5 | CODE | |
| LOW | scrapling/__init__.py | 8 | CODE | |
| LOW | scrapling/__init__.py | 8 | CODE | |
| LOW | scrapling/__init__.py | 9 | CODE | |
| LOW | scrapling/__init__.py | 9 | CODE | |
| LOW | scrapling/__init__.py | 10 | CODE | |
| LOW | scrapling/__init__.py | 10 | CODE | |
| LOW | scrapling/__init__.py | 10 | CODE | |
| LOW | scrapling/__init__.py | 10 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 5 | CODE | |
| LOW | scrapling/core/_types.py | 34 | CODE | |
| LOW | scrapling/core/_types.py | 34 | CODE | |
| LOW | scrapling/core/utils/__init__.py | 1 | CODE | |
| LOW | scrapling/core/utils/__init__.py | 1 | CODE | |
| LOW | scrapling/core/utils/__init__.py | 1 | CODE | |
| LOW | scrapling/core/utils/__init__.py | 1 | CODE | |
| LOW | scrapling/core/utils/__init__.py | 1 | CODE | |
| LOW | scrapling/core/utils/__init__.py | 1 | CODE | |
| LOW | scrapling/core/utils/__init__.py | 1 | CODE | |
| LOW | scrapling/core/utils/__init__.py | 1 | CODE | |
| LOW | scrapling/core/utils/__init__.py | 1 | CODE | |
| LOW | scrapling/fetchers/__init__.py | 2 | CODE | |
| LOW | scrapling/fetchers/__init__.py | 5 | CODE | |
| LOW | scrapling/fetchers/__init__.py | 5 | CODE | |
| LOW | scrapling/fetchers/__init__.py | 5 | CODE | |
| 44 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | cleanup.py | 29 | except Exception as e: | CODE |
| LOW | cleanup.py | 37 | except Exception as e: | CODE |
| LOW | tests/core/test_storage_core.py | 213 | except Exception as e: | CODE |
| MEDIUM | tests/core/test_storage_core.py | 207 | def save_element(idx): | CODE |
| LOW | scrapling/cli.py | 74 | except Exception as err: | CODE |
| LOW | scrapling/core/ai.py | 405 | except Exception as exc: | CODE |
| LOW | scrapling/core/shell.py | 172 | except Exception as e: # pragma: no cover | CODE |
| LOW | scrapling/core/shell.py | 204 | except Exception as e: # pragma: no cover | CODE |
| LOW | scrapling/core/shell.py | 218 | except Exception as e: | CODE |
| LOW | scrapling/core/shell.py | 235 | except Exception as e: | CODE |
| LOW | scrapling/core/shell.py | 322 | except Exception as e: # pragma: no cover | CODE |
| LOW | scrapling/core/shell.py | 364 | except Exception: # pragma: no cover | CODE |
| LOW | scrapling/core/shell.py | 381 | except Exception as e: | CODE |
| LOW | scrapling/core/shell.py | 567 | except Exception as e: | CODE |
| LOW | scrapling/core/utils/_shell.py | 41 | except Exception as e: # pragma: no cover | CODE |
| LOW | scrapling/spiders/robotstxt.py | 31 | except Exception as e: | CODE |
| LOW | scrapling/spiders/robotstxt.py | 36 | except Exception as e: | CODE |
| LOW | scrapling/spiders/checkpoint.py | 56 | except Exception as e: | CODE |
| LOW | scrapling/spiders/checkpoint.py | 79 | except Exception as e: | CODE |
| LOW | scrapling/spiders/checkpoint.py | 89 | except Exception as e: | CODE |
| LOW | scrapling/spiders/cache.py | 50 | except Exception as e: | CODE |
| LOW | scrapling/spiders/cache.py | 82 | except Exception as e: | CODE |
| LOW | scrapling/spiders/engine.py | 180 | except Exception as e: | CODE |
| LOW | scrapling/spiders/engine.py | 232 | except Exception as e: | CODE |
| LOW | scrapling/spiders/spider.py | 147 | except Exception as e: | CODE |
| LOW | scrapling/spiders/templates/sitemap.py | 83 | except Exception as e: | CODE |
| LOW | scrapling/engines/static.py | 729 | except Exception: | CODE |
| LOW | scrapling/engines/static.py | 755 | except Exception: | CODE |
| LOW | scrapling/engines/toolbelt/convertor.py | 72 | except Exception as e: # pragma: no cover | CODE |
| LOW | scrapling/engines/toolbelt/convertor.py | 77 | except Exception as e: # pragma: no cover | CODE |
| LOW | scrapling/engines/toolbelt/convertor.py | 129 | except Exception as e: # pragma: no cover | CODE |
| LOW | scrapling/engines/toolbelt/convertor.py | 189 | except Exception as e: # pragma: no cover | CODE |
| LOW | scrapling/engines/toolbelt/convertor.py | 194 | except Exception as e: # pragma: no cover | CODE |
| LOW | scrapling/engines/toolbelt/convertor.py | 277 | except Exception as e: # pragma: no cover | CODE |
| LOW | scrapling/engines/_browsers/_controllers.py | 94 | except Exception: | CODE |
| LOW | scrapling/engines/_browsers/_controllers.py | 158 | except Exception as e: # pragma: no cover | CODE |
| LOW | scrapling/engines/_browsers/_controllers.py | 171 | except Exception as e: # pragma: no cover | CODE |
| LOW | scrapling/engines/_browsers/_controllers.py | 179 | except Exception as e: # pragma: no cover | CODE |
| LOW | scrapling/engines/_browsers/_controllers.py | 194 | except Exception as e: | CODE |
| LOW | scrapling/engines/_browsers/_controllers.py | 282 | except Exception: | CODE |
| LOW | scrapling/engines/_browsers/_controllers.py | 347 | except Exception as e: # pragma: no cover | CODE |
| LOW | scrapling/engines/_browsers/_controllers.py | 360 | except Exception as e: # pragma: no cover | CODE |
| LOW | scrapling/engines/_browsers/_controllers.py | 368 | except Exception as e: # pragma: no cover | CODE |
| LOW | scrapling/engines/_browsers/_controllers.py | 383 | except Exception as e: | CODE |
| LOW | scrapling/engines/_browsers/_stealth.py | 100 | except Exception: | CODE |
| LOW | scrapling/engines/_browsers/_stealth.py | 252 | except Exception as e: # pragma: no cover | CODE |
| LOW | scrapling/engines/_browsers/_stealth.py | 270 | except Exception as e: # pragma: no cover | CODE |
| LOW | scrapling/engines/_browsers/_stealth.py | 278 | except Exception as e: # pragma: no cover | CODE |
| LOW | scrapling/engines/_browsers/_stealth.py | 293 | except Exception as e: | CODE |
| LOW | scrapling/engines/_browsers/_stealth.py | 385 | except Exception: | CODE |
| LOW | scrapling/engines/_browsers/_stealth.py | 540 | except Exception as e: # pragma: no cover | CODE |
| LOW | scrapling/engines/_browsers/_stealth.py | 558 | except Exception as e: # pragma: no cover | CODE |
| LOW | scrapling/engines/_browsers/_stealth.py | 566 | except Exception as e: # pragma: no cover | CODE |
| LOW | scrapling/engines/_browsers/_stealth.py | 581 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/parser/test_attributes_handler.py | 258 | except: | CODE |
| HIGH | tests/parser/test_attributes_handler.py | 334 | except: | CODE |
| HIGH | scrapling/core/shell.py | 246 | except JSONDecodeError: | CODE |
| HIGH | scrapling/spiders/engine.py | 474 | except EndOfStream: | CODE |
| HIGH | scrapling/spiders/throttle.py | 21 | except ValueError: | CODE |
| HIGH | scrapling/spiders/spider.py | 259 | except ValueError: | CODE |
| HIGH | scrapling/engines/_browsers/_base.py | 146 | except (PlaywrightError, Exception): | CODE |
| HIGH | scrapling/engines/_browsers/_base.py | 346 | except (PlaywrightError, Exception): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | cleanup.py | 6 | CODE | |
| LOW | scrapling/parser.py | 530 | CODE | |
| LOW | scrapling/parser.py | 639 | CODE | |
| LOW | scrapling/parser.py | 709 | CODE | |
| LOW | scrapling/parser.py | 1111 | CODE | |
| LOW | scrapling/core/mixins.py | 15 | CODE | |
| LOW | scrapling/core/shell.py | 334 | CODE | |
| LOW | scrapling/core/shell.py | 150 | CODE | |
| LOW | scrapling/core/shell.py | 622 | CODE | |
| LOW | scrapling/core/shell.py | 663 | CODE | |
| LOW | scrapling/core/utils/_shell.py | 19 | CODE | |
| LOW | scrapling/spiders/request.py | 71 | CODE | |
| LOW | scrapling/spiders/links.py | 226 | CODE | |
| LOW | scrapling/spiders/engine.py | 154 | CODE | |
| LOW | scrapling/spiders/engine.py | 353 | CODE | |
| LOW | scrapling/spiders/spider.py | 34 | CODE | |
| LOW | scrapling/spiders/spider.py | 262 | CODE | |
| LOW | scrapling/spiders/spider.py | 304 | CODE | |
| LOW | scrapling/spiders/templates/sitemap.py | 88 | CODE | |
| LOW | scrapling/spiders/templates/sitemap.py | 108 | CODE | |
| LOW | scrapling/spiders/templates/_utils.py | 14 | CODE | |
| LOW | scrapling/engines/static.py | 224 | CODE | |
| LOW | scrapling/engines/static.py | 440 | CODE | |
| LOW | scrapling/engines/_browsers/_base.py | 190 | CODE | |
| LOW | scrapling/engines/_browsers/_base.py | 390 | CODE | |
| LOW | scrapling/engines/_browsers/_controllers.py | 72 | CODE | |
| LOW | scrapling/engines/_browsers/_controllers.py | 102 | CODE | |
| LOW | scrapling/engines/_browsers/_controllers.py | 261 | CODE | |
| LOW | scrapling/engines/_browsers/_controllers.py | 290 | CODE | |
| LOW | scrapling/engines/_browsers/_stealth.py | 77 | CODE | |
| LOW | scrapling/engines/_browsers/_stealth.py | 108 | CODE | |
| LOW | scrapling/engines/_browsers/_stealth.py | 195 | CODE | |
| LOW | scrapling/engines/_browsers/_stealth.py | 363 | CODE | |
| LOW | scrapling/engines/_browsers/_stealth.py | 393 | CODE | |
| LOW | scrapling/engines/_browsers/_stealth.py | 482 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/fetchers/async/test_dynamic.py | 0 | test doing a basic fetch request with multiple statuses | STRING |
| HIGH | tests/fetchers/async/test_stealth.py | 0 | test doing a basic fetch request with multiple statuses | STRING |
| HIGH | tests/fetchers/sync/test_dynamic.py | 0 | test doing a basic fetch request with multiple statuses | STRING |
| HIGH | scrapling/fetchers/stealth_chrome.py | 0 | a browser session manager with page pooling, it's using a persistent browser context by default with a temporary user pr | STRING |
| HIGH | scrapling/engines/_browsers/_controllers.py | 0 | a browser session manager with page pooling, it's using a persistent browser context by default with a temporary user pr | STRING |
| HIGH | scrapling/engines/_browsers/_stealth.py | 0 | a browser session manager with page pooling, it's using a persistent browser context by default with a temporary user pr | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …-skill/Scrapling-Skill/references/fetching/stealthy.md | 164 | This is for educational purposes only; this example was generated by AI, which also shows how easy it is to work with Sc | CODE |
| HIGH | tests/fetchers/test_utils.py | 26 | # A map generated by ChatGPT for most possible `content_type` values and the expected outcome | COMMENT |
| HIGH | docs/overview.md | 17 | Here's an HTML document generated by ChatGPT that we will be using as an example throughout this page: | CODE |
| HIGH | docs/development/adaptive_storage_system.md | 26 | Here's a more practical example generated by AI using Redis: | CODE |
| HIGH | docs/fetching/stealthy.md | 176 | This is for educational purposes only; this example was generated by AI, which also shows how easy it is to work with Sc | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scrapling/__init__.py | 24 | __all__ = ["Selector", "Fetcher", "AsyncFetcher", "StealthyFetcher", "DynamicFetcher"] | CODE |
| LOW | scrapling/core/storage.py | 97 | def _setup_database(self) -> None: | CODE |
| LOW | scrapling/fetchers/__init__.py | 23 | __all__ = [ | CODE |
| LOW | scrapling/fetchers/requests.py | 10 | __all__ = ["Fetcher", "AsyncFetcher", "FetcherSession"] | CODE |
| LOW | scrapling/spiders/__init__.py | 19 | __all__ = [ | CODE |
| LOW | scrapling/spiders/links.py | 27 | __all__ = ["LinkExtractor"] | CODE |
| LOW | scrapling/spiders/spider.py | 239 | def _setup_signal_handler(self) -> None: | CODE |
| LOW | scrapling/spiders/templates/shopify.py | 22 | __all__ = ["ShopifySpider"] | CODE |
| LOW | scrapling/spiders/templates/sitemap.py | 28 | __all__ = ["SitemapSpider"] | CODE |
| LOW | scrapling/spiders/templates/__init__.py | 7 | __all__ = [ | CODE |
| LOW | scrapling/spiders/templates/feed.py | 29 | __all__ = ["XMLFeedSpider", "CSVFeedSpider"] | CODE |
| LOW | scrapling/spiders/templates/site_to_markdown.py | 27 | __all__ = ["SiteToMarkdownSpider"] | CODE |
| LOW | scrapling/spiders/templates/_utils.py | 8 | __all__ = ["_decompress"] | CODE |
| LOW | scrapling/spiders/templates/crawler.py | 23 | __all__ = ["CrawlRule", "CrawlSpider"] | CODE |
| LOW | scrapling/integrations/scrapy.py | 21 | __all__ = ["scrapling_response", "convert_response"] | CODE |
| LOW | scrapling/engines/toolbelt/__init__.py | 3 | __all__ = ["ProxyRotator", "is_proxy_error", "cyclic_rotation"] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/spiders/test_engine.py | 74 | CODE | |
| LOW | scrapling/parser.py | 93 | CODE | |
| LOW | scrapling/core/ai.py | 236 | CODE | |
| LOW | scrapling/core/ai.py | 358 | CODE | |
| LOW | scrapling/core/ai.py | 427 | CODE | |
| LOW | scrapling/core/ai.py | 507 | CODE | |
| LOW | scrapling/core/ai.py | 581 | CODE | |
| LOW | scrapling/core/ai.py | 657 | CODE | |
| LOW | scrapling/core/ai.py | 734 | CODE | |
| LOW | scrapling/core/ai.py | 825 | CODE | |
| LOW | scrapling/core/ai.py | 917 | CODE | |
| LOW | scrapling/core/ai.py | 987 | CODE | |
| LOW | scrapling/spiders/links.py | 194 | CODE | |
| LOW | scrapling/engines/static.py | 661 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | agent-skill/README.md | 3 | The skill aligns with the [AgentSkill](https://agentskills.io/specification) specification, so it will be readable by [O | CODE |
| MEDIUM | …ill/Scrapling-Skill/references/building-rag-systems.md | 1 | # Building RAG Systems | COMMENT |
| MEDIUM | docs/ai/building-rag-systems.md | 1 | # Building RAG Systems with Scrapling | COMMENT |
| MEDIUM | docs/ai/agent-skill.md | 5 | The skill follows the [AgentSkills](https://agentskills.io/specification) specification, so it's readable by [Claude Cod | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/parser/test_attributes_handler.py | 279 | # Create an element with many attributes | COMMENT |
| MEDIUM | scrapling/core/shell.py | 55 | # Define the structure for parsed context - Simplified for Fetcher args | COMMENT |
| MEDIUM | scrapling/core/shell.py | 517 | # Create the namespace dictionary | COMMENT |
| MEDIUM | scrapling/engines/toolbelt/custom.py | 29 | """This class is returned by all engines as a way to unify the response type between different libraries. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/spiders/test_engine.py | 483 | CODE | |
| MEDIUM | scrapling/spiders/spider.py | 176 | CODE | |
| MEDIUM | scrapling/spiders/templates/sitemap.py | 76 | CODE | |
| MEDIUM | scrapling/spiders/templates/feed.py | 72 | CODE | |
| MEDIUM | scrapling/spiders/templates/feed.py | 140 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scrapling/core/shell.py | 239 | # Check if raw data looks like JSON, prefer 'json' param if so | COMMENT |
| LOW | scrapling/core/shell.py | 344 | # Check if this function has known parameters | COMMENT |
| LOW | scrapling/engines/_browsers/_base.py | 609 | # Check if turnstile captcha is embedded inside the page (Usually inside a closed Shadow iframe) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …nt-skill/Scrapling-Skill/references/fetching/static.md | 350 | 'username': 'user@example.com', | CODE |
| LOW | docs/fetching/static.md | 357 | 'username': 'user@example.com', | CODE |