{"id":42148,"date":"2026-11-12T15:04:06","date_gmt":"2026-11-12T15:04:06","guid":{"rendered":"https:\/\/nodemaven.com\/?p=42148"},"modified":"2026-11-12T15:04:07","modified_gmt":"2026-11-12T15:04:07","slug":"how-to-scrape-google-search-results","status":"publish","type":"post","link":"https:\/\/nodemaven.com\/zh\/blog\/how-to-scrape-google-search-results\/","title":{"rendered":"How to Scrape Google Search Results With Python: Free Open-Source Scraper (2026 Guide)"},"content":{"rendered":"<p class=\"wp-block-paragraph\">Scraping Google with Python used to take twenty lines of code. You sent a request, parsed the HTML and saved the links. That script stopped working in 2025. Many tutorials still teach it anyway.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide shows what works now. You will install <a href=\"https:\/\/github.com\/nodemaven\/serpmaven\">SERP Maven<\/a>, a free, open-source Google search scraper for Python. It runs a real Chrome browser through your own residential proxy and returns Google results as clean JSON. You can use it as a CLI, a Python library, a local HTTP API or an MCP server for AI agents.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Quick answer.<\/strong> Plain requests no longer gets Google results, because Google now requires JavaScript. To scrape Google search results with Python in 2026, install SERP Maven, add a residential proxy with sticky sessions and run one command. You get one JSON record per results page with organic results, People also ask, related searches and the AI Overview.<\/p>\n\n\n<div\n\t\t\t\n\t\t\tclass=\"so-widget-rhinocore-addons-rhino-alert-banner so-widget-rhinocore-addons-rhino-alert-banner-default-d75171398898\"\n\t\t\t\n\t\t><div class=\"rhino-widget rhino-widget--rhinocore-addons-rhino-alert-banner section-alert\" data-nm-label=\"banner\"    style=\"--alert-background-color: #E6E6FF\"\n>\n            <div class=\"section-alert__icon\">\n            <img decoding=\"async\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/02\/icon-4.svg\" alt=\"\" loading=\"lazy\" width=\"64\" height=\"64\">        <\/div>\n    \n            <div class=\"section-alert__main\">\n            \n                            <div class=\"section-alert__description\"><p><strong>Run SERP Maven on clean residential IPs. Try NodeMaven proxies for $3.50<\/strong><\/p>\n<\/div>\n                    <\/div>\n    \n            <a\n            class=\"section-alert__button b-btn b-btn--static-xl b-btn--secondary-black\"\n            href=\"https:\/\/dashboard.nodemaven.com\/checkout\/pag\/trial\"\n            >\n            \u5f00\u59cb\u8bd5\u7528        <\/a>\n    <\/div>\n<\/div>\n\n\n<h2 id=\"h-what-changed-in-google-scraping-in-2025-and-2026\" class=\"wp-block-heading\">What changed in Google scraping in 2025 and 2026<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Four changes broke the old way to scrape Google search results.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>JavaScript became mandatory<\/strong>. On January 15, 2025, Google started requiring JavaScript to show search results. An HTTP client that cannot run scripts now gets a page that asks you to enable JavaScript.<\/li>\n\n\n\n<li><strong>The num=100 parameter stopped working<\/strong>. Since September 2025, Google returns 10 results per page. The top 100 now takes ten requests instead of one.<\/li>\n\n\n\n<li><strong>The official API is closing<\/strong>. Google&#8217;s Custom Search JSON API no longer accepts new customers. Existing customers must move off it by January 1, 2027.<\/li>\n\n\n\n<li><strong>The page itself got harder<\/strong>. AI Overviews sit above the organic results and load late. Result links are now wrapped in encrypted \/goto redirects instead of the old readable \/url?q= format.<\/li>\n\n\n\n<li><strong>Google also judges each visitor by IP reputation and cookies<\/strong>. A fresh browser on a fresh proxy IP is often refused quickly.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"h-why-requests-and-beautifulsoup-no-longer-work\" class=\"wp-block-heading\">Why requests and BeautifulSoup no longer work<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Run the classic approach once so you recognize the failure.<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u590d\u5236\u4ee3\u7801\u5230\u526a\u8d34\u677f\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"import%20requests%0A%0Aresponse%20%3D%20requests.get%28%0A%20%20%20%20%22https%3A%2F%2Fwww.google.com%2Fsearch%22%2C%0A%20%20%20%20params%3D%7B%22q%22%3A%20%22web%20scraping%22%2C%20%22hl%22%3A%20%22en%22%7D%2C%0A%20%20%20%20headers%3D%7B%22User-Agent%22%3A%20%22Mozilla%2F5.0%20%28Windows%20NT%2010.0%3B%20Win64%3B%20x64%29%22%7D%2C%0A%20%20%20%20timeout%3D30%2C%0A%29%0A%0Aprint%28response.status_code%29%20%20%20%20%20%23%20usually%20200%0Aprint%28%22%3Ch3%22%20in%20response.text%29%20%20%20%23%20False%3A%20no%20result%20titles%20in%20this%20HTML\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">You get a 200 status and no results. No header trick fixes this. The results are built by a script that requests never runs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">BeautifulSoup is still a fine HTML parser. The problem is the HTML you feed it. Old selectors like <em><u>tF2Cxc<\/u><\/em> \u6216 <em><u>VwiC3b<\/u><\/em> also change without warning. That is why most &#8220;scrape Google search results Python BeautifulSoup&#8221; tutorials quietly return empty lists today.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The requests example above teaches one lesson<strong>. A 200 status does not mean you got a results page<\/strong>. A good Google scraper has to check what came back before it parses anything.<\/p>\n\n\n\n<h2 id=\"h-serp-maven-a-free-open-source-google-serp-scraper\" class=\"wp-block-heading\">SERP Maven: a free, open-source Google SERP scraper<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/nodemaven.com\/zh\/tools\/google-search-scraper\/\">SERP Maven<\/a> is a self-hosted Google search scraper for Python, built by NodeMaven. The code is MIT licensed and published on PyPI. It drives real Chrome through Patchright, a patched build of Playwright, and returns results in the JSON format common to SERP APIs.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"383\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/sm3-1024x383.png\" alt=\"\" class=\"wp-image-42149\" srcset=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/sm3-1024x383.png 1024w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/sm3-300x112.png 300w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/sm3-768x287.png 768w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/sm3-18x7.png 18w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/sm3-1536x574.png 1536w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/sm3-2048x766.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Here is what it does differently from a basic Playwright script.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Hybrid mode<\/strong>. The browser passes Google&#8217;s checks. Then the next results pages come over HTTPS with the browser&#8217;s own cookies. This uses a fraction of a browser&#8217;s traffic and time.<\/li>\n\n\n\n<li><strong>Poisoned results protection<\/strong>. Google sometimes returns a normal-looking page for a different query. SERP Maven catches it, drops that proxy IP and asks again on a fresh one.<\/li>\n\n\n\n<li><strong>Honest failures<\/strong>. Captchas and blocks come back labeled. They never show up as &#8220;no results&#8221;.<\/li>\n\n\n\n<li><strong>Bring your own proxy<\/strong>. Any residential proxy with sticky sessions works. NodeMaven support is built in.<\/li>\n\n\n\n<li><strong>Run it your way<\/strong>. CLI, Python library, HTTP API, MCP server or Docker image. Every run prints the traffic used and the cost per 1,000 pages.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"h-install-serp-maven\" class=\"wp-block-heading\">Install SERP Maven<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You need Python 3.10 or newer. Install it in a virtual environment on macOS or Linux:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u590d\u5236\u4ee3\u7801\u5230\u526a\u8d34\u677f\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"python3%20-m%20venv%20serpmaven-env%0Asource%20serpmaven-env%2Fbin%2Factivate%0Apip%20install%20serpmaven%0Apatchright%20install%20chromium%0Aserpmaven%20doctor\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">On Windows, use PowerShell:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u590d\u5236\u4ee3\u7801\u5230\u526a\u8d34\u677f\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"python%20-m%20venv%20serpmaven-env%0ASet-ExecutionPolicy%20-Scope%20Process%20Bypass%20-Force%0A.%5Cserpmaven-env%5CScripts%5CActivate.ps1%0Apip%20install%20serpmaven%0Apatchright%20install%20chromium%0Aserpmaven%20doctor\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">\u8be5 <em><u>doctor<\/u><\/em> command starts the browser on a blank page and sends nothing. It reports what a website would see, such as headless signals, WebGL and screen size. It ends with <em><u>ready<\/u><\/em> when the setup looks like a normal desktop. Run it first, because Google answers some machines much less than others.<\/p>\n\n\n\n<h3 id=\"h-running-on-a-linux-server\" class=\"wp-block-heading\">Running on a Linux server<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The browser runs with a window, so a server without a screen needs a virtual display. It also needs software WebGL when there is no GPU.<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u590d\u5236\u4ee3\u7801\u5230\u526a\u8d34\u677f\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"sudo%20apt%20install%20xvfb%0Asudo%20serpmaven-env%2Fbin%2Fpatchright%20install-deps%20chromium%0Aexport%20SERPMAVEN_BROWSER_ARGS%3D--enable-unsafe-swiftshader%0Axvfb-run%20-a%20serpmaven%20doctor\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">Then start every command with <em><u>xvfb-run -a<\/u><\/em>. The Docker image has all of this built in.<\/p>\n\n\n\n<h2 id=\"h-run-your-first-google-search-from-the-cli\" class=\"wp-block-heading\">Run your first Google search from the CLI<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">SERP Maven needs a residential proxy with <strong>\u7c98\u6027\u4f1a\u8bdd<\/strong>. Put <em><u>{session}<\/u><\/em> where your provider expects a session id in the username. The scraper fills it in for each new identity.<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u590d\u5236\u4ee3\u7801\u5230\u526a\u8d34\u677f\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"serpmaven%20search%20%22best%20running%20shoes%22%20%5C%0A%20%20--proxy%20%22http%3A%2F%2FUSER-session-%7Bsession%7D%3APASS%40gate.example.com%3A7000%22%20%5C%0A%20%20-o%20results.jsonl\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">The first query takes a few minutes. The first proxy IP warms up on a few ordinary pages, and the terminal shows each step. Later queries take seconds, and new proxy IPs start from the cookies Google already accepted.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"65\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/sm4-1024x65.png\" alt=\"\" class=\"wp-image-42150\" srcset=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/sm4-1024x65.png 1024w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/sm4-300x19.png 300w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/sm4-754x48.png 754w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/sm4-1536x98.png 1536w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/sm4-18x1.png 18w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/sm4.png 1618w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 id=\"h-scrape-google-with-nodemaven-proxies\" class=\"wp-block-heading\">Scrape Google with NodeMaven proxies<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">With NodeMaven, the session id is handled for you and credentials come from the environment.<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u590d\u5236\u4ee3\u7801\u5230\u526a\u8d34\u677f\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"pip%20install%20%22serpmaven%5Bnodemaven%5D%22%0Aexport%20NODEMAVEN_LOGIN%3D...%20NODEMAVEN_PASSWORD%3D...%0Aprintf%20%22best%20running%20shoes%5Cnhow%20to%20boil%20eggs%5Cn%22%20%3E%20queries.txt%0Aserpmaven%20search%20-f%20queries.txt%20--nodemaven%20--country%20us%20-o%20results.jsonl\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">Want to cap a test run? The <em><u>&#8211;nodemaven-demo<\/u><\/em> flag creates a sub-user with a traffic limit from your dashboard API key. It deletes the sub-user when the run ends. A fresh warm-up alone uses about 60 MB, so keep the cap well above that.<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u590d\u5236\u4ee3\u7801\u5230\u526a\u8d34\u677f\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"export%20NODEMAVEN_API_KEY%3D...%0Aserpmaven%20search%20-f%20queries.txt%20--nodemaven-demo%20--traffic-limit-mb%20300%20-o%20results.jsonl\"><\/code><\/pre><\/figure>\n\n<div\n\t\t\t\n\t\t\tclass=\"so-widget-rhinocore-addons-rhino-alert-banner so-widget-rhinocore-addons-rhino-alert-banner-default-d75171398898\"\n\t\t\t\n\t\t><div class=\"rhino-widget rhino-widget--rhinocore-addons-rhino-alert-banner section-alert\" data-nm-label=\"banner\"    style=\"--alert-background-color: #E6E6FF\"\n>\n            <div class=\"section-alert__icon\">\n            <img decoding=\"async\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/02\/icon-4.svg\" alt=\"\" loading=\"lazy\" width=\"64\" height=\"64\">        <\/div>\n    \n            <div class=\"section-alert__main\">\n            \n                            <div class=\"section-alert__description\"><p><strong>Sticky sessions keep your Google IP warm. Get 750 MB of traffic for $3.50<\/strong><\/p>\n<\/div>\n                    <\/div>\n    \n            <a\n            class=\"section-alert__button b-btn b-btn--static-xl b-btn--secondary-black\"\n            href=\"https:\/\/dashboard.nodemaven.com\/checkout\/pag\/trial\"\n            >\n            \u5f00\u59cb\u8bd5\u7528        <\/a>\n    <\/div>\n<\/div>\n\n\n<h3 id=\"h-useful-cli-options\" class=\"wp-block-heading\">Useful CLI options<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><em><u>&#8211;pages N<\/u><\/em> scrapes N result pages per query.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em><u>&#8211;hl<\/u><\/em> \u548c <em><u>&#8211;gl<\/u><\/em> set the language and country of the results.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em><u>&#8211;workers N<\/u><\/em> searches on N proxy IPs at once, one browser each.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em><u>&#8211;format csv<\/u><\/em> writes the organic results as a table.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em><u>&#8211;price-per-gb<\/u><\/em> adds the cost per 1,000 pages to the run summary.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em><u>&#8211;save-html<\/u><\/em> DIR keeps every page&#8217;s HTML for debugging.<\/p>\n\n\n\n<h2 id=\"h-scrape-google-search-results-from-python\" class=\"wp-block-heading\">Scrape Google search results from Python<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">SERP Maven also works as a Python library. This is the basic pattern:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u590d\u5236\u4ee3\u7801\u5230\u526a\u8d34\u677f\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"from%20serpmaven%20import%20ProxyTemplate%2C%20Scraper%2C%20Settings%0A%0Aproxy%20%3D%20ProxyTemplate%28%22http%3A%2F%2FUSER-session-%7Bsession%7D%3APASS%40gate.example.com%3A7000%22%29%0A%0Afor%20page%20in%20Scraper%28proxy%2C%20Settings%28pages%3D2%29%29.run%28%5B%22best%20running%20shoes%22%5D%29%3A%0A%20%20%20%20for%20result%20in%20page.get%28%22organic_results%22%2C%20%5B%5D%29%3A%0A%20%20%20%20%20%20%20%20print%28result%5B%22position%22%5D%2C%20result%5B%22title%22%5D%2C%20result%5B%22link%22%5D%29\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">Each item the scraper yields is one results page. A failed query is a record too, with an <em><u>\u9519\u8bef<\/u><\/em> field. So you can log failures instead of losing them.<\/p>\n\n\n\n<h3 id=\"h-build-a-simple-rank-checker-with-csv-export\" class=\"wp-block-heading\">Build a simple rank checker with CSV export<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This script checks where your domain ranks for a list of keywords. It also saves every result URL to a CSV file, so you can scrape URLs from Google search results in the same pass.<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u590d\u5236\u4ee3\u7801\u5230\u526a\u8d34\u677f\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"import%20csv%0Afrom%20datetime%20import%20date%0Afrom%20urllib.parse%20import%20urlparse%0A%0Afrom%20serpmaven%20import%20ProxyTemplate%2C%20Scraper%2C%20Settings%0A%0APROXY%20%3D%20ProxyTemplate%28%22http%3A%2F%2FUSER-session-%7Bsession%7D%3APASS%40gate.example.com%3A7000%22%29%0ADOMAIN%20%3D%20%22example.com%22%0AKEYWORDS%20%3D%20%5B%22best%20running%20shoes%22%2C%20%22trail%20running%20shoes%22%2C%20%22running%20shoes%20for%20flat%20feet%22%5D%0A%0Arows%20%3D%20%5B%5D%0Afor%20page%20in%20Scraper%28PROXY%2C%20Settings%28pages%3D1%29%29.run%28KEYWORDS%29%3A%0A%20%20%20%20if%20%22error%22%20in%20page%3A%0A%20%20%20%20%20%20%20%20print%28%22Failed%3A%22%2C%20page%5B%22error%22%5D%29%0A%20%20%20%20%20%20%20%20continue%0A%20%20%20%20if%20page%5B%22search_metadata%22%5D.get%28%22page_verdict%22%29%20%21%3D%20%22ok%22%3A%0A%20%20%20%20%20%20%20%20continue%20%20%23%20captcha%20or%20block%2C%20labeled%20by%20the%20scraper%0A%0A%20%20%20%20query%20%3D%20page%5B%22search_parameters%22%5D%5B%22q%22%5D%0A%20%20%20%20for%20result%20in%20page.get%28%22organic_results%22%2C%20%5B%5D%29%3A%0A%20%20%20%20%20%20%20%20link%20%3D%20result.get%28%22link%22%29%20or%20%22%22%0A%20%20%20%20%20%20%20%20host%20%3D%20urlparse%28link%29.netloc.removeprefix%28%22www.%22%29%0A%20%20%20%20%20%20%20%20rows.append%28%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22date%22%3A%20date.today%28%29.isoformat%28%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22query%22%3A%20query%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22position%22%3A%20result%5B%22position%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20result%5B%22title%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22url%22%3A%20link%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ours%22%3A%20host%20%3D%3D%20DOMAIN%20or%20host.endswith%28%22.%22%20%2B%20DOMAIN%29%2C%0A%20%20%20%20%20%20%20%20%7D%29%0A%0Awith%20open%28%22rankings.csv%22%2C%20%22a%22%2C%20newline%3D%22%22%2C%20encoding%3D%22utf-8%22%29%20as%20f%3A%0A%20%20%20%20writer%20%3D%20csv.DictWriter%28f%2C%20fieldnames%3Drows%5B0%5D.keys%28%29%29%0A%20%20%20%20if%20f.tell%28%29%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20writer.writeheader%28%29%0A%20%20%20%20writer.writerows%28rows%29%0A%0Afor%20row%20in%20rows%3A%0A%20%20%20%20if%20row%5B%22ours%22%5D%3A%0A%20%20%20%20%20%20%20%20print%28f%27%7Brow%5B%22query%22%5D%7D%3A%20position%20%7Brow%5B%22position%22%5D%7D%27%29\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">Schedule it once a day with cron or GitHub Actions. After a month you have a ranking history for your keywords.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"487\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/sm5-1024x487.png\" alt=\"\" class=\"wp-image-42151\" srcset=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/sm5-1024x487.png 1024w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/sm5-300x143.png 300w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/sm5-767x365.png 767w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/sm5-18x9.png 18w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/sm5-1536x731.png 1536w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/sm5.png 1696w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 id=\"h-what-s-in-the-json-output\" class=\"wp-block-heading\">What&#8217;s in the JSON output<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">SERP Maven returns one JSON object per results page. The field names match the ones common to SERP APIs, so code written for a paid API often needs only small changes.<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"json\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u590d\u5236\u4ee3\u7801\u5230\u526a\u8d34\u677f\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-json\" data-rhino-code=\"%7B%0A%20%20%22search_metadata%22%3A%20%7B%22status%22%3A%20%22Success%22%2C%20%22page_verdict%22%3A%20%22ok%22%2C%20%22fetched_with%22%3A%20%22http%22%7D%2C%0A%20%20%22search_parameters%22%3A%20%7B%22engine%22%3A%20%22google%22%2C%20%22q%22%3A%20%22best%20running%20shoes%22%2C%20%22page%22%3A%201%7D%2C%0A%20%20%22organic_results%22%3A%20%5B%0A%20%20%20%20%7B%22position%22%3A%201%2C%20%22title%22%3A%20%22...%22%2C%20%22link%22%3A%20%22https%3A%2F%2F...%22%2C%20%22snippet%22%3A%20%22...%22%7D%0A%20%20%5D%2C%0A%20%20%22related_questions%22%3A%20%5B%7B%22question%22%3A%20%22...%22%7D%5D%2C%0A%20%20%22ai_overview%22%3A%20%7B%22text%22%3A%20%22...%22%7D%2C%0A%20%20%22exit%22%3A%20%7B%22session%22%3A%20%22...%22%2C%20%22queries_on_exit%22%3A%201%2C%20%22bytes%22%3A%20%22...%22%7D%0A%7D\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">Here is every field you can work with:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>organic_results<\/strong> has the position, title, link and snippet of each result.<\/li>\n\n\n\n<li><strong>ads<\/strong> holds the sponsored results when Google shows them.<\/li>\n\n\n\n<li><strong>related_questions<\/strong> lists the People also ask questions.<\/li>\n\n\n\n<li><strong>related_searches<\/strong> and pagination cover the bottom of the page.<\/li>\n\n\n\n<li><strong>ai_overview<\/strong> holds the text of Google&#8217;s AI Overview on English pages (&#8211;hl en, the default).<\/li>\n\n\n\n<li><strong>local_results<\/strong> lists the map pack places on local queries, with name, rating, reviews, type, address, phone and opening hours.<\/li>\n\n\n\n<li><strong>exit<\/strong> shows which proxy IP answered and how many bytes the page cost.<\/li>\n\n\n\n<li><strong>search_metadata<\/strong> shows the page verdict, whether the page came over HTTP or the browser, and per-step timings.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">This makes SERP Maven a practical Google AI Overview scraper and a way to scrape Google local results without extra parsing. Knowledge panels, Shopping and Images are not parsed today.<\/p>\n\n\n\n<h2 id=\"h-how-serp-maven-avoids-getting-blocked\" class=\"wp-block-heading\">How SERP Maven avoids getting blocked<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Most guides say &#8220;use proxies and add delays&#8221;. That is not enough for Google in 2026. SERP Maven runs five steps for every proxy IP.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>New identity<\/strong>. It opens a sticky proxy session and a fresh browser profile.<\/li>\n\n\n\n<li><strong>Warm-up<\/strong>. The first proxy IP visits a few ordinary pages and stays on each for 20 to 45 seconds. Later IPs start from the Google cookies of an IP that was already served.<\/li>\n\n\n\n<li><strong>\u641c\u7d22<\/strong>. The first query goes through the browser. Once Google serves it, the next pages come over HTTPS with the browser&#8217;s cookies. If that stops working, the browser takes over again.<\/li>\n\n\n\n<li><strong>Check before parsing<\/strong>. A captcha or block is reported as one. It is never parsed as an empty result.<\/li>\n\n\n\n<li><strong>Keep or drop<\/strong>. An IP Google serves is reused for up to 300 queries. One it refuses is dropped and the query is retried on a new one. If IP after IP is refused, the run stops instead of burning traffic.<\/li>\n<\/ul>\n\n\n\n<h3 id=\"h-poisoned-results-protection\" class=\"wp-block-heading\">Poisoned results protection<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This is the failure most scrapers never notice. Google does not always block a bot. Sometimes it serves a normal results page for a different query. There is no captcha and no error, just wrong data in your pipeline.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">SERP Maven compares each page with the query it asked. When a proxy IP starts returning unrelated results, it is dropped within a few pages and the query runs again on a fresh IP. The check runs on the page already downloaded, so it costs no extra traffic.<\/p>\n\n\n\n<h3 id=\"h-real-result-links\" class=\"wp-block-heading\">Real result links<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Google wraps result links in encrypted <em><u>\/goto<\/u><\/em> redirects. SERP Maven resolves each one with a small request on the same proxy IP, in the background while the next query runs. You get the real URLs, not Google redirects.<\/p>\n\n\n<div\n\t\t\t\n\t\t\tclass=\"so-widget-rhinocore-addons-rhino-alert-banner so-widget-rhinocore-addons-rhino-alert-banner-default-d75171398898\"\n\t\t\t\n\t\t><div class=\"rhino-widget rhino-widget--rhinocore-addons-rhino-alert-banner section-alert\" data-nm-label=\"banner\"    style=\"--alert-background-color: #E6E6FF\"\n>\n            <div class=\"section-alert__icon\">\n            <img decoding=\"async\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/02\/icon-4.svg\" alt=\"\" loading=\"lazy\" width=\"64\" height=\"64\">        <\/div>\n    \n            <div class=\"section-alert__main\">\n            \n                            <div class=\"section-alert__description\"><p><strong>Fewer captchas start with cleaner IPs. Scrape Google with NodeMaven proxies<\/strong><\/p>\n<\/div>\n                    <\/div>\n    \n            <a\n            class=\"section-alert__button b-btn b-btn--static-xl b-btn--secondary-black\"\n            href=\"https:\/\/dashboard.nodemaven.com\/checkout\/pag\/trial\"\n            >\n            \u5f00\u59cb\u8bd5\u7528        <\/a>\n    <\/div>\n<\/div>\n\n\n<h2 id=\"h-run-it-as-a-local-serp-api-in-docker-or-as-an-mcp-server\" class=\"wp-block-heading\">Run it as a local SERP API, in Docker or as an MCP server<\/h2>\n\n\n\n<h3 id=\"h-a-self-hosted-serp-api-on-localhost\" class=\"wp-block-heading\">A self-hosted SERP API on localhost<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Already have code that calls a paid SERP API? Run SERP Maven as a local HTTP API with the same record format.<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u590d\u5236\u4ee3\u7801\u5230\u526a\u8d34\u677f\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"serpmaven%20serve%20--nodemaven%20--country%20us%20--prewarm%0Acurl%20%22http%3A%2F%2F127.0.0.1%3A8000%2Fsearch.json%3Fq%3Dbest%2Brunning%2Bshoes%22\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">\u4f60\u53ef\u4ee5\u8bbe\u7f6e <em><u>hl<\/u><\/em> \u548c <em><u>gl<\/u><\/em> per request. The <em><u>&#8211;prewarm<\/u><\/em> flag finds a served proxy IP at startup, so the first request does not wait for a warm-up. Set <em><u>SERPMAVEN_API_KEY<\/u><\/em> to require a key. Without one, the server only listens on localhost.<\/p>\n\n\n\n<h3 id=\"h-docker\" class=\"wp-block-heading\">Docker<\/h3>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u590d\u5236\u4ee3\u7801\u5230\u526a\u8d34\u677f\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"docker%20run%20--rm%20ghcr.io%2Fnodemaven%2Fserpmaven%20doctor%0Adocker%20run%20--rm%20-p%208000%3A8000%20-e%20SERPMAVEN_API_KEY%3Dchange-me%20%5C%0A%20%20-e%20SERPMAVEN_PROXY%3D%27http%3A%2F%2FUSER-session-%7Bsession%7D%3APASS%40gate.example.com%3A7000%27%20%5C%0A%20%20ghcr.io%2Fnodemaven%2Fserpmaven%20serve%20--host%200.0.0.0\"><\/code><\/pre><\/figure>\n\n\n<h3 id=\"h-live-google-search-for-ai-agents\" class=\"wp-block-heading\">Live Google search for AI agents<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The MCP server gives Claude, Cursor and other MCP clients live Google search. Add this to your client&#8217;s MCP config:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"json\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"\u590d\u5236\u4ee3\u7801\u5230\u526a\u8d34\u677f\"><svg class=\"rhino-code-snippet__icon-copy\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewbox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-json\" data-rhino-code=\"%7B%0A%20%20%22mcpServers%22%3A%20%7B%0A%20%20%20%20%22google-search%22%3A%20%7B%0A%20%20%20%20%20%20%22command%22%3A%20%22serpmaven%22%2C%0A%20%20%20%20%20%20%22args%22%3A%20%5B%22mcp%22%2C%20%22--nodemaven%22%2C%20%22--country%22%2C%20%22us%22%2C%20%22--prewarm%22%5D%2C%0A%20%20%20%20%20%20%22env%22%3A%20%7B%22NODEMAVEN_LOGIN%22%3A%20%22...%22%2C%20%22NODEMAVEN_PASSWORD%22%3A%20%22...%22%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D\"><\/code><\/pre><\/figure>\n\n\n<p class=\"wp-block-paragraph\">The server exposes one tool, <em><u>google_search(query, pages, hl, gl)<\/u><\/em>. It returns organic results, People also ask, related searches, and the AI Overview and map places when Google shows them.<\/p>\n\n\n\n<h2 id=\"h-what-it-costs-to-scrape-google-with-serp-maven\" class=\"wp-block-heading\">What it costs to scrape Google with SERP Maven<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The code is free. You pay for residential proxy traffic, and SERP Maven shows exactly how much.<\/li>\n\n\n\n<li>A search uses about 0.4 MB of traffic on a warm proxy IP.<\/li>\n\n\n\n<li>A fresh warm-up uses about 60 MB, and cookie renewal keeps warm-ups rare.<\/li>\n\n\n\n<li>On long runs the average is about 0.45 GB per 1,000 searches.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">At NodeMaven&#8217;s residential rate from $2.20\/GB, that is about <strong>$1 per 1,000 Google result pages<\/strong>. Hosted SERP APIs charge per search instead. Compare their price per 1,000 with your own run summary before you choose.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6dfb\u52a0 <em><u>&#8211;price-per-gb 2.2<\/u><\/em> to any run and the summary prints your real cost per 1,000 pages.<\/p>\n\n\n\n<h2 id=\"h-serp-maven-vs-diy-playwright-vs-paid-serp-apis\" class=\"wp-block-heading\">SERP Maven vs DIY Playwright vs paid SERP APIs<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><\/td><td><strong>SERP Maven<\/strong><\/td><td><strong>DIY Playwright script<\/strong><\/td><td><strong>Paid SERP API<\/strong><\/td><\/tr><tr><td>\u8bbe\u7f6e<\/td><td>pip install, add a proxy<\/td><td>Write and maintain everything<\/td><td>API \u5bc6\u94a5<\/td><\/tr><tr><td>Cost model<\/td><td>Proxy traffic, about $1 per 1,000 pages<\/td><td>Proxy traffic plus your time<\/td><td>Per search, by plan<\/td><\/tr><tr><td>Block handling<\/td><td>Warm-up, cookie reuse, IP rotation, labeled captchas<\/td><td>Up to you<\/td><td>Handled by the vendor<\/td><\/tr><tr><td>Wrong-query pages<\/td><td>Detected and retried<\/td><td>Usually missed<\/td><td>Depends on the vendor<\/td><\/tr><tr><td>AI Overview and local pack<\/td><td>Yes, as JSON fields<\/td><td>Custom parser needed<\/td><td>Often, on higher plans<\/td><\/tr><tr><td>Data control<\/td><td>Runs on your machine<\/td><td>Runs on your machine<\/td><td>Vendor servers<\/td><\/tr><tr><td>\u6700\u9002\u5408<\/td><td>Developers, SEO teams, AI agents<\/td><td>\u5b66\u4e60<\/td><td>Teams that need an SLA<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">For a wider comparison of hosted options, see our <a href=\"https:\/\/nodemaven.com\/zh\/blog\/best-google-search-scrapers\/\">guide to the best Google search scrapers and SERP APIs<\/a>.<\/p>\n\n\n<div\n\t\t\t\n\t\t\tclass=\"so-widget-rhinocore-addons-rhino-alert-banner so-widget-rhinocore-addons-rhino-alert-banner-default-d75171398898\"\n\t\t\t\n\t\t><div class=\"rhino-widget rhino-widget--rhinocore-addons-rhino-alert-banner section-alert\" data-nm-label=\"banner\"    style=\"--alert-background-color: #E6E6FF\"\n>\n            <div class=\"section-alert__icon\">\n            <img decoding=\"async\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/02\/icon-4.svg\" alt=\"\" loading=\"lazy\" width=\"64\" height=\"64\">        <\/div>\n    \n            <div class=\"section-alert__main\">\n            \n                            <div class=\"section-alert__description\"><p><strong>About $1 per 1,000 Google pages. Residential proxies from $2.20\/GB<\/strong><\/p>\n<\/div>\n                    <\/div>\n    \n            <a\n            class=\"section-alert__button b-btn b-btn--static-xl b-btn--secondary-black\"\n            href=\"https:\/\/nodemaven.com\/zh\/pricing\/\"\n            >\n            \u67e5\u770b\u4ef7\u683c        <\/a>\n    <\/div>\n<\/div>\n\n\n<h2 id=\"h-frequently-asked-questions\" class=\"wp-block-heading translation-block\"><strong>\u5e38\u89c1<\/strong>\u95ee\u9898<\/h2>\n\n\n<div\n\t\t\t\n\t\t\tclass=\"so-widget-rhinocore-addons-faq so-widget-rhinocore-addons-faq-default-d75171398898\"\n\t\t\t\n\t\t>    <div class=\"rhino-widget rhino-widget--rhinocore-addons-faq section-faq\" data-nm-label=\"faq\">\n        <div class=\"section-faq__list section-faq__list--columns-1\" role=\"list\" aria-label=\"\u5e38\u89c1\u95ee\u9898\">\n                            <div class=\"section-faq__column\">\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Can you scrape Google search results with Python for free?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewbox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p>The software can be free. SERP Maven is open source under the MIT license. The searches still need residential proxy traffic, which costs about $1 per 1,000 result pages at $2.20\/GB. A free run with &#8211;no-proxy is possible, but Google starts answering with captchas much sooner.<\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Why does my first search take several minutes?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewbox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p>The first proxy IP warms up on a few ordinary pages before it searches Google. This builds cookies Google trusts. Later searches take seconds, and new proxy IPs start from those cookies. The scraper is not frozen, and the terminal shows each step.<\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Can I use any proxy provider?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewbox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p>Yes, if it supports sticky sessions. Pass it with &#8211;proxy and a {session} placeholder. A proxy that changes IP on every request is accepted with a warning, but warm-up does nothing on it. SOCKS5 needs an IP-whitelisted endpoint, because Chrome cannot send a SOCKS5 username and password.<\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">How do I get Google results for a specific country?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewbox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p>Set &#8211;gl for the country and &#8211;hl for the language. Google also uses the IP address, so pair them with a proxy from the same country. With NodeMaven, use &#8211;country to pick the exit location.<\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Can SERP Maven scrape Google Maps, Shopping or Images?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewbox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p>Not today. It returns the map pack from regular search as local_results, but not full Google Maps listings. Knowledge panels, Shopping and Images are not parsed.<\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">What should I do if results come back empty or wrong?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewbox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p>Google changes its pages often. Run with &#8211;save-html DIR, open the saved pages and check what Google returned. If the parser missed something, open an issue on the GitHub repository with what you see.<\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                    <\/div>\n                    <\/div>\n    <\/div>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\"><\/p>","protected":false},"excerpt":{"rendered":"Learn how to scrape Google search results with Python using SERP Maven, a free open-source SERP scraper","protected":false},"author":80,"featured_media":42153,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[213],"class_list":["post-42148","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-guides-tutorials"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.1 (Yoast SEO v28.1) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Scrape Google Search Results in Python: Free Tool 2026<\/title>\n<meta name=\"description\" content=\"Scrape Google search results with Python using SERP Maven, a free open-source scraper. Real Chrome, proxies and JSON with AI Overviews\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nodemaven.com\/zh\/blog\/how-to-scrape-google-search-results\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Scrape Google Search Results With Python: Free Open-Source Scraper (2026 Guide)\" \/>\n<meta property=\"og:description\" content=\"Scrape Google search results with Python using SERP Maven, a free open-source scraper. Real Chrome, proxies and JSON with AI Overviews\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nodemaven.com\/zh\/blog\/how-to-scrape-google-search-results\/\" \/>\n<meta property=\"og:site_name\" content=\"NodeMaven\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/people\/NodeMaven\/100095402507825\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-12T15:04:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-11-12T15:04:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/serp-maven-featured-1024x563.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"563\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Olga K.\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Olga K.\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-google-search-results\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-google-search-results\\\/\"},\"author\":{\"name\":\"Olga K.\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#\\\/schema\\\/person\\\/79a9c10c7956e31a5628504fe9cffe2e\"},\"headline\":\"How to Scrape Google Search Results With Python: Free Open-Source Scraper (2026 Guide)\",\"datePublished\":\"2026-11-12T15:04:06+00:00\",\"dateModified\":\"2026-11-12T15:04:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-google-search-results\\\/\"},\"wordCount\":1900,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-google-search-results\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/serp-maven-featured.png\",\"keywords\":[\"Guides &amp; Tutorials\"],\"inLanguage\":\"zh-CN\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-google-search-results\\\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/zh\\\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-google-search-results\\\/\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-google-search-results\\\/\",\"name\":\"Scrape Google Search Results in Python: Free Tool 2026\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-google-search-results\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-google-search-results\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/serp-maven-featured.png\",\"datePublished\":\"2026-11-12T15:04:06+00:00\",\"dateModified\":\"2026-11-12T15:04:07+00:00\",\"description\":\"Scrape Google search results with Python using SERP Maven, a free open-source scraper. Real Chrome, proxies and JSON with AI Overviews\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-google-search-results\\\/#breadcrumb\"},\"inLanguage\":\"zh-CN\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-google-search-results\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-CN\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-google-search-results\\\/#primaryimage\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/serp-maven-featured.png\",\"contentUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/serp-maven-featured.png\",\"width\":2400,\"height\":1320,\"caption\":\"SERP Maven scraper turning a Python command into Google search results as JSON\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-google-search-results\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nodemaven.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Scrape Google Search Results With Python: Free Open-Source Scraper (2026 Guide)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#website\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/\",\"name\":\"NodeMaven\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/nodemaven.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"zh-CN\"},{\"@type\":[\"Organization\",\"Place\"],\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#organization\",\"name\":\"NodeMaven\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/\",\"logo\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-google-search-results\\\/#local-main-organization-logo\"},\"image\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-google-search-results\\\/#local-main-organization-logo\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/people\\\/NodeMaven\\\/100095402507825\\\/\",\"https:\\\/\\\/t.me\\\/NodeMavenTG\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/nodemaven\\\/\"],\"telephone\":[],\"openingHoursSpecification\":[{\"@type\":\"OpeningHoursSpecification\",\"dayOfWeek\":[\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\",\"Sunday\"],\"opens\":\"00:00\",\"closes\":\"23:59\"}],\"legalName\":\"NodeMaven FZ LLC\",\"email\":\"support@nodemaven.com\",\"description\":\"NodeMaven is a proxy infrastructure provider offering residential, mobile, and ISP proxies with IP quality filtering, precise geo-targeting, HTTPS and SOCKS5 support, and developer APIs.\",\"contactPoint\":[{\"@type\":\"ContactPoint\",\"contactType\":\"customer support\",\"email\":\"support@nodemaven.com\"},{\"@type\":\"ContactPoint\",\"contactType\":\"legal\",\"email\":\"legal.public@nodemaven.com\"}],\"award\":[\"People Love Us, awarded by Trustpilot (2025)\",\"Top Rated, awarded by Top Business Software (2025)\",\"Customers Love Us, awarded by Sourceforge (2025)\",\"Users Love Us, awarded by G2 (2025)\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#\\\/schema\\\/person\\\/79a9c10c7956e31a5628504fe9cffe2e\",\"name\":\"Olga K.\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-CN\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/olga-kotko_avatar-96x96.jpg\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/olga-kotko_avatar-96x96.jpg\",\"contentUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/olga-kotko_avatar-96x96.jpg\",\"caption\":\"Olga K.\"},\"description\":\"I write about proxies and automation, translating complicated digital topics into research-driven content people can actually enjoy reading\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/zh\\\/author\\\/olga-kotko\\\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-CN\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/how-to-scrape-google-search-results\\\/#local-main-organization-logo\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/cropped-Untitled-design-8-1.png\",\"contentUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/cropped-Untitled-design-8-1.png\",\"width\":512,\"height\":512,\"caption\":\"NodeMaven\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Scrape Google Search Results in Python: Free Tool 2026","description":"Scrape Google search results with Python using SERP Maven, a free open-source scraper. Real Chrome, proxies and JSON with AI Overviews","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:\/\/nodemaven.com\/zh\/blog\/how-to-scrape-google-search-results\/","og_locale":"zh_CN","og_type":"article","og_title":"How to Scrape Google Search Results With Python: Free Open-Source Scraper (2026 Guide)","og_description":"Scrape Google search results with Python using SERP Maven, a free open-source scraper. Real Chrome, proxies and JSON with AI Overviews","og_url":"https:\/\/nodemaven.com\/zh\/blog\/how-to-scrape-google-search-results\/","og_site_name":"NodeMaven","article_publisher":"https:\/\/www.facebook.com\/people\/NodeMaven\/100095402507825\/","article_published_time":"2026-11-12T15:04:06+00:00","article_modified_time":"2026-11-12T15:04:07+00:00","og_image":[{"width":1024,"height":563,"url":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/serp-maven-featured-1024x563.png","type":"image\/png"}],"author":"Olga K.","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Olga K.","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-google-search-results\/#article","isPartOf":{"@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-google-search-results\/"},"author":{"name":"Olga K.","@id":"https:\/\/nodemaven.com\/#\/schema\/person\/79a9c10c7956e31a5628504fe9cffe2e"},"headline":"How to Scrape Google Search Results With Python: Free Open-Source Scraper (2026 Guide)","datePublished":"2026-11-12T15:04:06+00:00","dateModified":"2026-11-12T15:04:07+00:00","mainEntityOfPage":{"@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-google-search-results\/"},"wordCount":1900,"commentCount":0,"publisher":{"@id":"https:\/\/nodemaven.com\/#organization"},"image":{"@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-google-search-results\/#primaryimage"},"thumbnailUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/serp-maven-featured.png","keywords":["Guides &amp; Tutorials"],"inLanguage":"zh-CN","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nodemaven.com\/blog\/how-to-scrape-google-search-results\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/nodemaven.com\/zh\/#organization"}},{"@type":"WebPage","@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-google-search-results\/","url":"https:\/\/nodemaven.com\/blog\/how-to-scrape-google-search-results\/","name":"Scrape Google Search Results in Python: Free Tool 2026","isPartOf":{"@id":"https:\/\/nodemaven.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-google-search-results\/#primaryimage"},"image":{"@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-google-search-results\/#primaryimage"},"thumbnailUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/serp-maven-featured.png","datePublished":"2026-11-12T15:04:06+00:00","dateModified":"2026-11-12T15:04:07+00:00","description":"Scrape Google search results with Python using SERP Maven, a free open-source scraper. Real Chrome, proxies and JSON with AI Overviews","breadcrumb":{"@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-google-search-results\/#breadcrumb"},"inLanguage":"zh-CN","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nodemaven.com\/blog\/how-to-scrape-google-search-results\/"]}]},{"@type":"ImageObject","inLanguage":"zh-CN","@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-google-search-results\/#primaryimage","url":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/serp-maven-featured.png","contentUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/11\/serp-maven-featured.png","width":2400,"height":1320,"caption":"SERP Maven scraper turning a Python command into Google search results as JSON"},{"@type":"BreadcrumbList","@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-google-search-results\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nodemaven.com\/"},{"@type":"ListItem","position":2,"name":"How to Scrape Google Search Results With Python: Free Open-Source Scraper (2026 Guide)"}]},{"@type":"WebSite","@id":"https:\/\/nodemaven.com\/#website","url":"https:\/\/nodemaven.com\/","name":"NodeMaven","description":"","publisher":{"@id":"https:\/\/nodemaven.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nodemaven.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"zh-CN"},{"@type":["Organization","Place"],"@id":"https:\/\/nodemaven.com\/#organization","name":"NodeMaven","url":"https:\/\/nodemaven.com\/","logo":{"@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-google-search-results\/#local-main-organization-logo"},"image":{"@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-google-search-results\/#local-main-organization-logo"},"sameAs":["https:\/\/www.facebook.com\/people\/NodeMaven\/100095402507825\/","https:\/\/t.me\/NodeMavenTG","https:\/\/www.linkedin.com\/company\/nodemaven\/"],"telephone":[],"openingHoursSpecification":[{"@type":"OpeningHoursSpecification","dayOfWeek":["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],"opens":"00:00","closes":"23:59"}],"legalName":"NodeMaven FZ LLC","email":"support@nodemaven.com","description":"NodeMaven \u662f\u4e00\u5bb6\u4ee3\u7406\u57fa\u7840\u8bbe\u65bd\u670d\u52a1\u5546\uff0c\u63d0\u4f9b\u4f4f\u5b85\u3001\u79fb\u52a8\u548c ISP \u4ee3\u7406\uff0c\u5177\u5907 IP \u8d28\u91cf\u7b5b\u9009\u3001\u7cbe\u51c6\u5730\u7406\u5b9a\u5411\u3001HTTPS \u548c SOCKS5 \u652f\u6301\uff0c\u4ee5\u53ca\u5f00\u53d1\u8005 API\u3002","contactPoint":[{"@type":"ContactPoint","contactType":"customer support","email":"support@nodemaven.com"},{"@type":"ContactPoint","contactType":"legal","email":"legal.public@nodemaven.com"}],"award":["People Love Us, awarded by Trustpilot (2025)","Top Rated, awarded by Top Business Software (2025)","Customers Love Us, awarded by Sourceforge (2025)","Users Love Us, awarded by G2 (2025)"]},{"@type":"Person","@id":"https:\/\/nodemaven.com\/#\/schema\/person\/79a9c10c7956e31a5628504fe9cffe2e","name":"Olga K.","image":{"@type":"ImageObject","inLanguage":"zh-CN","@id":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/05\/olga-kotko_avatar-96x96.jpg","url":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/05\/olga-kotko_avatar-96x96.jpg","contentUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/05\/olga-kotko_avatar-96x96.jpg","caption":"Olga K."},"description":"\u6211\u64b0\u5199\u5173\u4e8e\u4ee3\u7406\u548c\u81ea\u52a8\u5316\u7684\u5185\u5bb9\uff0c\u5c06\u590d\u6742\u7684\u6570\u5b57\u5316\u4e3b\u9898\u8f6c\u5316\u4e3a\u4ee5\u7814\u7a76\u4e3a\u9a71\u52a8\u3001\u8ba9\u4eba\u771f\u6b63\u4e50\u4e8e\u9605\u8bfb\u7684\u6587\u7ae0\u3002","url":"https:\/\/nodemaven.com\/zh\/author\/olga-kotko\/"},{"@type":"ImageObject","inLanguage":"zh-CN","@id":"https:\/\/nodemaven.com\/blog\/how-to-scrape-google-search-results\/#local-main-organization-logo","url":"https:\/\/nodemaven.com\/wp-content\/uploads\/2025\/03\/cropped-Untitled-design-8-1.png","contentUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2025\/03\/cropped-Untitled-design-8-1.png","width":512,"height":512,"caption":"NodeMaven"}]}},"_links":{"self":[{"href":"https:\/\/nodemaven.com\/zh\/wp-json\/wp\/v2\/posts\/42148","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nodemaven.com\/zh\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nodemaven.com\/zh\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nodemaven.com\/zh\/wp-json\/wp\/v2\/users\/80"}],"replies":[{"embeddable":true,"href":"https:\/\/nodemaven.com\/zh\/wp-json\/wp\/v2\/comments?post=42148"}],"version-history":[{"count":3,"href":"https:\/\/nodemaven.com\/zh\/wp-json\/wp\/v2\/posts\/42148\/revisions"}],"predecessor-version":[{"id":42166,"href":"https:\/\/nodemaven.com\/zh\/wp-json\/wp\/v2\/posts\/42148\/revisions\/42166"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nodemaven.com\/zh\/wp-json\/wp\/v2\/media\/42153"}],"wp:attachment":[{"href":"https:\/\/nodemaven.com\/zh\/wp-json\/wp\/v2\/media?parent=42148"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nodemaven.com\/zh\/wp-json\/wp\/v2\/categories?post=42148"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nodemaven.com\/zh\/wp-json\/wp\/v2\/tags?post=42148"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}