{"id":5399,"date":"2026-05-15T15:41:56","date_gmt":"2026-05-15T15:41:56","guid":{"rendered":"https:\/\/screamingfrog.club\/?p=5399"},"modified":"2026-05-15T15:41:56","modified_gmt":"2026-05-15T15:41:56","slug":"how-to-open-screaming-frog-crawls-in-python","status":"publish","type":"post","link":"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/","title":{"rendered":"How to Open Screaming Frog Crawls Directly in Python"},"content":{"rendered":"<div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container has-pattern-background has-mask-background nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:1248px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:20px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-1 fusion-title-center fusion-title-text fusion-title-size-two\" style=\"--awb-text-color:#141617;--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-font-size:40px;\"><div class=\"title-sep-container title-sep-container-left\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><span class=\"awb-title-spacer\"><\/span><h2 class=\"fusion-title-heading title-heading-center awb-gradient-text fusion-responsive-typography-calculated\" style=\"font-family:&quot;Work Sans&quot;;font-style:normal;font-weight:800;margin:0;letter-spacing:-0.012em;text-transform:var(--awb-typography1-text-transform);background-color:#f79501;background-image:linear-gradient(150deg, #f79501 20%,#fe6996 100%);font-size:1em;--fontSize:40;line-height:1;\"><span style=\"font-weight: 400;\">How to Open Screaming Frog Crawls Directly in Python with the screamingfrog Library<\/span><\/h2><span class=\"awb-title-spacer\"><\/span><div class=\"title-sep-container title-sep-container-right\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><\/div><div class=\"fusion-text fusion-text-1\"><p>Anyone who works in Screaming Frog on a regular basis knows the rhythm of an audit.<\/p>\n<p>The crawl finishes, you open the GUI, click into one of the reports, export to CSV, then spend a few minutes <a href=\"https:\/\/www.auditlabs.co\/tools\/data-analysis\/sheet-cleanup\">cleaning columns<\/a> before the actual analysis can begin.<\/p>\n<p>Multiply this by titles, response codes, <a href=\"https:\/\/screamingfrog.club\/en\/tab-inlinks-outlinks\/\">inlinks<\/a>, canonicals, <a href=\"https:\/\/screamingfrog.club\/en\/structured-data-analysis\/\">structured data<\/a>, and the other recurring reports, and you have already burned a good portion of the afternoon on what is, fundamentally, preparatory work.<\/p>\n<p>The <span style=\"color: #65bd7d;\"><strong>screamingfrog<\/strong><\/span> Python library was built precisely to skip this step. It opens a <strong><span style=\"color: #65bd7d;\">.dbseospider<\/span><\/strong> file directly inside Python and lets you query the underlying crawl through the same logical units that the GUI presents to the user: pages, links, and the individual report tabs.<\/p>\n<p>When the typed interface is not enough, the library also exposes raw SQL for those situations where the question is unusual. In my own workflow I have not exported a CSV from the GUI in several months, and I do not miss it.<\/p>\n<p>In this guide we will go through a series of operations against a real crawl file: loading the <strong><span style=\"color: #65bd7d;\">.dbseospider<\/span><\/strong>, querying pages and links, pulling familiar tab reports by name, scoping queries to a section of the site, and finally falling back on raw SQL when the typed API is not enough.<\/p>\n<p>The walkthrough closes with a short end-to-end example that ties the four interfaces together.<br \/>\nA clarification before we begin. The library is not a replacement for Screaming Frog itself, since the crawler remains the data source. It is a replacement for the export-clean-analyze loop that usually follows every crawl, which is a different proposition entirely.<\/p>\n<\/div><div class=\"fusion-title title fusion-title-2 fusion-title-center fusion-title-text fusion-title-size-two\" style=\"--awb-text-color:#141617;--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-font-size:40px;\"><div class=\"title-sep-container title-sep-container-left\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><span class=\"awb-title-spacer\"><\/span><h2 class=\"fusion-title-heading title-heading-center awb-gradient-text fusion-responsive-typography-calculated\" style=\"font-family:&quot;Work Sans&quot;;font-style:normal;font-weight:800;margin:0;letter-spacing:-0.012em;text-transform:var(--awb-typography1-text-transform);background-color:#f79501;background-image:linear-gradient(150deg, #f79501 20%,#fe6996 100%);font-size:1em;--fontSize:40;line-height:1;\">What the screamingfrog library changes<\/h2><span class=\"awb-title-spacer\"><\/span><div class=\"title-sep-container title-sep-container-right\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><\/div><div class=\"fusion-text fusion-text-2\"><p>Screaming Frog already stores the crawl in a <a href=\"https:\/\/screamingfrog.club\/en\/scanning-large-sites\/\">database-backed format<\/a>. The application reads from it, the GUI displays from it, and the exports come out of it. The <span style=\"color: #65bd7d;\">screamingfrog<\/span> Python library reads from that same crawl data and gives you a programmatic interface on top of it. Nothing is re-parsed from a CSV, and nothing is derived from the export pipeline.<br \/>\nThere are four main interfaces for asking questions of the crawl:<\/p>\n<ul>\n<li><span style=\"color: #65bd7d;\">pages()<\/span> for sitewide page-level analysis<\/li>\n<li><span style=\"color: #65bd7d;\">links()<\/span> for sitewide link-level analysis<\/li>\n<li><span style=\"color: #65bd7d;\">tab(&#8230;)<\/span> for a specific Screaming Frog report or export<\/li>\n<li><span style=\"color: #65bd7d;\">raw()<\/span> and <span style=\"color: #65bd7d;\">sql()<\/span> for custom queries and edge cases<\/li>\n<\/ul>\n<p>This tutorial focuses on the <span style=\"color: #65bd7d;\"><strong>.dbseospider<\/strong><\/span> format because it is the cleanest starting point. It is a self-contained crawl database that the library can open without spinning up the GUI or running a new crawl, so if you already have a <span style=\"color: #65bd7d;\"><strong>.dbseospider<\/strong><\/span> file from a previous audit, you can start working on it in Python immediately.<\/p>\n<\/div><div class=\"fusion-title title fusion-title-3 fusion-title-center fusion-title-text fusion-title-size-two\" style=\"--awb-text-color:#141617;--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-font-size:40px;\"><div class=\"title-sep-container title-sep-container-left\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><span class=\"awb-title-spacer\"><\/span><h2 class=\"fusion-title-heading title-heading-center awb-gradient-text fusion-responsive-typography-calculated\" style=\"font-family:&quot;Work Sans&quot;;font-style:normal;font-weight:800;margin:0;letter-spacing:-0.012em;text-transform:var(--awb-typography1-text-transform);background-color:#f79501;background-image:linear-gradient(150deg, #f79501 20%,#fe6996 100%);font-size:1em;--fontSize:40;line-height:1;\">Install the library and get a crawl file ready<\/h2><span class=\"awb-title-spacer\"><\/span><div class=\"title-sep-container title-sep-container-right\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><\/div><div class=\"fusion-text fusion-text-3\"><p>You need a Python environment and the screamingfrog package installed in it. The library is available on PyPI, so a regular pip install is the starting point in most setups.<\/p>\n<\/div><div class=\"fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color alert-dismissable awb-alert-close-boxed\" style=\"--awb-background-color:var(--awb-color6);--awb-accent-color:#ffffff;--awb-border-size:1px;--awb-border-top-left-radius:0px;--awb-border-top-right-radius:0px;--awb-border-bottom-left-radius:0px;--awb-border-bottom-right-radius:0px;\" role=\"alert\"><div class=\"fusion-alert-content-wrapper\"><span class=\"alert-icon\"><i class=\"fa-laptop-code fas\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-alert-content\"><p style=\"text-align: left;\">pip install screamingfrog<\/p><\/span><\/div><button style=\"color:#ffffff;border-color:#ffffff;\" type=\"button\" class=\"close toggle-alert\" data-dismiss=\"alert\" aria-label=\"Close\">&times;<\/button><\/div><div class=\"fusion-text fusion-text-4\"><p>If you plan to open <strong><span style=\"color: #65bd7d;\">.dbseospider<\/span> <\/strong>files directly, make sure a Java runtime is available on your system as well. The library reads the underlying Derby crawl database, and that requires Java to be present.<\/p>\n<p>You also need a <strong><span style=\"color: #65bd7d;\">.dbseospider<\/span><\/strong> file on disk. If you crawl in database storage mode, you already have one in your project folder. If you only have a <strong><span style=\"color: #65bd7d;\">.seospider<\/span><\/strong> file from a memory-only crawl, the library can convert it, but that is a slightly different workflow and we will not cover it here.<br \/>\nFor the rest of this guide, assume there is a file named <span style=\"color: #65bd7d;\"><strong>example-crawl.dbseospider<\/strong><\/span> sitting in the working directory of your script or notebook.<\/p>\n<\/div><div class=\"fusion-title title fusion-title-4 fusion-title-center fusion-title-text fusion-title-size-two\" style=\"--awb-text-color:#141617;--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-font-size:40px;\"><div class=\"title-sep-container title-sep-container-left\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><span class=\"awb-title-spacer\"><\/span><h2 class=\"fusion-title-heading title-heading-center awb-gradient-text fusion-responsive-typography-calculated\" style=\"font-family:&quot;Work Sans&quot;;font-style:normal;font-weight:800;margin:0;letter-spacing:-0.012em;text-transform:var(--awb-typography1-text-transform);background-color:#f79501;background-image:linear-gradient(150deg, #f79501 20%,#fe6996 100%);font-size:1em;--fontSize:40;line-height:1;\">Load a crawl in Python<\/h2><span class=\"awb-title-spacer\"><\/span><div class=\"title-sep-container title-sep-container-right\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><\/div><div class=\"fusion-text fusion-text-5\"><p>The entry point is <strong><span style=\"color: #65bd7d;\">Crawl.load(&#8230;)<\/span><\/strong>. You give it a path, and you get back a <strong><span style=\"color: #65bd7d;\">Crawl<\/span><\/strong> object that holds the open connection to the crawl data.<\/p>\n<\/div><div class=\"fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color alert-dismissable awb-alert-close-boxed\" style=\"--awb-background-color:var(--awb-color6);--awb-accent-color:#ffffff;--awb-border-size:1px;--awb-border-top-left-radius:0px;--awb-border-top-right-radius:0px;--awb-border-bottom-left-radius:0px;--awb-border-bottom-right-radius:0px;\" role=\"alert\"><div class=\"fusion-alert-content-wrapper\"><span class=\"alert-icon\"><i class=\"fa-laptop-code fas\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-alert-content\">from screamingfrog import Crawl<\/p>\n<p>crawl = Crawl.load(&#8220;example-crawl.dbseospider&#8221;)<\/span><\/div><button style=\"color:#ffffff;border-color:#ffffff;\" type=\"button\" class=\"close toggle-alert\" data-dismiss=\"alert\" aria-label=\"Close\">&times;<\/button><\/div><div class=\"fusion-text fusion-text-6\"><p>That, somewhat anticlimactically, is the entire setup. The crawl is now open and ready to be queried.<br \/>\nIf you want a quick look at what is inside the file before writing any real queries, the attribute <strong><span style=\"color: #65bd7d;\">crawl.tabs<\/span><\/strong> lists the tabs that the backend knows about.<\/p>\n<\/div><div class=\"fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color alert-dismissable awb-alert-close-boxed\" style=\"--awb-background-color:var(--awb-color6);--awb-accent-color:#ffffff;--awb-border-size:1px;--awb-border-top-left-radius:0px;--awb-border-top-right-radius:0px;--awb-border-bottom-left-radius:0px;--awb-border-bottom-right-radius:0px;\" role=\"alert\"><div class=\"fusion-alert-content-wrapper\"><span class=\"alert-icon\"><i class=\"fa-laptop-code fas\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-alert-content\">crawl.tabs[:10]\n<p># e.g. [&#8216;internal_all&#8217;, &#8216;page_titles&#8217;, &#8216;response_codes_all&#8217;, &#8230;]<\/span><\/div><button style=\"color:#ffffff;border-color:#ffffff;\" type=\"button\" class=\"close toggle-alert\" data-dismiss=\"alert\" aria-label=\"Close\">&times;<\/button><\/div><div class=\"fusion-text fusion-text-7\"><p>There is one distinction worth noting at this stage. You are not loading an export. You are loading the crawl itself. Every query runs against the crawl data rather than a CSV export, with the .dbseospider file remaining the source of truth.<\/p>\n<\/div><div class=\"fusion-title title fusion-title-5 fusion-title-center fusion-title-text fusion-title-size-two\" style=\"--awb-text-color:#141617;--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-font-size:40px;\"><div class=\"title-sep-container title-sep-container-left\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><span class=\"awb-title-spacer\"><\/span><h2 class=\"fusion-title-heading title-heading-center awb-gradient-text fusion-responsive-typography-calculated\" style=\"font-family:&quot;Work Sans&quot;;font-style:normal;font-weight:800;margin:0;letter-spacing:-0.012em;text-transform:var(--awb-typography1-text-transform);background-color:#f79501;background-image:linear-gradient(150deg, #f79501 20%,#fe6996 100%);font-size:1em;--fontSize:40;line-height:1;\">Query pages sitewide with pages()<\/h2><span class=\"awb-title-spacer\"><\/span><div class=\"title-sep-container title-sep-container-right\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><\/div><div class=\"fusion-text fusion-text-8\"><p>For the majority of audit questions that begin with \u201cwhich pages\u2026\u201d, the answer lives in <strong><span style=\"color: #65bd7d;\">pages()<\/span><\/strong>. It is the sitewide page view of the crawl, and in spirit it corresponds to the <a href=\"https:\/\/screamingfrog.club\/en\/internal-tab\/\">Internal All tab in the GUI<\/a>, exposed here as a chainable query interface.<br \/>\nThe simplest invocation collects everything in a single call:<\/p>\n<\/div><div class=\"fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color alert-dismissable awb-alert-close-boxed\" style=\"--awb-background-color:var(--awb-color6);--awb-accent-color:#ffffff;--awb-border-size:1px;--awb-border-top-left-radius:0px;--awb-border-top-right-radius:0px;--awb-border-bottom-left-radius:0px;--awb-border-bottom-right-radius:0px;\" role=\"alert\"><div class=\"fusion-alert-content-wrapper\"><span class=\"alert-icon\"><i class=\"fa-laptop-code fas\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-alert-content\">crawl.pages().collect()<\/span><\/div><button style=\"color:#ffffff;border-color:#ffffff;\" type=\"button\" class=\"close toggle-alert\" data-dismiss=\"alert\" aria-label=\"Close\">&times;<\/button><\/div><div class=\"fusion-text fusion-text-9\"><p>The method <strong><span style=\"color: #65bd7d;\">.collect()<\/span><\/strong> materializes the result as a list of dictionaries. Each row is a page, with its tracked columns attached.<br \/>\nIn day-to-day work you will almost never want the full unfiltered result. The filter is normally applied first:<\/p>\n<\/div><div class=\"fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color alert-dismissable awb-alert-close-boxed\" style=\"--awb-background-color:var(--awb-color6);--awb-accent-color:#ffffff;--awb-border-size:1px;--awb-border-top-left-radius:0px;--awb-border-top-right-radius:0px;--awb-border-bottom-left-radius:0px;--awb-border-bottom-right-radius:0px;\" role=\"alert\"><div class=\"fusion-alert-content-wrapper\"><span class=\"alert-icon\"><i class=\"fa-laptop-code fas\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-alert-content\">crawl.pages().filter(status_code=404).collect()<\/span><\/div><button style=\"color:#ffffff;border-color:#ffffff;\" type=\"button\" class=\"close toggle-alert\" data-dismiss=\"alert\" aria-label=\"Close\">&times;<\/button><\/div><div class=\"fusion-text fusion-text-10\"><p>The call <span style=\"color: #65bd7d;\"><strong>.filter(status_code=404)<\/strong><\/span> is the most common shape you will end up writing, and it is the easiest entry point into the API. The keyword arguments correspond to normalized Screaming Frog field names. The same style works for values like <strong><span style=\"color: #65bd7d;\">indexability=&#8221;Non-Indexable&#8221;<\/span><\/strong> and other recurring filters.<br \/>\nWhen the rows still carry too many columns to read at a glance, narrow them with <strong><span style=\"color: #65bd7d;\">.select(&#8230;)<\/span><\/strong>:<\/p>\n<\/div><div class=\"fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color alert-dismissable awb-alert-close-boxed\" style=\"--awb-background-color:var(--awb-color6);--awb-accent-color:#ffffff;--awb-border-size:1px;--awb-border-top-left-radius:0px;--awb-border-top-right-radius:0px;--awb-border-bottom-left-radius:0px;--awb-border-bottom-right-radius:0px;\" role=\"alert\"><div class=\"fusion-alert-content-wrapper\"><span class=\"alert-icon\"><i class=\"fa-laptop-code fas\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-alert-content\">crawl.pages().filter(status_code=404).select(&#8220;Address&#8221;, &#8220;Title 1&#8221;, &#8220;H1-1&#8221;).collect()<\/span><\/div><button style=\"color:#ffffff;border-color:#ffffff;\" type=\"button\" class=\"close toggle-alert\" data-dismiss=\"alert\" aria-label=\"Close\">&times;<\/button><\/div><div class=\"fusion-text fusion-text-11\"><p>This is the pattern you will reach for most often. Select the columns you actually need, filter to the rows that matter, and then call <strong><span style=\"color: #65bd7d;\">collect()<\/span><\/strong>. The same chain handles <a href=\"https:\/\/www.auditlabs.co\/tools\/technical-seo\/http-status-checker\">404 lists<\/a>, non-indexable page audits, and <a href=\"https:\/\/screamingfrog.club\/en\/meta-tag\/\">title QA<\/a> without any structural change.<br \/>\nIf the question starts with \u201cwhich pages\u2026\u201d, you should start with <span style=\"color: #65bd7d;\"><strong>pages()<\/strong><\/span>.<\/p>\n<\/div><div class=\"fusion-title title fusion-title-6 fusion-title-center fusion-title-text fusion-title-size-two\" style=\"--awb-text-color:#141617;--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-font-size:40px;\"><div class=\"title-sep-container title-sep-container-left\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><span class=\"awb-title-spacer\"><\/span><h2 class=\"fusion-title-heading title-heading-center awb-gradient-text fusion-responsive-typography-calculated\" style=\"font-family:&quot;Work Sans&quot;;font-style:normal;font-weight:800;margin:0;letter-spacing:-0.012em;text-transform:var(--awb-typography1-text-transform);background-color:#f79501;background-image:linear-gradient(150deg, #f79501 20%,#fe6996 100%);font-size:1em;--fontSize:40;line-height:1;\">Query the link graph with links()<\/h2><span class=\"awb-title-spacer\"><\/span><div class=\"title-sep-container title-sep-container-right\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><\/div><div class=\"fusion-text fusion-text-12\"><p>Page-level data and link-level data are not interchangeable, and they answer different audit questions. A URL returning 404 is one piece of information. The set of internal pages still linking to that URL is the piece of information that actually allows the fix to be deployed. The function links() is the interface for the second category.<\/p>\n<p>The call <strong><span style=\"color: #65bd7d;\">links(&#8220;in&#8221;)<\/span><\/strong> returns the inlink view, that is, what links point at a given destination. The call <strong><span style=\"color: #65bd7d;\">links(&#8220;out&#8221;)<\/span><\/strong> returns the outlink view, that is, what a given source page links to. The default direction is <strong><span style=\"color: #65bd7d;\">&#8220;out&#8221;<\/span><\/strong>.<\/p>\n<p>A good place to start is to look at what a single row actually contains:<\/p>\n<\/div><div class=\"fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color alert-dismissable awb-alert-close-boxed\" style=\"--awb-background-color:var(--awb-color6);--awb-accent-color:#ffffff;--awb-border-size:1px;--awb-border-top-left-radius:0px;--awb-border-top-right-radius:0px;--awb-border-bottom-left-radius:0px;--awb-border-bottom-right-radius:0px;\" role=\"alert\"><div class=\"fusion-alert-content-wrapper\"><span class=\"alert-icon\"><i class=\"fa-laptop-code fas\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-alert-content\">crawl.links(&#8220;in&#8221;).select(&#8220;Source&#8221;, &#8220;Address&#8221;, &#8220;Status Code&#8221;, &#8220;Anchor&#8221;).collect()[:5]<\/span><\/div><button style=\"color:#ffffff;border-color:#ffffff;\" type=\"button\" class=\"close toggle-alert\" data-dismiss=\"alert\" aria-label=\"Close\">&times;<\/button><\/div><div class=\"fusion-text fusion-text-13\"><p>The most useful audit question that follows on top of this view is broken inlinks. Which source pages still link to URLs that now return a 4xx?<\/p>\n<\/div><div class=\"fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color alert-dismissable awb-alert-close-boxed\" style=\"--awb-background-color:var(--awb-color6);--awb-accent-color:#ffffff;--awb-border-size:1px;--awb-border-top-left-radius:0px;--awb-border-top-right-radius:0px;--awb-border-bottom-left-radius:0px;--awb-border-bottom-right-radius:0px;\" role=\"alert\"><div class=\"fusion-alert-content-wrapper\"><span class=\"alert-icon\"><i class=\"fa-laptop-code fas\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-alert-content\">crawl.links(&#8220;in&#8221;).filter(status_code=404).collect()<\/span><\/div><button style=\"color:#ffffff;border-color:#ffffff;\" type=\"button\" class=\"close toggle-alert\" data-dismiss=\"alert\" aria-label=\"Close\">&times;<\/button><\/div><div class=\"fusion-text fusion-text-14\"><p>What this returns is a per-link list, not a per-destination list. A single broken URL with eight internal references will appear as eight separate rows. That is usually what you want when the deliverable is \u201cgo and fix the eight places that still link here,\u201d because the unit of remediation is the source page, not the destination.<\/p>\n<p>Another common workflow is nofollow inlinks. This is useful when you suspect internal links are wasting equity, or when a template was updated incorrectly and is now emitting nofollow attributes where it should not:<\/p>\n<\/div><div class=\"fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color alert-dismissable awb-alert-close-boxed\" style=\"--awb-background-color:var(--awb-color6);--awb-accent-color:#ffffff;--awb-border-size:1px;--awb-border-top-left-radius:0px;--awb-border-top-right-radius:0px;--awb-border-bottom-left-radius:0px;--awb-border-bottom-right-radius:0px;\" role=\"alert\"><div class=\"fusion-alert-content-wrapper\"><span class=\"alert-icon\"><i class=\"fa-laptop-code fas\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-alert-content\">crawl.links(&#8220;in&#8221;).filter(rel=&#8221;nofollow&#8221;).select(&#8220;Source&#8221;, &#8220;Address&#8221;, &#8220;Anchor&#8221;, &#8220;Rel&#8221;).collect()<\/span><\/div><button style=\"color:#ffffff;border-color:#ffffff;\" type=\"button\" class=\"close toggle-alert\" data-dismiss=\"alert\" aria-label=\"Close\">&times;<\/button><\/div><div class=\"fusion-text fusion-text-15\"><p>If the question starts with \u201cwhich links\u2026\u201d, you should start with links().<\/p>\n<\/div><div class=\"fusion-title title fusion-title-7 fusion-title-center fusion-title-text fusion-title-size-two\" style=\"--awb-text-color:#141617;--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-font-size:40px;\"><div class=\"title-sep-container title-sep-container-left\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><span class=\"awb-title-spacer\"><\/span><h2 class=\"fusion-title-heading title-heading-center awb-gradient-text fusion-responsive-typography-calculated\" style=\"font-family:&quot;Work Sans&quot;;font-style:normal;font-weight:800;margin:0;letter-spacing:-0.012em;text-transform:var(--awb-typography1-text-transform);background-color:#f79501;background-image:linear-gradient(150deg, #f79501 20%,#fe6996 100%);font-size:1em;--fontSize:40;line-height:1;\">Access familiar Screaming Frog reports with tab()<\/h2><span class=\"awb-title-spacer\"><\/span><div class=\"title-sep-container title-sep-container-right\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><\/div><div class=\"fusion-text fusion-text-16\"><p>If you have used Screaming Frog for any length of time, you already think about your data in terms of reports. Page Titles. Response Codes. Internal All. The function tab(&#8230;) is the bridge between that mental model and the code.<br \/>\nYou pass the tab name as it appears in the export structure, and you get a chainable view of its rows in return.<\/p>\n<\/div><div class=\"fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color alert-dismissable awb-alert-close-boxed\" style=\"--awb-background-color:var(--awb-color6);--awb-accent-color:#ffffff;--awb-border-size:1px;--awb-border-top-left-radius:0px;--awb-border-top-right-radius:0px;--awb-border-bottom-left-radius:0px;--awb-border-bottom-right-radius:0px;\" role=\"alert\"><div class=\"fusion-alert-content-wrapper\"><span class=\"alert-icon\"><i class=\"fa-laptop-code fas\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-alert-content\">crawl.tab(&#8220;page_titles&#8221;).collect()<\/span><\/div><button style=\"color:#ffffff;border-color:#ffffff;\" type=\"button\" class=\"close toggle-alert\" data-dismiss=\"alert\" aria-label=\"Close\">&times;<\/button><\/div><div class=\"fusion-text fusion-text-17\"><p>The filters that you see in the GUI dropdown for a given tab are exposed as a GUI filter:<\/p>\n<\/div><div class=\"fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color alert-dismissable awb-alert-close-boxed\" style=\"--awb-background-color:var(--awb-color6);--awb-accent-color:#ffffff;--awb-border-size:1px;--awb-border-top-left-radius:0px;--awb-border-top-right-radius:0px;--awb-border-bottom-left-radius:0px;--awb-border-bottom-right-radius:0px;\" role=\"alert\"><div class=\"fusion-alert-content-wrapper\"><span class=\"alert-icon\"><i class=\"fa-laptop-code fas\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-alert-content\">crawl.tab(&#8220;page_titles&#8221;).filter(gui=&#8221;Duplicate&#8221;).collect()<\/span><\/div><button style=\"color:#ffffff;border-color:#ffffff;\" type=\"button\" class=\"close toggle-alert\" data-dismiss=\"alert\" aria-label=\"Close\">&times;<\/button><\/div><div class=\"fusion-text fusion-text-18\"><p>Response codes work in the same way:<\/p>\n<\/div><div class=\"fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color alert-dismissable awb-alert-close-boxed\" style=\"--awb-background-color:var(--awb-color6);--awb-accent-color:#ffffff;--awb-border-size:1px;--awb-border-top-left-radius:0px;--awb-border-top-right-radius:0px;--awb-border-bottom-left-radius:0px;--awb-border-bottom-right-radius:0px;\" role=\"alert\"><div class=\"fusion-alert-content-wrapper\"><span class=\"alert-icon\"><i class=\"fa-laptop-code fas\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-alert-content\">crawl.tab(&#8220;Response Codes&#8221;).filter(gui=&#8221;Internal Client Error (4xx)&#8221;).collect()<\/span><\/div><button style=\"color:#ffffff;border-color:#ffffff;\" type=\"button\" class=\"close toggle-alert\" data-dismiss=\"alert\" aria-label=\"Close\">&times;<\/button><\/div><div class=\"fusion-text fusion-text-19\"><p>If you do not remember which columns a particular tab carries, the helper tab_columns(&#8230;) gives you the answer without making you guess:<\/p>\n<\/div><div class=\"fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color alert-dismissable awb-alert-close-boxed\" style=\"--awb-background-color:var(--awb-color6);--awb-accent-color:#ffffff;--awb-border-size:1px;--awb-border-top-left-radius:0px;--awb-border-top-right-radius:0px;--awb-border-bottom-left-radius:0px;--awb-border-bottom-right-radius:0px;\" role=\"alert\"><div class=\"fusion-alert-content-wrapper\"><span class=\"alert-icon\"><i class=\"fa-laptop-code fas\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-alert-content\">crawl.tab_columns(&#8220;page_titles&#8221;)<\/span><\/div><button style=\"color:#ffffff;border-color:#ffffff;\" type=\"button\" class=\"close toggle-alert\" data-dismiss=\"alert\" aria-label=\"Close\">&times;<\/button><\/div><div class=\"fusion-text fusion-text-20\"><p>A note on when to reach for <span style=\"color: #65bd7d;\"><strong>tab(&#8230;)<\/strong><\/span> versus <strong><span style=\"color: #65bd7d;\">pages()<\/span><\/strong>. The function pages() is usually a better choice for general \u201cgive me a list of pages with property X\u201d questions, because it operates on the unified page view.<\/p>\n<p>The function <span style=\"color: #65bd7d;\"><strong>tab(&#8230;)<\/strong><\/span> is the better choice when you already know the specific report you want, when you want the GUI-style filter labels available to you, or when the question is naturally framed around a particular Screaming Frog tab name.<\/p>\n<\/div><div class=\"fusion-title title fusion-title-8 fusion-title-center fusion-title-text fusion-title-size-two\" style=\"--awb-text-color:#141617;--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-font-size:40px;\"><div class=\"title-sep-container title-sep-container-left\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><span class=\"awb-title-spacer\"><\/span><h2 class=\"fusion-title-heading title-heading-center awb-gradient-text fusion-responsive-typography-calculated\" style=\"font-family:&quot;Work Sans&quot;;font-style:normal;font-weight:800;margin:0;letter-spacing:-0.012em;text-transform:var(--awb-typography1-text-transform);background-color:#f79501;background-image:linear-gradient(150deg, #f79501 20%,#fe6996 100%);font-size:1em;--fontSize:40;line-height:1;\">Scope a workflow to a section<\/h2><span class=\"awb-title-spacer\"><\/span><div class=\"title-sep-container title-sep-container-right\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><\/div><div class=\"fusion-text fusion-text-21\"><p>Not every audit question is sitewide. A lot of real work is \u201c<a href=\"https:\/\/screamingfrog.club\/en\/crawl-of-subfolders\/\">what is going on in \/blog<\/a>\u201d or \u201cshow me the products folder only.\u201d The function <strong><span style=\"color: #65bd7d;\">section(&#8230;)<\/span><\/strong> scopes any of the views above to a URL prefix or a path prefix.<\/p>\n<\/div><div class=\"fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color alert-dismissable awb-alert-close-boxed\" style=\"--awb-background-color:var(--awb-color6);--awb-accent-color:#ffffff;--awb-border-size:1px;--awb-border-top-left-radius:0px;--awb-border-top-right-radius:0px;--awb-border-bottom-left-radius:0px;--awb-border-bottom-right-radius:0px;\" role=\"alert\"><div class=\"fusion-alert-content-wrapper\"><span class=\"alert-icon\"><i class=\"fa-laptop-code fas\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-alert-content\">crawl.section(&#8220;\/blog&#8221;).pages().filter(status_code=404).collect()<\/p><\/span><\/div><button style=\"color:#ffffff;border-color:#ffffff;\" type=\"button\" class=\"close toggle-alert\" data-dismiss=\"alert\" aria-label=\"Close\">&times;<\/button><\/div><div class=\"fusion-text fusion-text-22\"><p>It composes with links() in the same way:<\/p>\n<\/div><div class=\"fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color alert-dismissable awb-alert-close-boxed\" style=\"--awb-background-color:var(--awb-color6);--awb-accent-color:#ffffff;--awb-border-size:1px;--awb-border-top-left-radius:0px;--awb-border-top-right-radius:0px;--awb-border-bottom-left-radius:0px;--awb-border-bottom-right-radius:0px;\" role=\"alert\"><div class=\"fusion-alert-content-wrapper\"><span class=\"alert-icon\"><i class=\"fa-laptop-code fas\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-alert-content\">crawl.section(&#8220;\/blog&#8221;).links(&#8220;in&#8221;).filter(status_code=404).collect()<\/span><\/div><button style=\"color:#ffffff;border-color:#ffffff;\" type=\"button\" class=\"close toggle-alert\" data-dismiss=\"alert\" aria-label=\"Close\">&times;<\/button><\/div><div class=\"fusion-text fusion-text-23\"><p>It is helpful to treat section(&#8230;) as a scoping primitive, and not as a separate API surface. Anything you can do sitewide, you can do scoped to a folder by chaining off section(&#8230;) first.<\/p>\n<\/div><div class=\"fusion-title title fusion-title-9 fusion-title-center fusion-title-text fusion-title-size-two\" style=\"--awb-text-color:#141617;--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-font-size:40px;\"><div class=\"title-sep-container title-sep-container-left\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><span class=\"awb-title-spacer\"><\/span><h2 class=\"fusion-title-heading title-heading-center awb-gradient-text fusion-responsive-typography-calculated\" style=\"font-family:&quot;Work Sans&quot;;font-style:normal;font-weight:800;margin:0;letter-spacing:-0.012em;text-transform:var(--awb-typography1-text-transform);background-color:#f79501;background-image:linear-gradient(150deg, #f79501 20%,#fe6996 100%);font-size:1em;--fontSize:40;line-height:1;\">Use raw() and sql() when you need more control<\/h2><span class=\"awb-title-spacer\"><\/span><div class=\"title-sep-container title-sep-container-right\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><\/div><div class=\"fusion-text fusion-text-24\"><p>Eventually, a question will appear that the typed views do not answer cleanly. The filter you want is not exposed as a keyword argument. You want to inspect the backend tables directly. You need a precise <strong><span style=\"color: #65bd7d;\">WHERE<\/span><\/strong> clause that the typed API has not foreseen. That is what <strong><span style=\"color: #65bd7d;\">raw()<\/span><\/strong> and <span style=\"color: #65bd7d;\"><strong>sql()<\/strong><\/span> exist for.<br \/>\nThe function <strong><span style=\"color: #65bd7d;\">raw(&#8230;)<\/span><\/strong> returns rows from a backend table directly. It is useful for inspecting a table when you do not yet know its shape:<\/p>\n<\/div><div class=\"fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color alert-dismissable awb-alert-close-boxed\" style=\"--awb-background-color:var(--awb-color6);--awb-accent-color:#ffffff;--awb-border-size:1px;--awb-border-top-left-radius:0px;--awb-border-top-right-radius:0px;--awb-border-bottom-left-radius:0px;--awb-border-bottom-right-radius:0px;\" role=\"alert\"><div class=\"fusion-alert-content-wrapper\"><span class=\"alert-icon\"><i class=\"fa-laptop-code fas\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-alert-content\">for row in crawl.raw(&#8220;APP.URLS&#8221;):<br \/>\nprint(row)<br \/>\nbreak<\/span><\/div><button style=\"color:#ffffff;border-color:#ffffff;\" type=\"button\" class=\"close toggle-alert\" data-dismiss=\"alert\" aria-label=\"Close\">&times;<\/button><\/div><div class=\"fusion-text fusion-text-25\"><p>The function sql(&#8230;) runs an arbitrary SQL string against the same backend. Parameters are passed positionally as a list:<\/p>\n<\/div><div class=\"fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color alert-dismissable awb-alert-close-boxed\" style=\"--awb-background-color:var(--awb-color6);--awb-accent-color:#ffffff;--awb-border-size:1px;--awb-border-top-left-radius:0px;--awb-border-top-right-radius:0px;--awb-border-bottom-left-radius:0px;--awb-border-bottom-right-radius:0px;\" role=\"alert\"><div class=\"fusion-alert-content-wrapper\"><span class=\"alert-icon\"><i class=\"fa-laptop-code fas\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-alert-content\">rows = list(<br \/>\ncrawl.sql(<br \/>\n&#8220;&#8221;&#8221;<br \/>\nSELECT ENCODED_URL, RESPONSE_CODE<br \/>\nFROM APP.URLS<br \/>\nWHERE RESPONSE_CODE &gt;= ?<br \/>\n&#8220;&#8221;&#8221;,[400],<br \/>\n)<br \/>\n)<\/span><\/div><button style=\"color:#ffffff;border-color:#ffffff;\" type=\"button\" class=\"close toggle-alert\" data-dismiss=\"alert\" aria-label=\"Close\">&times;<\/button><\/div><div class=\"fusion-text fusion-text-26\"><p>If you prefer SQL semantics but would rather not write the full <span style=\"color: #65bd7d;\"><strong>SELECT<\/strong><\/span> by hand, <strong><span style=\"color: #65bd7d;\">query(&#8230;)<\/span><\/strong> exposes the backend through a chainable builder:<\/p>\n<\/div><div class=\"fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color alert-dismissable awb-alert-close-boxed\" style=\"--awb-background-color:var(--awb-color6);--awb-accent-color:#ffffff;--awb-border-size:1px;--awb-border-top-left-radius:0px;--awb-border-top-right-radius:0px;--awb-border-bottom-left-radius:0px;--awb-border-bottom-right-radius:0px;\" role=\"alert\"><div class=\"fusion-alert-content-wrapper\"><span class=\"alert-icon\"><i class=\"fa-laptop-code fas\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-alert-content\">crawl.query(&#8220;APP&#8221;, &#8220;URLS&#8221;)<br \/>\n.select(&#8220;ENCODED_URL&#8221;, &#8220;RESPONSE_CODE&#8221;)<br \/>\n.where(&#8220;RESPONSE_CODE &gt;= ?&#8221;, 400)<br \/>\n.collect()<\/span><\/div><button style=\"color:#ffffff;border-color:#ffffff;\" type=\"button\" class=\"close toggle-alert\" data-dismiss=\"alert\" aria-label=\"Close\">&times;<\/button><\/div><div class=\"fusion-text fusion-text-27\"><p>A small warning here. The SQL interface is the most flexible of the four, which is exactly what makes it tempting to start with. I would suggest you do not.<\/p>\n<p>The typed views carry column normalization, GUI-style filters, and per-tab logic that you would otherwise have to rebuild yourself in raw SQL. Start at <strong><span style=\"color: #65bd7d;\">pages()<\/span><\/strong> or <span style=\"color: #65bd7d;\"><strong>tab(&#8230;)<\/strong><\/span>. Drop lower only when something genuinely does not fit.<br \/>\nTreat raw SQL as an escape hatch, not as the default path.<\/p>\n<\/div><div class=\"fusion-title title fusion-title-10 fusion-title-center fusion-title-text fusion-title-size-two\" style=\"--awb-text-color:#141617;--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-font-size:40px;\"><div class=\"title-sep-container title-sep-container-left\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><span class=\"awb-title-spacer\"><\/span><h2 class=\"fusion-title-heading title-heading-center awb-gradient-text fusion-responsive-typography-calculated\" style=\"font-family:&quot;Work Sans&quot;;font-style:normal;font-weight:800;margin:0;letter-spacing:-0.012em;text-transform:var(--awb-typography1-text-transform);background-color:#f79501;background-image:linear-gradient(150deg, #f79501 20%,#fe6996 100%);font-size:1em;--fontSize:40;line-height:1;\">Build a simple no-CSV workflow<\/h2><span class=\"awb-title-spacer\"><\/span><div class=\"title-sep-container title-sep-container-right\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><\/div><div class=\"fusion-text fusion-text-28\"><p>Most of what an audit needs from day to day is some combination of a page-level issue list, the link impact of those issues, a familiar tab report, and the occasional custom query. All four happen against the same loaded crawl, in a single process, without any export step in between.<\/p>\n<\/div><div class=\"fusion-alert alert custom alert-custom fusion-alert-left awb-alert-native-link-color alert-dismissable awb-alert-close-boxed\" style=\"--awb-background-color:var(--awb-color6);--awb-accent-color:#ffffff;--awb-border-size:1px;--awb-border-top-left-radius:0px;--awb-border-top-right-radius:0px;--awb-border-bottom-left-radius:0px;--awb-border-bottom-right-radius:0px;\" role=\"alert\"><div class=\"fusion-alert-content-wrapper\"><span class=\"alert-icon\"><i class=\"fa-laptop-code fas\" aria-hidden=\"true\"><\/i><\/span><span class=\"fusion-alert-content\">from screamingfrog import Crawl<\/p>\n<p>crawl = Crawl.load(&#8220;example-crawl.dbseospider&#8221;)<\/p>\n<p># 1. Page-level issue list<br \/>\nbroken_pages =<br \/>\ncrawl.pages().filter(status_code=404).select(&#8220;Address&#8221;).collect()<\/p>\n<p># 2. Link impact &#8211; who still links to those broken URLs<br \/>\nbroken_inlinks =<br \/>\ncrawl.links(&#8220;in&#8221;).filter(status_code=404).collect()<\/p>\n<p># 3. Familiar tab report &#8211; duplicate titles for the SEO team<br \/>\nduplicate_titles = crawl.tab(&#8220;page_titles&#8221;).filter(gui=&#8221;Duplicate&#8221;).collect()<\/p>\n<p># 4. Escape hatch &#8211; custom SQL when typed views fall short<br \/>\ncustom = crawl.sql(<br \/>\n&#8220;&#8221;&#8221;<br \/>\nSELECT ENCODED_URL, RESPONSE_CODE<br \/>\nFROM APP.URLS<br \/>\nWHERE RESPONSE_CODE &gt;= ?<br \/>\n&#8220;&#8221;&#8221;,[400],<br \/>\n)<\/span><\/div><button style=\"color:#ffffff;border-color:#ffffff;\" type=\"button\" class=\"close toggle-alert\" data-dismiss=\"alert\" aria-label=\"Close\">&times;<\/button><\/div><div class=\"fusion-text fusion-text-29\"><p>It helps to read the example top to bottom as a pattern, and not as a finished script. Step one is the page-level issue list. Step two is the link impact, so that the fix has a destination, not just a problem. Step three pulls a tab that the team already trusts, which keeps the output legible to anyone who reviews it later. Step four is the optional escape hatch, used only because the question got specific enough that the typed views would not have been faster.<br \/>\nIn a CSV-driven workflow, this would be at least four exports, four cleanups, and a manual stitch at the end. Here, it is one file open and four queries running against the same crawl.<\/p>\n<\/div><div class=\"fusion-title title fusion-title-11 fusion-title-center fusion-title-text fusion-title-size-two\" style=\"--awb-text-color:#141617;--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-font-size:40px;\"><div class=\"title-sep-container title-sep-container-left\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><span class=\"awb-title-spacer\"><\/span><h2 class=\"fusion-title-heading title-heading-center awb-gradient-text fusion-responsive-typography-calculated\" style=\"font-family:&quot;Work Sans&quot;;font-style:normal;font-weight:800;margin:0;letter-spacing:-0.012em;text-transform:var(--awb-typography1-text-transform);background-color:#f79501;background-image:linear-gradient(150deg, #f79501 20%,#fe6996 100%);font-size:1em;--fontSize:40;line-height:1;\">Decision framework: which interface should you use?<\/h2><span class=\"awb-title-spacer\"><\/span><div class=\"title-sep-container title-sep-container-right\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><\/div><div class=\"fusion-text fusion-text-30\"><p>The four interfaces overlap, and the overlap is intentional. Knowing which one to reach for first is the single thing that saves the most time once you start writing real scripts.<\/p>\n<ul>\n<li><strong><span style=\"color: #65bd7d;\">pages()<\/span><\/strong> is for page-level questions: 404 lists, noindex audits, title QA, and anything shaped like \u201cwhich pages have property X\u201d.<\/li>\n<li><span style=\"color: #65bd7d;\"><strong>links()<\/strong><\/span> is for link-level questions: broken inlinks, nofollow inlinks, outgoing link checks, and anchor text reviews.<\/li>\n<li><strong><span style=\"color: #65bd7d;\">tab(&#8230;)<\/span><\/strong> is for specific Screaming Frog reports or exports: page titles, response codes, internal_all, and anything else you already know by its GUI tab name.<\/li>\n<li><span style=\"color: #65bd7d;\"><strong>raw()<\/strong><\/span> and <strong><span style=\"color: #65bd7d;\">sql()<\/span><\/strong> are for advanced or unusual queries: custom filtering, raw <strong><span style=\"color: #65bd7d;\">APP<\/span><\/strong> tables, joins, and edge cases that the typed API does not cover cleanly.<\/li>\n<\/ul>\n<p>The rule of thumb is to start as high-level as possible, and to drop lower only when the question genuinely demands it.<\/p>\n<\/div><div class=\"fusion-title title fusion-title-12 fusion-title-center fusion-title-text fusion-title-size-three\" style=\"--awb-text-color:#141617;--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-font-size:40px;\"><div class=\"title-sep-container title-sep-container-left\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><span class=\"awb-title-spacer\"><\/span><h3 class=\"fusion-title-heading title-heading-center awb-gradient-text fusion-responsive-typography-calculated\" style=\"font-family:&quot;Work Sans&quot;;font-style:normal;font-weight:800;margin:0;letter-spacing:-0.012em;text-transform:var(--awb-typography1-text-transform);background-color:#f79501;background-image:linear-gradient(150deg, #f79501 20%,#fe6996 100%);font-size:1em;--fontSize:40;line-height:1;\">Common mistakes to avoid<\/h3><span class=\"awb-title-spacer\"><\/span><div class=\"title-sep-container title-sep-container-right\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><\/div><div class=\"fusion-text fusion-text-31\"><p>A few patterns show up over and over again with people who are coming from the CSV workflow.<\/p>\n<ul>\n<li><strong>Starting with SQL too early<\/strong>. The typed views exist for a reason. Use them first, and drop down only when they actually fall short.<\/li>\n<li><strong>Skipping <span style=\"color: #65bd7d;\">.select(&#8230;)<\/span><\/strong>. Pulling every column when you only need four makes the output harder to read.<\/li>\n<li><strong>Defaulting to<\/strong> <span style=\"color: #65bd7d;\"><strong>tab(&#8230;)<\/strong><\/span> for everything. If your question is page-level, pages() is usually shorter and cleaner.<\/li>\n<li><strong>Treating the library as a CSV replacement<\/strong>. The point is direct access to the crawl, not a faster path to a spreadsheet.<\/li>\n<li><strong>Ignoring link-level workflows<\/strong>. Page-level data tells you what is broken. Link-level data tells you what to actually fix.<\/li>\n<\/ul>\n<\/div><div class=\"fusion-title title fusion-title-13 fusion-title-center fusion-title-text fusion-title-size-three\" style=\"--awb-text-color:#141617;--awb-margin-top:20px;--awb-margin-bottom:20px;--awb-font-size:40px;\"><div class=\"title-sep-container title-sep-container-left\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><span class=\"awb-title-spacer\"><\/span><h3 class=\"fusion-title-heading title-heading-center awb-gradient-text fusion-responsive-typography-calculated\" style=\"font-family:&quot;Work Sans&quot;;font-style:normal;font-weight:800;margin:0;letter-spacing:-0.012em;text-transform:var(--awb-typography1-text-transform);background-color:#f79501;background-image:linear-gradient(150deg, #f79501 20%,#fe6996 100%);font-size:1em;--fontSize:40;line-height:1;\">Conclusion and next step<\/h3><span class=\"awb-title-spacer\"><\/span><div class=\"title-sep-container title-sep-container-right\"><div class=\"title-sep sep-single sep-solid\" style=\"border-color:var(--awb-color3);\"><\/div><\/div><\/div><div class=\"fusion-text fusion-text-32\"><p>The real value of this library is not the Python API itself. The real value is that you stop running the export-clean-analyze loop entirely. You open a .dbseospider once, ask page-level and link-level questions against it, pull the same reports you would have pulled in the GUI, and drop into raw SQL only when the question genuinely needs it.<br \/>\nYou should now be comfortable doing four things directly against a crawl file:<\/p>\n<ul>\n<li>Opening a <strong><span style=\"color: #65bd7d;\">.dbseospider<\/span><\/strong> with <span style=\"color: #65bd7d;\"><strong>Crawl.load(&#8230;)<\/strong><\/span><\/li>\n<li>Querying pages with <span style=\"color: #65bd7d;\"><strong>pages()<\/strong><\/span>, filtered and selected down to the columns you actually care about<\/li>\n<li>Querying the link graph with <strong><span style=\"color: #65bd7d;\">links(&#8220;in&#8221;)<\/span><\/strong> or <span style=\"color: #65bd7d;\"><strong>links(&#8220;out&#8221;)<\/strong><\/span><\/li>\n<li>Falling back on <span style=\"color: #65bd7d;\"><strong>tab(&#8230;)<\/strong><\/span>, <strong><span style=\"color: #65bd7d;\">raw()<\/span><\/strong>, or <span style=\"color: #65bd7d;\"><strong>sql()<\/strong><\/span> when the question gets specific<\/li>\n<\/ul>\n<p>In the next tutorial, we will use this same workflow to do something more technical: finding broken inlinks, locating orphan pages, and tracing redirect chains directly from the crawl, without exporting a single CSV file.<\/p>\n<\/div><div class=\"fusion-separator fusion-full-width-sep\" style=\"align-self: center;margin-left: auto;margin-right: auto;margin-top:20px;margin-bottom:20px;width:100%;\"><div class=\"fusion-separator-border sep-single sep-solid\" style=\"--awb-height:20px;--awb-amount:20px;--awb-sep-color:var(--awb-color6);border-color:var(--awb-color6);border-top-width:1px;\"><\/div><\/div><div class=\"fusion-builder-row fusion-builder-row-inner fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"--awb-min-height:no;--awb-min-height-medium:no;--awb-min-height-small:no;width:104% !important;max-width:104% !important;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column_inner fusion-builder-nested-column-0 fusion_builder_column_inner_1_4 1_4 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:25%;--awb-margin-top-large:0px;--awb-spacing-right-large:7.68%;--awb-margin-bottom-large:20px;--awb-spacing-left-large:7.68%;--awb-width-medium:25%;--awb-order-medium:0;--awb-spacing-right-medium:7.68%;--awb-spacing-left-medium:7.68%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-image-element \" style=\"--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\" fusion-imageframe imageframe-none imageframe-1 hover-type-none\"><img decoding=\"async\" width=\"1280\" height=\"1031\" alt=\"ANTONIO ATILIO MACULUS\" title=\"Antonio\" src=\"https:\/\/screamingfrog.club\/wp-content\/uploads\/2026\/04\/Antonio.jpeg\" class=\"img-responsive wp-image-5370\" srcset=\"https:\/\/screamingfrog.club\/wp-content\/uploads\/2026\/04\/Antonio-200x161.jpeg 200w, https:\/\/screamingfrog.club\/wp-content\/uploads\/2026\/04\/Antonio-400x322.jpeg 400w, https:\/\/screamingfrog.club\/wp-content\/uploads\/2026\/04\/Antonio-600x483.jpeg 600w, https:\/\/screamingfrog.club\/wp-content\/uploads\/2026\/04\/Antonio-800x644.jpeg 800w, https:\/\/screamingfrog.club\/wp-content\/uploads\/2026\/04\/Antonio-1200x967.jpeg 1200w, https:\/\/screamingfrog.club\/wp-content\/uploads\/2026\/04\/Antonio.jpeg 1280w\" sizes=\"(max-width: 640px) 100vw, 400px\" \/><\/span><\/div><\/div><\/div><div class=\"fusion-layout-column fusion_builder_column_inner fusion-builder-nested-column-1 fusion_builder_column_inner_3_4 3_4 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:75%;--awb-margin-top-large:0px;--awb-spacing-right-large:2.56%;--awb-margin-bottom-large:20px;--awb-spacing-left-large:2.56%;--awb-width-medium:75%;--awb-order-medium:0;--awb-spacing-right-medium:2.56%;--awb-spacing-left-medium:2.56%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-33\"><p>Hi! My name is Antonio, based in Buenos Aires. I\u2019m Director of AI Content Strategy at Better Collective and the founder of AuditLabs, where I host free SEO tools alongside my consulting work. <\/p>\n<p>AuditLabs founder<\/p>\n<\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":2712,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[38,67],"tags":[61,60],"class_list":["post-5399","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-guide-screaming-frog","category-seo","tag-advanced-en","tag-guide"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How to Open Screaming Frog Crawls Directly in Python<\/title>\n<meta name=\"description\" content=\"Discover how to Open Screaming Frog Crawls Directly in Python with the screamingfrog Library. Tutorial step by step.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Open Screaming Frog Crawls Directly in Python\" \/>\n<meta property=\"og:description\" content=\"Discover how to Open Screaming Frog Crawls Directly in Python with the screamingfrog Library. Tutorial step by step.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/\" \/>\n<meta property=\"og:site_name\" content=\"Screaming Frog Club\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-15T15:41:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/screamingfrog.club\/wp-content\/uploads\/2024\/03\/SF_Back_dark.png\" \/>\n\t<meta property=\"og:image:width\" content=\"600\" \/>\n\t<meta property=\"og:image:height\" content=\"300\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"raffaele.visintin@gmail.com\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"raffaele.visintin@gmail.com\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/\"},\"author\":{\"name\":\"raffaele.visintin@gmail.com\",\"@id\":\"https:\/\/screamingfrog.club\/en\/#\/schema\/person\/cd9ee509ae86128e5e339f9e3de1bc73\"},\"headline\":\"How to Open Screaming Frog Crawls Directly in Python\",\"datePublished\":\"2026-05-15T15:41:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/\"},\"wordCount\":7449,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/screamingfrog.club\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/screamingfrog.club\/wp-content\/uploads\/2024\/03\/SF_Back_dark.png\",\"keywords\":[\"Advanced\",\"Guide\"],\"articleSection\":[\"Guide Screaming Frog\",\"SEO\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/\",\"url\":\"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/\",\"name\":\"How to Open Screaming Frog Crawls Directly in Python\",\"isPartOf\":{\"@id\":\"https:\/\/screamingfrog.club\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/screamingfrog.club\/wp-content\/uploads\/2024\/03\/SF_Back_dark.png\",\"datePublished\":\"2026-05-15T15:41:56+00:00\",\"description\":\"Discover how to Open Screaming Frog Crawls Directly in Python with the screamingfrog Library. Tutorial step by step.\",\"breadcrumb\":{\"@id\":\"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/#primaryimage\",\"url\":\"https:\/\/screamingfrog.club\/wp-content\/uploads\/2024\/03\/SF_Back_dark.png\",\"contentUrl\":\"https:\/\/screamingfrog.club\/wp-content\/uploads\/2024\/03\/SF_Back_dark.png\",\"width\":600,\"height\":300},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/screamingfrog.club\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Open Screaming Frog Crawls Directly in Python\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/screamingfrog.club\/en\/#website\",\"url\":\"https:\/\/screamingfrog.club\/en\/\",\"name\":\"Screaming Frog Club\",\"description\":\"Guide e Tutorial sul Seo SPider\",\"publisher\":{\"@id\":\"https:\/\/screamingfrog.club\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/screamingfrog.club\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/screamingfrog.club\/en\/#organization\",\"name\":\"Screaming Frog Club\",\"url\":\"https:\/\/screamingfrog.club\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/screamingfrog.club\/en\/#\/schema\/logo\/image\/\",\"url\":\"http:\/\/screamingfrog.club\/wp-content\/uploads\/2024\/02\/SF_Club_Logo-2.png\",\"contentUrl\":\"http:\/\/screamingfrog.club\/wp-content\/uploads\/2024\/02\/SF_Club_Logo-2.png\",\"width\":117,\"height\":67,\"caption\":\"Screaming Frog Club\"},\"image\":{\"@id\":\"https:\/\/screamingfrog.club\/en\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/screamingfrog.club\/en\/#\/schema\/person\/cd9ee509ae86128e5e339f9e3de1bc73\",\"name\":\"raffaele.visintin@gmail.com\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/screamingfrog.club\/wp-content\/litespeed\/avatar\/5b2dd661ff57d360794386547fd7a2dd.jpg?ver=1778976916\",\"url\":\"https:\/\/screamingfrog.club\/wp-content\/litespeed\/avatar\/5b2dd661ff57d360794386547fd7a2dd.jpg?ver=1778976916\",\"contentUrl\":\"https:\/\/screamingfrog.club\/wp-content\/litespeed\/avatar\/5b2dd661ff57d360794386547fd7a2dd.jpg?ver=1778976916\",\"caption\":\"raffaele.visintin@gmail.com\"},\"sameAs\":[\"http:\/\/screamingfrog.club\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Open Screaming Frog Crawls Directly in Python","description":"Discover how to Open Screaming Frog Crawls Directly in Python with the screamingfrog Library. Tutorial step by step.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/","og_locale":"en_US","og_type":"article","og_title":"How to Open Screaming Frog Crawls Directly in Python","og_description":"Discover how to Open Screaming Frog Crawls Directly in Python with the screamingfrog Library. Tutorial step by step.","og_url":"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/","og_site_name":"Screaming Frog Club","article_published_time":"2026-05-15T15:41:56+00:00","og_image":[{"width":600,"height":300,"url":"https:\/\/screamingfrog.club\/wp-content\/uploads\/2024\/03\/SF_Back_dark.png","type":"image\/png"}],"author":"raffaele.visintin@gmail.com","twitter_card":"summary_large_image","twitter_misc":{"Written by":"raffaele.visintin@gmail.com","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/#article","isPartOf":{"@id":"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/"},"author":{"name":"raffaele.visintin@gmail.com","@id":"https:\/\/screamingfrog.club\/en\/#\/schema\/person\/cd9ee509ae86128e5e339f9e3de1bc73"},"headline":"How to Open Screaming Frog Crawls Directly in Python","datePublished":"2026-05-15T15:41:56+00:00","mainEntityOfPage":{"@id":"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/"},"wordCount":7449,"commentCount":0,"publisher":{"@id":"https:\/\/screamingfrog.club\/en\/#organization"},"image":{"@id":"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/#primaryimage"},"thumbnailUrl":"https:\/\/screamingfrog.club\/wp-content\/uploads\/2024\/03\/SF_Back_dark.png","keywords":["Advanced","Guide"],"articleSection":["Guide Screaming Frog","SEO"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/","url":"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/","name":"How to Open Screaming Frog Crawls Directly in Python","isPartOf":{"@id":"https:\/\/screamingfrog.club\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/#primaryimage"},"image":{"@id":"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/#primaryimage"},"thumbnailUrl":"https:\/\/screamingfrog.club\/wp-content\/uploads\/2024\/03\/SF_Back_dark.png","datePublished":"2026-05-15T15:41:56+00:00","description":"Discover how to Open Screaming Frog Crawls Directly in Python with the screamingfrog Library. Tutorial step by step.","breadcrumb":{"@id":"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/#primaryimage","url":"https:\/\/screamingfrog.club\/wp-content\/uploads\/2024\/03\/SF_Back_dark.png","contentUrl":"https:\/\/screamingfrog.club\/wp-content\/uploads\/2024\/03\/SF_Back_dark.png","width":600,"height":300},{"@type":"BreadcrumbList","@id":"https:\/\/screamingfrog.club\/en\/how-to-open-screaming-frog-crawls-in-python\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/screamingfrog.club\/en\/"},{"@type":"ListItem","position":2,"name":"How to Open Screaming Frog Crawls Directly in Python"}]},{"@type":"WebSite","@id":"https:\/\/screamingfrog.club\/en\/#website","url":"https:\/\/screamingfrog.club\/en\/","name":"Screaming Frog Club","description":"Guide e Tutorial sul Seo SPider","publisher":{"@id":"https:\/\/screamingfrog.club\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/screamingfrog.club\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/screamingfrog.club\/en\/#organization","name":"Screaming Frog Club","url":"https:\/\/screamingfrog.club\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/screamingfrog.club\/en\/#\/schema\/logo\/image\/","url":"http:\/\/screamingfrog.club\/wp-content\/uploads\/2024\/02\/SF_Club_Logo-2.png","contentUrl":"http:\/\/screamingfrog.club\/wp-content\/uploads\/2024\/02\/SF_Club_Logo-2.png","width":117,"height":67,"caption":"Screaming Frog Club"},"image":{"@id":"https:\/\/screamingfrog.club\/en\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/screamingfrog.club\/en\/#\/schema\/person\/cd9ee509ae86128e5e339f9e3de1bc73","name":"raffaele.visintin@gmail.com","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/screamingfrog.club\/wp-content\/litespeed\/avatar\/5b2dd661ff57d360794386547fd7a2dd.jpg?ver=1778976916","url":"https:\/\/screamingfrog.club\/wp-content\/litespeed\/avatar\/5b2dd661ff57d360794386547fd7a2dd.jpg?ver=1778976916","contentUrl":"https:\/\/screamingfrog.club\/wp-content\/litespeed\/avatar\/5b2dd661ff57d360794386547fd7a2dd.jpg?ver=1778976916","caption":"raffaele.visintin@gmail.com"},"sameAs":["http:\/\/screamingfrog.club"]}]}},"_links":{"self":[{"href":"https:\/\/screamingfrog.club\/en\/wp-json\/wp\/v2\/posts\/5399","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/screamingfrog.club\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/screamingfrog.club\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/screamingfrog.club\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/screamingfrog.club\/en\/wp-json\/wp\/v2\/comments?post=5399"}],"version-history":[{"count":4,"href":"https:\/\/screamingfrog.club\/en\/wp-json\/wp\/v2\/posts\/5399\/revisions"}],"predecessor-version":[{"id":5403,"href":"https:\/\/screamingfrog.club\/en\/wp-json\/wp\/v2\/posts\/5399\/revisions\/5403"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/screamingfrog.club\/en\/wp-json\/wp\/v2\/media\/2712"}],"wp:attachment":[{"href":"https:\/\/screamingfrog.club\/en\/wp-json\/wp\/v2\/media?parent=5399"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/screamingfrog.club\/en\/wp-json\/wp\/v2\/categories?post=5399"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/screamingfrog.club\/en\/wp-json\/wp\/v2\/tags?post=5399"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}