{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-5+qual-2+sec-2","generated_at":"2026-11-14T15:21:06.699585Z","repo":{"ref":{"host":"github.com","owner":"D4Vinci","name":"Scrapling"},"default_branch":"main","clone_url":"https://github.com/D4Vinci/Scrapling.git","html_url":"https://github.com/D4Vinci/Scrapling","description":"🕷️ The BEST 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","stars":102735,"forks":10701,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":16302,"primary_language":"Python","license_spdx":"BSD-3-Clause","created_at":"2024-10-13T20:29:53Z","pushed_at":"2026-11-14T14:24:32Z","security_policy_url":null,"distribution":{"owner_created_at":"2016-07-22T22:10:18Z","owner_type":"User","release_assets":[]}},"commit_sha":"bb223f2f5fc8f743772751a5ce283ef7851ca6be","profile":{"lines_by_language":{"Python":43841,"JavaScript":13},"files_by_category":{"docs":420,"test":103,"source":69,"other":45,"config":33,"binary":29},"source_lines":16661,"test_lines":27193},"pillars":{"ai_provenance":{"score":0.6,"confidence":0.95,"coverage":1.0,"label":"explicit","breakdown":{"attributed_share":0.0064,"suspected_share":0.1865,"estimated_share":0.0064,"ai_artifacts":0.0,"flagged_work_units":5.0,"flagged_releases":0.0,"style_index":0.0},"summary":"Explicit AI attribution on 1% of first-party code added; an estimated 1% including velocity signals."},"quality":{"score":73.7,"confidence":0.9,"coverage":1.0,"label":"adequate","breakdown":{"complexity":53.0,"duplication":53.6,"lint":84.8,"testing":100.0,"docs":100.0,"type_safety":0.0,"process":null},"summary":"Code quality is adequate: test-to-source ratio 1.63, CI runs tests; 21% of function code in complex or long functions; 10% duplicated lines. Weakest area: type safety."},"security":{"score":55.1,"confidence":0.85,"coverage":1.0,"label":"weak","breakdown":{"secrets":67.0,"sast":85.3,"dependencies":77.9,"ci_actions":1.1,"posture":0.0,"scorecard":null},"summary":"Security posture is weak: 3 known vulnerabilities in 1 dependencies; 5 high-severity SAST findings; 22 high-severity workflow issues. Weakest area: posture."}},"analyzer_results":[{"analyzer":"sec-scorecard","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":"no published OpenSSF Scorecard result for this repo"},{"analyzer":"sec-registry","pillar":"security","status":"ok","tool_version":null,"metrics":{"declared":26.0,"checked":26.0,"missing":0.0,"recent":0.0,"lookup_errors":0.0},"findings":[],"evidence":[],"data":{"phantom":false},"error":null},{"analyzer":"ai-attribution","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"commits":1580.0,"attributed_commits":18.0,"attributed_commit_share":0.01139240506329114,"effective_loc":73584.0,"attributed_loc":473.0,"attributed_loc_share":0.006428027832137421,"tools_detected":2.0},"findings":[],"evidence":[{"kind":"attribution-summary","description":"OpenAI Codex: 10 attributed commits, 43 lines added","ref":null,"url":null,"weight":1.0},{"kind":"attribution-summary","description":"Claude Code: 8 attributed commits, 430 lines added","ref":null,"url":null,"weight":1.0},{"kind":"attributed-commit","description":"OpenAI Codex: PR branch 'codex/fix-template-gzip-errors'","ref":"37950a630437c19414c3870613a69027f43564d3","url":"https://github.com/D4Vinci/Scrapling/commit/37950a630437c19414c3870613a69027f43564d3","weight":0.9},{"kind":"attributed-commit","description":"OpenAI Codex: trailer 'Co-authored-by: Codex'","ref":"330d2e685ac27529d8452f048ed591a87536812e","url":"https://github.com/D4Vinci/Scrapling/commit/330d2e685ac27529d8452f048ed591a87536812e","weight":0.9},{"kind":"attributed-commit","description":"OpenAI Codex: trailer 'Co-authored-by: Codex'","ref":"2995be75a00ad8f42028c9712eaa7f8f77234521","url":"https://github.com/D4Vinci/Scrapling/commit/2995be75a00ad8f42028c9712eaa7f8f77234521","weight":0.9},{"kind":"attributed-commit","description":"OpenAI Codex: trailer 'Co-authored-by: Codex'","ref":"50c99b9b3fc389a7f460faa29736821fd6c71444","url":"https://github.com/D4Vinci/Scrapling/commit/50c99b9b3fc389a7f460faa29736821fd6c71444","weight":0.9},{"kind":"attributed-commit","description":"OpenAI Codex: trailer 'Co-authored-by: Codex'","ref":"066d30938ab5d2b9dd11095a06073b5445430b9b","url":"https://github.com/D4Vinci/Scrapling/commit/066d30938ab5d2b9dd11095a06073b5445430b9b","weight":0.9},{"kind":"attributed-commit","description":"OpenAI Codex: trailer 'Co-authored-by: Codex'","ref":"a4dcdf346907afdd7e08210c8d81a3eda58df625","url":"https://github.com/D4Vinci/Scrapling/commit/a4dcdf346907afdd7e08210c8d81a3eda58df625","weight":0.9},{"kind":"attributed-commit","description":"OpenAI Codex: trailer 'Co-authored-by: Codex'","ref":"03221a0f177c3c602a4846ba2a2e7b932a85af10","url":"https://github.com/D4Vinci/Scrapling/commit/03221a0f177c3c602a4846ba2a2e7b932a85af10","weight":0.9},{"kind":"attributed-commit","description":"OpenAI Codex: trailer 'Co-authored-by: Codex'","ref":"d7182358bae6e26fe5ead1780914992db847dab0","url":"https://github.com/D4Vinci/Scrapling/commit/d7182358bae6e26fe5ead1780914992db847dab0","weight":0.9},{"kind":"attributed-commit","description":"OpenAI Codex: trailer 'Co-authored-by: Codex'","ref":"251e884a6d93cff6ddc24452f5f655547a7976d6","url":"https://github.com/D4Vinci/Scrapling/commit/251e884a6d93cff6ddc24452f5f655547a7976d6","weight":0.9},{"kind":"attributed-commit","description":"OpenAI Codex: trailer 'Co-authored-by: Codex'","ref":"98f94471d5915a1f80f5dffda35cf3e4c9344746","url":"https://github.com/D4Vinci/Scrapling/commit/98f94471d5915a1f80f5dffda35cf3e4c9344746","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: PR description attribution","ref":"80332cf3a7b325b6e29017b1f25ff1f2e3019fa2","url":"https://github.com/D4Vinci/Scrapling/commit/80332cf3a7b325b6e29017b1f25ff1f2e3019fa2","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"cd4cdc69e622c1e9f07a709cc7180a2ee6b6fd2a","url":"https://github.com/D4Vinci/Scrapling/commit/cd4cdc69e622c1e9f07a709cc7180a2ee6b6fd2a","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"00897dad2f60dc632e4f33972e7ae0c0889b1fff","url":"https://github.com/D4Vinci/Scrapling/commit/00897dad2f60dc632e4f33972e7ae0c0889b1fff","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"273c8c2fa02db3003db604c8b21447574440d3c0","url":"https://github.com/D4Vinci/Scrapling/commit/273c8c2fa02db3003db604c8b21447574440d3c0","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"d3c251c1ab3a935a14f1d3333a3643505cc933c4","url":"https://github.com/D4Vinci/Scrapling/commit/d3c251c1ab3a935a14f1d3333a3643505cc933c4","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"a31763afdeaec2f4cfd4b402e81692cd301b4c0a","url":"https://github.com/D4Vinci/Scrapling/commit/a31763afdeaec2f4cfd4b402e81692cd301b4c0a","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"7178279586749a802337b2426b95218b13712775","url":"https://github.com/D4Vinci/Scrapling/commit/7178279586749a802337b2426b95218b13712775","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"297423410db7a94730737dc1e0259b32aea8e71a","url":"https://github.com/D4Vinci/Scrapling/commit/297423410db7a94730737dc1e0259b32aea8e71a","weight":0.9}],"data":{"attributed_loc_by_commit":{"297423410db7a94730737dc1e0259b32aea8e71a":258,"7178279586749a802337b2426b95218b13712775":93,"a31763afdeaec2f4cfd4b402e81692cd301b4c0a":1,"d3c251c1ab3a935a14f1d3333a3643505cc933c4":8,"273c8c2fa02db3003db604c8b21447574440d3c0":11,"00897dad2f60dc632e4f33972e7ae0c0889b1fff":25,"cd4cdc69e622c1e9f07a709cc7180a2ee6b6fd2a":27,"80332cf3a7b325b6e29017b1f25ff1f2e3019fa2":7,"98f94471d5915a1f80f5dffda35cf3e4c9344746":0,"251e884a6d93cff6ddc24452f5f655547a7976d6":0,"d7182358bae6e26fe5ead1780914992db847dab0":0,"03221a0f177c3c602a4846ba2a2e7b932a85af10":0,"a4dcdf346907afdd7e08210c8d81a3eda58df625":0,"066d30938ab5d2b9dd11095a06073b5445430b9b":0,"50c99b9b3fc389a7f460faa29736821fd6c71444":0,"2995be75a00ad8f42028c9712eaa7f8f77234521":0,"330d2e685ac27529d8452f048ed591a87536812e":0,"37950a630437c19414c3870613a69027f43564d3":43},"tools":{"claude-code":{"name":"Claude Code","commits":8,"loc":430,"first_seen":1773566830,"last_seen":1790293498},"openai-codex":{"name":"OpenAI Codex","commits":10,"loc":43,"first_seen":1792166613,"last_seen":1793644462}},"monthly":{"2024-10":{"loc":3157,"attributed_loc":0},"2024-11":{"loc":2449,"attributed_loc":0},"2024-12":{"loc":1954,"attributed_loc":0},"2025-01":{"loc":292,"attributed_loc":0},"2025-02":{"loc":123,"attributed_loc":0},"2025-03":{"loc":609,"attributed_loc":0},"2025-04":{"loc":3110,"attributed_loc":0},"2025-05":{"loc":1993,"attributed_loc":0},"2025-06":{"loc":3313,"attributed_loc":0},"2025-07":{"loc":1795,"attributed_loc":0},"2025-08":{"loc":3085,"attributed_loc":0},"2025-09":{"loc":2216,"attributed_loc":0},"2025-10":{"loc":2360,"attributed_loc":0},"2025-11":{"loc":1378,"attributed_loc":0},"2025-12":{"loc":691,"attributed_loc":0},"2026-01":{"loc":4479,"attributed_loc":0},"2026-02":{"loc":2810,"attributed_loc":0},"2026-03":{"loc":1952,"attributed_loc":360},"2026-04":{"loc":6187,"attributed_loc":36},"2026-05":{"loc":1476,"attributed_loc":0},"2026-06":{"loc":534,"attributed_loc":27},"2026-07":{"loc":2044,"attributed_loc":0},"2026-08":{"loc":3382,"attributed_loc":0},"2026-09":{"loc":10334,"attributed_loc":7},"2026-10":{"loc":10543,"attributed_loc":0},"2026-11":{"loc":1318,"attributed_loc":43}}},"error":null},{"analyzer":"ai-artifacts","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"artifacts":0.0,"workflow_agents":0.0,"tools_configured":0.0},"findings":[],"evidence":[],"data":{"artifacts":[],"workflows":[],"tools":[]},"error":null},{"analyzer":"ai-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-5","metrics":{"work_units":472.0,"flagged_units":5.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":0.0,"pre_ai_era_burst_loc":0.0,"measured_loc":71426.0,"flagged_loc":13721.0,"flagged_loc_share":0.19210091563296278,"max_loc_per_hour":1815.7568040744866,"median_loc_per_hour":86.52428032992844,"pr_timed_units":44.0,"excluded_import_loc":2158.0},"findings":[],"evidence":[{"kind":"velocity-burst","description":"3,169 lines of first-party code in ~1.7h (1,816 lines/hour, 3 commit session)","ref":"70b1916777baa8daeeb14e33befda75cc4132724","url":"https://github.com/D4Vinci/Scrapling/commit/70b1916777baa8daeeb14e33befda75cc4132724","weight":0.5447270412223459},{"kind":"velocity-burst","description":"1,841 lines of first-party code in ~2.2h (845 lines/hour, 4 commit session)","ref":"f6f8d77493110884fdd5954d3fca5882520bae64","url":"https://github.com/D4Vinci/Scrapling/commit/f6f8d77493110884fdd5954d3fca5882520bae64","weight":0.2534455066921606},{"kind":"velocity-burst","description":"3,731 lines of first-party code in ~4.8h (777 lines/hour, 5 commit session)","ref":"887eeee4c2d68b31c5462ec7549f50a4a57f69be","url":"https://github.com/D4Vinci/Scrapling/commit/887eeee4c2d68b31c5462ec7549f50a4a57f69be","weight":0.2330122014688024},{"kind":"velocity-burst","description":"2,683 lines of first-party code in ~4.0h (663 lines/hour, 2 commit session)","ref":"d247b5b691d80b0a37176d61ee20ce7f862df344","url":"https://github.com/D4Vinci/Scrapling/commit/d247b5b691d80b0a37176d61ee20ce7f862df344","weight":0.1988771448181194},{"kind":"velocity-burst","description":"2,297 lines of first-party code in ~4.0h (574 lines/hour, 1 commit session)","ref":"0c8dd63f877b2adf6f93cc595c947d720b012173","url":"https://github.com/D4Vinci/Scrapling/commit/0c8dd63f877b2adf6f93cc595c947d720b012173","weight":0.172275}],"data":{"flagged_loc_by_commit":{"0c8dd63f877b2adf6f93cc595c947d720b012173":2297,"1f0f86e3a2d79cce9352ff28e18a85be2cb625f5":336,"d247b5b691d80b0a37176d61ee20ce7f862df344":2347,"d952db8ef8fe3bf5a418b9b156c0e19c2a899cd1":3688,"0678ed1406f0e49d292f3974a69f79f924cb30b7":11,"be28fe16ec1501e1f534b007b5263ac06b301ebe":26,"ad6fd5284553f4160f9e2aa6f002147b64e6064c":5,"887eeee4c2d68b31c5462ec7549f50a4a57f69be":1,"b68157f3f8107465ef2523575c5903ead0012c7d":532,"9e36038ca9045ae3caeca41861c5fa575f2cde5b":671,"5bbc6842bbe835be44daae9ff7e3cea0a8ccaa4a":370,"f6f8d77493110884fdd5954d3fca5882520bae64":268,"be1874eb9e6e15b9fa1c2f8dc819a2543b1de078":132,"d225c5f4f14c75ad676ac31a1ab532ee4bac692f":23,"70b1916777baa8daeeb14e33befda75cc4132724":3014},"excluded_import_commits":["a721073b7c5a05f66bbfc0e8d1fae27495739a10"]},"error":null},{"analyzer":"ai-release-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-5","metrics":{"releases":54.0,"flagged_releases":0.0,"max_loc_per_day":601.2},"findings":[],"evidence":[],"data":{"releases":[{"from":"v0.1","to":"v0.1.1","loc":3,"days":0.1,"loc_per_day":30.5,"flagged":false},{"from":"v0.1.1","to":"v0.1.2","loc":43,"days":2.68,"loc_per_day":16.1,"flagged":false},{"from":"v0.1.2","to":"v0.2","loc":2571,"days":26.04,"loc_per_day":98.7,"flagged":false},{"from":"v0.2","to":"v0.2.1","loc":148,"days":3.96,"loc_per_day":37.4,"flagged":false},{"from":"v0.2.1","to":"v0.2.2","loc":28,"days":1.15,"loc_per_day":24.3,"flagged":false},{"from":"v0.2.2","to":"v0.2.3","loc":3,"days":3.16,"loc_per_day":1.0,"flagged":false},{"from":"v0.2.3","to":"v0.2.4","loc":98,"days":0.49,"loc_per_day":199.7,"flagged":false},{"from":"v0.2.4","to":"v0.2.5","loc":258,"days":3.18,"loc_per_day":81.2,"flagged":false},{"from":"v0.2.5","to":"v0.2.6","loc":28,"days":0.91,"loc_per_day":30.9,"flagged":false},{"from":"v0.2.6","to":"v0.2.7","loc":86,"days":2.32,"loc_per_day":37.1,"flagged":false},{"from":"v0.2.7","to":"v0.2.8","loc":164,"days":3.8,"loc_per_day":43.2,"flagged":false},{"from":"v0.2.8","to":"v0.2.9","loc":1782,"days":15.85,"loc_per_day":112.4,"flagged":false},{"from":"v0.2.9","to":"v0.2.91","loc":105,"days":2.97,"loc_per_day":35.4,"flagged":false},{"from":"v0.2.91","to":"v0.2.92","loc":67,"days":7.26,"loc_per_day":9.2,"flagged":false},{"from":"v0.2.92","to":"v0.2.93","loc":292,"days":35.33,"loc_per_day":8.3,"flagged":false},{"from":"v0.2.93","to":"v0.2.94","loc":110,"days":22.63,"loc_per_day":4.9,"flagged":false},{"from":"v0.2.94","to":"v0.2.95","loc":13,"days":3.23,"loc_per_day":4.0,"flagged":false},{"from":"v0.2.95","to":"v0.2.96","loc":7,"days":7.14,"loc_per_day":1.0,"flagged":false},{"from":"v0.2.96","to":"v0.2.97","loc":283,"days":9.99,"loc_per_day":28.3,"flagged":false},{"from":"v0.2.97","to":"v0.2.98","loc":74,"days":2.5,"loc_per_day":29.6,"flagged":false},{"from":"v0.2.98","to":"v0.2.99","loc":346,"days":21.63,"loc_per_day":16.0,"flagged":false},{"from":"v0.2.99","to":"v0.3","loc":13196,"days":145.99,"loc_per_day":90.4,"flagged":false},{"from":"v0.3","to":"v0.3.1","loc":78,"days":1.41,"loc_per_day":55.2,"flagged":false},{"from":"v0.3.1","to":"v0.3.2","loc":1696,"days":12.46,"loc_per_day":136.1,"flagged":false},{"from":"v0.3.2","to":"v0.3.3","loc":1,"days":0.4,"loc_per_day":2.5,"flagged":false},{"from":"v0.3.3","to":"v0.3.4","loc":73,"days":1.07,"loc_per_day":68.1,"flagged":false},{"from":"v0.3.4","to":"v0.3.5","loc":248,"days":4.0,"loc_per_day":61.9,"flagged":false},{"from":"v0.3.5","to":"v0.3.6","loc":1019,"days":10.61,"loc_per_day":96.0,"flagged":false},{"from":"v0.3.6","to":"v0.3.7","loc":1114,"days":11.04,"loc_per_day":100.9,"flagged":false},{"from":"v0.3.7","to":"v0.3.8","loc":346,"days":15.44,"loc_per_day":22.4,"flagged":false},{"from":"v0.3.8","to":"v0.3.9","loc":290,"days":20.44,"loc_per_day":14.2,"flagged":false},{"from":"v0.3.9","to":"v0.3.10","loc":1088,"days":9.67,"loc_per_day":112.5,"flagged":false},{"from":"v0.3.10","to":"v0.3.11","loc":8,"days":6.34,"loc_per_day":1.3,"flagged":false},{"from":"v0.3.11","to":"v0.3.12","loc":75,"days":14.94,"loc_per_day":5.0,"flagged":false},{"from":"v0.3.12","to":"v0.3.13","loc":764,"days":14.82,"loc_per_day":51.5,"flagged":false},{"from":"v0.3.13","to":"v0.3.14","loc":8,"days":2.02,"loc_per_day":4.0,"flagged":false},{"from":"v0.3.14","to":"v0.4","loc":7017,"days":42.36,"loc_per_day":165.6,"flagged":false},{"from":"v0.4","to":"v0.4.1","loc":108,"days":11.96,"loc_per_day":9.0,"flagged":false},{"from":"v0.4.1","to":"v0.4.2","loc":281,"days":9.81,"loc_per_day":28.6,"flagged":false},{"from":"v0.4.2","to":"v0.4.3","loc":1671,"days":21.18,"loc_per_day":78.9,"flagged":false},{"from":"v0.4.3","to":"v0.4.4","loc":1214,"days":5.99,"loc_per_day":202.7,"flagged":false},{"from":"v0.4.4","to":"v0.4.5","loc":689,"days":2.03,"loc_per_day":339.2,"flagged":false},{"from":"v0.4.5","to":"v0.4.6","loc":3839,"days":6.39,"loc_per_day":601.2,"flagged":false},{"from":"v0.4.6","to":"v0.4.7","loc":283,"days":4.31,"loc_per_day":65.6,"flagged":false},{"from":"v0.4.7","to":"v0.4.8","loc":1627,"days":23.2,"loc_per_day":70.1,"flagged":false},{"from":"v0.4.8","to":"v0.4.9","loc":225,"days":27.7,"loc_per_day":8.1,"flagged":false},{"from":"v0.4.9","to":"v0.4.10","loc":763,"days":27.03,"loc_per_day":28.2,"flagged":false},{"from":"v0.4.10","to":"v0.4.11","loc":477,"days":8.02,"loc_per_day":59.5,"flagged":false},{"from":"v0.4.11","to":"v0.4.12","loc":1124,"days":14.03,"loc_per_day":80.1,"flagged":false},{"from":"v0.4.12","to":"v0.4.13","loc":811,"days":13.95,"loc_per_day":58.1,"flagged":false},{"from":"v0.4.13","to":"v0.4.14","loc":1,"days":1.14,"loc_per_day":0.9,"flagged":false},{"from":"v0.4.14","to":"v0.4.15","loc":2570,"days":12.89,"loc_per_day":199.4,"flagged":false},{"from":"v0.4.15","to":"v0.5","loc":19629,"days":55.08,"loc_per_day":356.3,"flagged":false},{"from":"v0.5","to":"v0.5.1","loc":2566,"days":17.95,"loc_per_day":143.0,"flagged":false}]},"error":null},{"analyzer":"ai-stylometry","pillar":"ai_provenance","status":"ok","tool_version":null,"metrics":{"lines_scanned":16661.0,"index":0.0,"count:narrated_steps":0.0,"per_kloc:narrated_steps":0.0,"files:narrated_steps":0.0,"count:placeholder":0.0,"per_kloc:placeholder":0.0,"files:placeholder":0.0,"count:emoji_in_code":0.0,"per_kloc:emoji_in_code":0.0,"files:emoji_in_code":0.0,"count:assistant_voice":0.0,"per_kloc:assistant_voice":0.0,"files:assistant_voice":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-secrets","pillar":"security","status":"ok","tool_version":"gitleaks 8.30.1","metrics":{"secrets_current":0.0,"secrets_history":0.0,"secrets_nonprod":12.0,"secrets_low_confidence":0.0},"findings":[{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree (test/docs/example file)","path":"agent-skill/Scrapling-Skill/references/mcp-server.md","line":252,"fingerprint":"agent-skill/Scrapling-Skill/references/mcp-server.md:generic-api-key:252"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree (test/docs/example file)","path":"docs/ai/mcp-server.md","line":264,"fingerprint":"docs/ai/mcp-server.md:generic-api-key:264"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree (test/docs/example file)","path":"docs/locales/ar/ai/mcp-server.md","line":294,"fingerprint":"docs/locales/ar/ai/mcp-server.md:generic-api-key:294"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree (test/docs/example file)","path":"docs/locales/de/ai/mcp-server.md","line":271,"fingerprint":"docs/locales/de/ai/mcp-server.md:generic-api-key:271"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree (test/docs/example file)","path":"docs/locales/ja/ai/mcp-server.md","line":264,"fingerprint":"docs/locales/ja/ai/mcp-server.md:generic-api-key:264"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree (test/docs/example file)","path":"docs/locales/fr/ai/mcp-server.md","line":271,"fingerprint":"docs/locales/fr/ai/mcp-server.md:generic-api-key:271"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree (test/docs/example file)","path":"docs/locales/es/ai/mcp-server.md","line":271,"fingerprint":"docs/locales/es/ai/mcp-server.md:generic-api-key:271"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree (test/docs/example file)","path":"docs/locales/ko/ai/mcp-server.md","line":264,"fingerprint":"docs/locales/ko/ai/mcp-server.md:generic-api-key:264"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree (test/docs/example file)","path":"docs/locales/ru/ai/mcp-server.md","line":264,"fingerprint":"docs/locales/ru/ai/mcp-server.md:generic-api-key:264"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree (test/docs/example file)","path":"docs/locales/pt-BR/ai/mcp-server.md","line":271,"fingerprint":"docs/locales/pt-BR/ai/mcp-server.md:generic-api-key:271"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree (test/docs/example file)","path":"docs/locales/zh/ai/mcp-server.md","line":270,"fingerprint":"docs/locales/zh/ai/mcp-server.md:generic-api-key:270"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree (test/docs/example file)","path":"tests/ai/test_browser_fill_fields.py","line":664,"fingerprint":"tests/ai/test_browser_fill_fields.py:generic-api-key:664"}],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":9.0,"findings_high":5.0,"findings_medium":4.0,"findings_low":0.0,"weighted_findings":7.55,"scanned_lines":16661.0,"parse_errors":1.0},"findings":[{"rule_id":"opengrep/dockerfile.security.missing-user-entrypoint","severity":"high","message":"By not specifying a USER, a program in the container may run as 'root'. This is a security hazard. If an attacker can control a process running as root, they may have control over the container. Ensure that the last USER in a Dockerfile is a USER other than 'root'. [confidence medium]","path":"Dockerfile","line":38,"fingerprint":"dockerfile.security.missing-user-entrypoint:Dockerfile:38"},{"rule_id":"opengrep/dockerfile.security.missing-user","severity":"high","message":"By not specifying a USER, a program in the container may run as 'root'. This is a security hazard. If an attacker can control a process running as root, they may have control over the container. Ensure that the last USER in a Dockerfile is a USER other than 'root'. [confidence medium]","path":"Dockerfile","line":41,"fingerprint":"dockerfile.security.missing-user:Dockerfile:41"},{"rule_id":"opengrep/python.lang.security.audit.dangerous-subprocess-use-audit","severity":"high","message":"Detected subprocess function 'check_output' without a static string. If this data can be controlled by a malicious actor, it may be an instance of command injection. Audit the use of this call to ensure it is not controllable by an external resource. You may consider using 'shlex.escape()'. [confidence low]","path":"scrapling/cli.py","line":27,"fingerprint":"python.lang.security.audit.dangerous-subprocess-use-audit:scrapling/cli.py:27"},{"rule_id":"opengrep/javascript.lang.security.detect-insecure-websocket","severity":"high","message":"Insecure WebSocket Detected. WebSocket Secure (wss) should be used for all WebSocket connections. [confidence low]","path":"scrapling/engines/_browsers/_validators.py","line":44,"fingerprint":"javascript.lang.security.detect-insecure-websocket:scrapling/engines/_browsers/_validators.py:44"},{"rule_id":"opengrep/javascript.lang.security.detect-insecure-websocket","severity":"high","message":"Insecure WebSocket Detected. WebSocket Secure (wss) should be used for all WebSocket connections. [confidence low]","path":"scrapling/engines/_browsers/_validators.py","line":45,"fingerprint":"javascript.lang.security.detect-insecure-websocket:scrapling/engines/_browsers/_validators.py:45"},{"rule_id":"opengrep/python.lang.security.deserialization.avoid-pickle","severity":"medium","message":"Avoid using `pickle`, which is known to lead to code execution vulnerabilities. When unpickling, the serialized data could be manipulated to run arbitrary code. Instead, consider serializing the relevant data as JSON or a similar text-based serialization format. [confidence low]","path":"scrapling/spiders/checkpoint.py","line":49,"fingerprint":"python.lang.security.deserialization.avoid-pickle:scrapling/spiders/checkpoint.py:49"},{"rule_id":"opengrep/python.lang.security.deserialization.avoid-pickle","severity":"medium","message":"Avoid using `pickle`, which is known to lead to code execution vulnerabilities. When unpickling, the serialized data could be manipulated to run arbitrary code. Instead, consider serializing the relevant data as JSON or a similar text-based serialization format. [confidence low]","path":"scrapling/spiders/checkpoint.py","line":74,"fingerprint":"python.lang.security.deserialization.avoid-pickle:scrapling/spiders/checkpoint.py:74"},{"rule_id":"opengrep/python.lang.security.insecure-hash-algorithm-sha1","severity":"medium","message":"Detected SHA1 hash algorithm which is considered insecure. SHA1 is not collision resistant and is therefore not suitable as a cryptographic signature. Use SHA256 or SHA3 instead. [confidence medium]","path":"scrapling/spiders/request.py","line":126,"fingerprint":"python.lang.security.insecure-hash-algorithm-sha1:scrapling/spiders/request.py:126"},{"rule_id":"opengrep/python.lang.security.insecure-hash-algorithm-sha1","severity":"medium","message":"Detected SHA1 hash algorithm which is considered insecure. SHA1 is not collision resistant and is therefore not suitable as a cryptographic signature. Use SHA256 or SHA3 instead. [confidence medium]","path":"scrapling/spiders/templates/site_to_markdown.py","line":91,"fingerprint":"python.lang.security.insecure-hash-algorithm-sha1:scrapling/spiders/templates/site_to_markdown.py:91"}],"evidence":[],"data":{"rulesets":["python","javascript","dockerfile"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"ok","tool_version":"osv-scanner version: 2.7.1","metrics":{"vulnerable_packages":1.0,"vulnerabilities":3.0,"vulns_critical":1.0,"vulns_high":2.0,"vulns_medium":0.0,"vulns_low":0.0,"vulns_unknown":0.0,"penalty":15.0},"findings":[{"rule_id":"osv/PYSEC-2026-2120","severity":"critical","message":"black@26.1.0 (PyPI) is affected by PYSEC-2026-2120","path":"docs/requirements.txt","line":null,"fingerprint":"black@26.1.0 (PyPI):PYSEC-2026-2120"},{"rule_id":"osv/GHSA-3936-cmfr-pm3m","severity":"high","message":"black@26.1.0 (PyPI) is affected by PYSEC-2026-2121, GHSA-3936-cmfr-pm3m","path":"docs/requirements.txt","line":null,"fingerprint":"black@26.1.0 (PyPI):GHSA-3936-cmfr-pm3m"},{"rule_id":"osv/GHSA-cg8m-r9f2-5wm2","severity":"high","message":"black@26.1.0 (PyPI) is affected by GHSA-cg8m-r9f2-5wm2","path":"docs/requirements.txt","line":null,"fingerprint":"black@26.1.0 (PyPI):GHSA-cg8m-r9f2-5wm2"}],"evidence":[],"data":{"ecosystems":["PyPI"]},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"ok","tool_version":"zizmor 1.32.0","metrics":{"workflows":5.0,"findings":33.0,"findings_high":22.0,"findings_medium":2.0,"findings_low":9.0,"penalty":270.0},"findings":[{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/code-quality.yml","line":46,"fingerprint":"unpinned-uses:.github/workflows/code-quality.yml:46"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/code-quality.yml","line":51,"fingerprint":"unpinned-uses:.github/workflows/code-quality.yml:51"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/code-quality.yml","line":186,"fingerprint":"unpinned-uses:.github/workflows/code-quality.yml:186"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/docker-build.yml","line":29,"fingerprint":"unpinned-uses:.github/workflows/docker-build.yml:29"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/docker-build.yml","line":48,"fingerprint":"unpinned-uses:.github/workflows/docker-build.yml:48"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/docker-build.yml","line":53,"fingerprint":"unpinned-uses:.github/workflows/docker-build.yml:53"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/docker-build.yml","line":60,"fingerprint":"unpinned-uses:.github/workflows/docker-build.yml:60"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/docker-build.yml","line":68,"fingerprint":"unpinned-uses:.github/workflows/docker-build.yml:68"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/docker-build.yml","line":90,"fingerprint":"unpinned-uses:.github/workflows/docker-build.yml:90"},{"rule_id":"zizmor/template-injection","severity":"high","message":"code injection via template expansion [confidence high]","path":".github/workflows/release-and-publish.yml","line":27,"fingerprint":"template-injection:.github/workflows/release-and-publish.yml:27"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release-and-publish.yml","line":21,"fingerprint":"unpinned-uses:.github/workflows/release-and-publish.yml:21"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release-and-publish.yml","line":30,"fingerprint":"unpinned-uses:.github/workflows/release-and-publish.yml:30"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release-and-publish.yml","line":49,"fingerprint":"unpinned-uses:.github/workflows/release-and-publish.yml:49"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release-and-publish.yml","line":60,"fingerprint":"unpinned-uses:.github/workflows/release-and-publish.yml:60"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release-and-publish.yml","line":74,"fingerprint":"unpinned-uses:.github/workflows/release-and-publish.yml:74"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/stale.yml","line":11,"fingerprint":"unpinned-uses:.github/workflows/stale.yml:11"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/tests.yml","line":62,"fingerprint":"unpinned-uses:.github/workflows/tests.yml:62"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/tests.yml","line":65,"fingerprint":"unpinned-uses:.github/workflows/tests.yml:65"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/tests.yml","line":87,"fingerprint":"unpinned-uses:.github/workflows/tests.yml:87"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/tests.yml","line":110,"fingerprint":"unpinned-uses:.github/workflows/tests.yml:110"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/tests.yml","line":128,"fingerprint":"unpinned-uses:.github/workflows/tests.yml:128"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/tests.yml","line":138,"fingerprint":"unpinned-uses:.github/workflows/tests.yml:138"},{"rule_id":"zizmor/excessive-permissions","severity":"medium","message":"overly broad permissions [confidence medium]","path":".github/workflows/stale.yml","line":8,"fingerprint":"excessive-permissions:.github/workflows/stale.yml:8"},{"rule_id":"zizmor/excessive-permissions","severity":"medium","message":"overly broad permissions [confidence medium]","path":".github/workflows/tests.yml","line":37,"fingerprint":"excessive-permissions:.github/workflows/tests.yml:37"},{"rule_id":"zizmor/artipacked","severity":"low","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/code-quality.yml","line":45,"fingerprint":"artipacked:.github/workflows/code-quality.yml:45"},{"rule_id":"zizmor/artipacked","severity":"low","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/docker-build.yml","line":28,"fingerprint":"artipacked:.github/workflows/docker-build.yml:28"},{"rule_id":"zizmor/artipacked","severity":"low","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/release-and-publish.yml","line":21,"fingerprint":"artipacked:.github/workflows/release-and-publish.yml:21"},{"rule_id":"zizmor/artipacked","severity":"low","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/tests.yml","line":62,"fingerprint":"artipacked:.github/workflows/tests.yml:62"},{"rule_id":"zizmor/template-injection","severity":"info","message":"code injection via template expansion [confidence low]","path":".github/workflows/docker-build.yml","line":103,"fingerprint":"template-injection:.github/workflows/docker-build.yml:103"},{"rule_id":"zizmor/template-injection","severity":"info","message":"code injection via template expansion [confidence low]","path":".github/workflows/release-and-publish.yml","line":39,"fingerprint":"template-injection:.github/workflows/release-and-publish.yml:39"},{"rule_id":"zizmor/superfluous-actions","severity":"info","message":"action functionality is already included by the runner [confidence high]","path":".github/workflows/release-and-publish.yml","line":49,"fingerprint":"superfluous-actions:.github/workflows/release-and-publish.yml:49"},{"rule_id":"zizmor/template-injection","severity":"info","message":"code injection via template expansion [confidence low]","path":".github/workflows/tests.yml","line":100,"fingerprint":"template-injection:.github/workflows/tests.yml:100"},{"rule_id":"zizmor/template-injection","severity":"info","message":"code injection via template expansion [confidence low]","path":".github/workflows/tests.yml","line":101,"fingerprint":"template-injection:.github/workflows/tests.yml:101"}],"evidence":[],"data":{},"error":null},{"analyzer":"sec-posture","pillar":"security","status":"ok","tool_version":null,"metrics":{"check:security_policy":0.0,"check:dependency_updates":0.0,"check:signed_commits":0.0,"check:lockfiles":1.0,"signed_commit_share":0.205,"unpinned_manifests":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-distribution","pillar":"security","status":"ok","tool_version":null,"metrics":{"signals":0.0,"binary_assets":0.0,"suspicious":0.0},"findings":[],"evidence":[],"data":{"signals":[],"suspicious":false,"unusual_traction":false,"metadata":true},"error":null},{"analyzer":"qual-complexity","pillar":"quality","status":"ok","tool_version":"lizard 1.25.1","metrics":{"functions":580.0,"function_nloc":6952.0,"mean_ccn":3.78,"p90_ccn":8.0,"complex_functions":22.0,"long_functions":2.0,"many_param_functions":22.0,"risky_nloc_share":0.2117},"findings":[],"evidence":[{"kind":"complex-function","description":"_cloudflare_solver in scrapling/engines/_browsers/_stealth.py: complexity 37, 95 lines","ref":"scrapling/engines/_browsers/_stealth.py","url":"https://github.com/D4Vinci/Scrapling/blob/bb223f2f5fc8f743772751a5ce283ef7851ca6be/scrapling/engines/_browsers/_stealth.py#L107","weight":0.6166666666666667},{"kind":"complex-function","description":"_cloudflare_solver in scrapling/engines/_browsers/_stealth.py: complexity 37, 100 lines","ref":"scrapling/engines/_browsers/_stealth.py","url":"https://github.com/D4Vinci/Scrapling/blob/bb223f2f5fc8f743772751a5ce283ef7851ca6be/scrapling/engines/_browsers/_stealth.py#L419","weight":0.6166666666666667},{"kind":"complex-function","description":"_run_actions in scrapling/core/ai/_browser_actions.py: complexity 35, 91 lines","ref":"scrapling/core/ai/_browser_actions.py","url":"https://github.com/D4Vinci/Scrapling/blob/bb223f2f5fc8f743772751a5ce283ef7851ca6be/scrapling/core/ai/_browser_actions.py#L180","weight":0.5833333333333334},{"kind":"complex-function","description":"parse in scrapling/core/shell.py: complexity 34, 115 lines","ref":"scrapling/core/shell.py","url":"https://github.com/D4Vinci/Scrapling/blob/bb223f2f5fc8f743772751a5ce283ef7851ca6be/scrapling/core/shell.py#L192","weight":0.5666666666666667},{"kind":"complex-function","description":"find_all in scrapling/parser.py: complexity 33, 67 lines","ref":"scrapling/parser.py","url":"https://github.com/D4Vinci/Scrapling/blob/bb223f2f5fc8f743772751a5ce283ef7851ca6be/scrapling/parser.py#L710","weight":0.55},{"kind":"complex-function","description":"from_playwright_response in scrapling/engines/toolbelt/convertor.py: complexity 27, 74 lines","ref":"scrapling/engines/toolbelt/convertor.py","url":"https://github.com/D4Vinci/Scrapling/blob/bb223f2f5fc8f743772751a5ce283ef7851ca6be/scrapling/engines/toolbelt/convertor.py#L157","weight":0.45},{"kind":"complex-function","description":"from_async_playwright_response in scrapling/engines/toolbelt/convertor.py: complexity 27, 74 lines","ref":"scrapling/engines/toolbelt/convertor.py","url":"https://github.com/D4Vinci/Scrapling/blob/bb223f2f5fc8f743772751a5ce283ef7851ca6be/scrapling/engines/toolbelt/convertor.py#L332","weight":0.45},{"kind":"complex-function","description":"fetch in scrapling/engines/_browsers/_stealth.py: complexity 22, 78 lines","ref":"scrapling/engines/_browsers/_stealth.py","url":"https://github.com/D4Vinci/Scrapling/blob/bb223f2f5fc8f743772751a5ce283ef7851ca6be/scrapling/engines/_browsers/_stealth.py#L224","weight":0.36666666666666664},{"kind":"complex-function","description":"fetch in scrapling/engines/_browsers/_stealth.py: complexity 22, 78 lines","ref":"scrapling/engines/_browsers/_stealth.py","url":"https://github.com/D4Vinci/Scrapling/blob/bb223f2f5fc8f743772751a5ce283ef7851ca6be/scrapling/engines/_browsers/_stealth.py#L541","weight":0.36666666666666664},{"kind":"complex-function","description":"crawl in scrapling/spiders/engine.py: complexity 22, 72 lines","ref":"scrapling/spiders/engine.py","url":"https://github.com/D4Vinci/Scrapling/blob/bb223f2f5fc8f743772751a5ce283ef7851ca6be/scrapling/spiders/engine.py#L356","weight":0.36666666666666664}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":13663.0,"duplicated_lines":1418.0,"duplicated_share":0.1038,"files":69.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: agent-skill/Scrapling-Skill/examples/01_fetcher_session.py:20 and agent-skill/Scrapling-Skill/examples/02_browser_session.py:20","ref":"agent-skill/Scrapling-Skill/examples/01_fetcher_session.py","url":"https://github.com/D4Vinci/Scrapling/blob/bb223f2f5fc8f743772751a5ce283ef7851ca6be/agent-skill/Scrapling-Skill/examples/01_fetcher_session.py#L20","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: agent-skill/Scrapling-Skill/examples/02_browser_session.py:18 and agent-skill/Scrapling-Skill/examples/03_stealthy_session.py:18","ref":"agent-skill/Scrapling-Skill/examples/02_browser_session.py","url":"https://github.com/D4Vinci/Scrapling/blob/bb223f2f5fc8f743772751a5ce283ef7851ca6be/agent-skill/Scrapling-Skill/examples/02_browser_session.py#L18","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scrapling/__init__.py:26 and scrapling/fetchers/__init__.py:35","ref":"scrapling/__init__.py","url":"https://github.com/D4Vinci/Scrapling/blob/bb223f2f5fc8f743772751a5ce283ef7851ca6be/scrapling/__init__.py#L26","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scrapling/cli.py:241 and scrapling/cli.py:295","ref":"scrapling/cli.py","url":"https://github.com/D4Vinci/Scrapling/blob/bb223f2f5fc8f743772751a5ce283ef7851ca6be/scrapling/cli.py#L241","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scrapling/core/ai/server.py:288 and scrapling/core/ai/server.py:818","ref":"scrapling/core/ai/server.py","url":"https://github.com/D4Vinci/Scrapling/blob/bb223f2f5fc8f743772751a5ce283ef7851ca6be/scrapling/core/ai/server.py#L288","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scrapling/core/custom_types.py:127 and scrapling/core/custom_types.py:138","ref":"scrapling/core/custom_types.py","url":"https://github.com/D4Vinci/Scrapling/blob/bb223f2f5fc8f743772751a5ce283ef7851ca6be/scrapling/core/custom_types.py#L127","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scrapling/core/custom_types.py:246 and scrapling/parser.py:1314","ref":"scrapling/core/custom_types.py","url":"https://github.com/D4Vinci/Scrapling/blob/bb223f2f5fc8f743772751a5ce283ef7851ca6be/scrapling/core/custom_types.py#L246","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scrapling/engines/_browsers/_base.py:49 and scrapling/engines/_browsers/_base.py:258","ref":"scrapling/engines/_browsers/_base.py","url":"https://github.com/D4Vinci/Scrapling/blob/bb223f2f5fc8f743772751a5ce283ef7851ca6be/scrapling/engines/_browsers/_base.py#L49","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scrapling/engines/_browsers/_network.py:48 and scrapling/engines/_browsers/_network.py:60","ref":"scrapling/engines/_browsers/_network.py","url":"https://github.com/D4Vinci/Scrapling/blob/bb223f2f5fc8f743772751a5ce283ef7851ca6be/scrapling/engines/_browsers/_network.py#L48","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: scrapling/engines/_browsers/_remote.py:25 and scrapling/engines/_browsers/_remote.py:54","ref":"scrapling/engines/_browsers/_remote.py","url":"https://github.com/D4Vinci/Scrapling/blob/bb223f2f5fc8f743772751a5ce283ef7851ca6be/scrapling/engines/_browsers/_remote.py#L25","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":9.0,"weighted_findings":11.0,"scanned_lines":16661.0,"category:best-practice":5.0,"category:maintainability":4.0},"findings":[{"rule_id":"opengrep/python.lang.maintainability.useless-inner-function","severity":"high","message":"function `run` is defined inside a function but never used","path":"scrapling/spiders/engine.py","line":468,"fingerprint":"python.lang.maintainability.useless-inner-function:scrapling/spiders/engine.py:468"},{"rule_id":"opengrep/python.requests.best-practice.use-raise-for-status","severity":"medium","message":"There's an HTTP request made with requests, but the raise_for_status() utility method isn't used. This can result in request errors going unnoticed and your code behaving in unexpected ways, such as if your authorization API returns a 500 error while you're only checking for a 401.","path":"benchmarks.py","line":138,"fingerprint":"python.requests.best-practice.use-raise-for-status:benchmarks.py:138"},{"rule_id":"opengrep/python.requests.best-practice.use-timeout","severity":"medium","message":"Detected a 'requests' call without a timeout set. By default, 'requests' calls wait until the connection is closed. This means a 'requests' call without a timeout will hang the program if a response is never received. Consider setting a timeout for all 'requests'.","path":"benchmarks.py","line":138,"fingerprint":"python.requests.best-practice.use-timeout:benchmarks.py:138"},{"rule_id":"opengrep/python.lang.best-practice.pass-body-fn","severity":"medium","message":"`pass` is the body of function main. Consider removing this or raise NotImplementedError() if this is a TODO","path":"scrapling/cli.py","line":664,"fingerprint":"python.lang.best-practice.pass-body-fn:scrapling/cli.py:664"},{"rule_id":"opengrep/python.lang.maintainability.return-not-in-function","severity":"medium","message":"`return` only makes sense inside a function","path":"scrapling/core/ai/server.py","line":160,"fingerprint":"python.lang.maintainability.return-not-in-function:scrapling/core/ai/server.py:160"},{"rule_id":"opengrep/python.lang.best-practice.unspecified-open-encoding","severity":"medium","message":"Missing 'encoding' parameter. 'open()' uses device locale encodings by default, corrupting files with special characters. Specify the encoding to ensure cross-platform support when opening files in text mode (e.g. encoding=\"utf-8\").","path":"scrapling/core/shell.py","line":424,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:scrapling/core/shell.py:424"},{"rule_id":"opengrep/python.lang.best-practice.unspecified-open-encoding","severity":"medium","message":"Missing 'encoding' parameter. 'open()' uses device locale encodings by default, corrupting files with special characters. Specify the encoding to ensure cross-platform support when opening files in text mode (e.g. encoding=\"utf-8\").","path":"scrapling/core/shell.py","line":729,"fingerprint":"python.lang.best-practice.unspecified-open-encoding:scrapling/core/shell.py:729"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_tail\" a function or an attribute? If it is a function, you may have meant text_node.is_tail() because text_node.is_tail is always true.","path":"scrapling/parser.py","line":327,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:scrapling/parser.py:327"},{"rule_id":"opengrep/python.lang.maintainability.is-function-without-parentheses","severity":"medium","message":"Is \"is_empty\" a function or an attribute? If it is a function, you may have meant self.scheduler.is_empty() because self.scheduler.is_empty is always true.","path":"scrapling/spiders/engine.py","line":419,"fingerprint":"python.lang.maintainability.is-function-without-parentheses:scrapling/spiders/engine.py:419"}],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":1.0,"check:test_ratio":1.0,"check:ci_present":1.0,"check:ci_runs_tests":1.0,"check:ci_runs_lint":1.0,"check:tests_cochange":1.0,"test_lines":27193.0,"source_lines":16661.0,"test_ratio":1.6321,"ci_files":5.0,"cochange_share":0.7532,"cochange_commits":158.0},"findings":[],"evidence":[{"kind":"ci","description":"CI config: .github/workflows/code-quality.yml","ref":".github/workflows/code-quality.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/docker-build.yml","ref":".github/workflows/docker-build.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/release-and-publish.yml","ref":".github/workflows/release-and-publish.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/stale.yml","ref":".github/workflows/stale.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/tests.yml","ref":".github/workflows/tests.yml","url":null,"weight":0.0},{"kind":"ci","description":"CI runs tests (tox)","ref":null,"url":null,"weight":0.0},{"kind":"ci","description":"CI runs linters (ruff, mypy, pyright, pre-commit)","ref":null,"url":null,"weight":0.0}],"data":{"test_commands":["tox"],"lint_commands":["ruff","mypy","pyright","pre-commit"]},"error":null},{"analyzer":"qual-docs","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:readme":1.0,"check:license":1.0,"check:contributing":1.0,"check:changelog":1.0,"readme_lines":527.0},"findings":[],"evidence":[{"kind":"docs","description":"README.md","ref":"README.md","url":null,"weight":0.0},{"kind":"docs","description":"LICENSE","ref":"LICENSE","url":null,"weight":0.0},{"kind":"docs","description":"CONTRIBUTING.md","ref":"CONTRIBUTING.md","url":null,"weight":0.0},{"kind":"docs","description":"docs/changelog.md","ref":"docs/changelog.md","url":null,"weight":0.0}],"data":{},"error":null},{"analyzer":"qual-type-safety","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:strict_config":0.0,"check:low_escape_density":0.0,"escapes":233.0,"escapes_per_kloc":13.996},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"x-blame","pillar":"ai_provenance","status":"ok","tool_version":"git-blame","metrics":{"ai_lines":15.0,"other_lines":16646.0,"files_blamed":69.0,"blame_failures":0.0,"quality:ai_findings":0.0,"quality:ai_per_kloc":0.0,"quality:other_findings":9.0,"quality:other_per_kloc":0.541,"security:ai_findings":0.0,"security:ai_per_kloc":0.0,"security:other_findings":7.0,"security:other_per_kloc":0.421},"findings":[],"evidence":[],"data":{"sampled":false,"comparable":false},"error":null}],"flags":[]}