[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-pt-praticas-serp-scraping-geo-targeted":3},{"success":4,"payload":5,"related":62,"errors":129},true,{"id":6,"slug":7,"title":8,"excerpt":9,"body_html":10,"meta_title":11,"meta_description":12,"canonical_url":13,"canonical_override":14,"og_title":11,"og_description":12,"og_image_url":15,"faq_json":16,"key_takeaways":14,"allow_index":29,"noindex_google_only":29,"allow_follow":4,"published_at":30,"updated_at":30,"content_updated_at":31,"featured_image_url":32,"featured_image_alt":33,"card_image_url":34,"reading_time_minutes":35,"author":36,"categories":40,"tags":47,"alternates":48,"locale_paths":50,"views":61},198,"praticas-serp-scraping-geo-targeted","Melhores Práticas de Geo-Targeted SERP Scraping: Guia para Desenvolvedores","Guia técnico de geo-targeted SERP scraping com Python: parâmetros uule, gl, hl, proxies residenciais por cidade, parsing com selectolax, sessões sticky e estratégias de anti-bloqueio.","\u003Ch2>Melhores práticas de geo-targeted SERP scraping: por que a localização muda os resultados do Google\u003C\u002Fh2>\n\u003Cp>Se você já pesquisou \"pizza\" de São Paulo e de Nova York no mesmo dia, notou que os resultados são completamente diferentes. O Google personaliza os SERPs com base na localização do usuário, e isso cria um desafio para engenheiros de SEO que precisam coletar dados de ranking por mercado. As melhores práticas de geo-targeted SERP scraping exigem que você controle não apenas os parâmetros da URL, mas também a geografia do IP que faz a requisição.\u003C\u002Fp>\n\u003Cp>O Google determina a localização do usuário através de três sinais principais: o endereço IP, os parâmetros de consulta (\u003Ccode>gl\u003C\u002Fcode>, \u003Ccode>hl\u003C\u002Fcode>, \u003Ccode>uule\u003C\u002Fcode>) e, quando disponível, dados de GPS ou localização do navegador. Quando esses sinais conflitam — por exemplo, um IP brasileiro com \u003Ccode>gl=US\u003C\u002Fcode> — o Google pode retornar resultados inconsistentes ou acionar verificações de segurança.\u003C\u002Fp>\n\u003Cp>Para SEO local, o targeting a nível de país é insuficiente. Uma consulta por \"dentista\" em \"Rio de Janeiro\" versus \"Recife\" produz rankings radicalmente diferentes, mesmo dentro do mesmo país. Você precisa de precisão a nível de cidade, e é aqui que o parâmetro \u003Ccode>uule\u003C\u002Fcode> se torna essencial.\u003C\u002Fp>\n\n\u003Ch2>Parâmetros de localização do Google: gl, hl, google_domain, lr e uule\u003C\u002Fh2>\n\u003Cp>O Google oferece vários parâmetros de URL para controlar a localização dos resultados. Combiná-los corretamente é o primeiro passo para coletar SERPs geo-targeted consistentes:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\u003Cth>Parâmetro\u003C\u002Fth>\u003Cth>Função\u003C\u002Fth>\u003Cth>Exemplo\u003C\u002Fth>\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\u003Ctd>\u003Ccode>gl\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>País dos resultados\u003C\u002Ftd>\u003Ctd>\u003Ccode>gl=US\u003C\u002Fcode>, \u003Ccode>gl=BR\u003C\u002Fcode>, \u003Ccode>gl=DE\u003C\u002Fcode>\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>hl\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Idioma da interface\u003C\u002Ftd>\u003Ctd>\u003Ccode>hl=en-US\u003C\u002Fcode>, \u003Ccode>hl=pt-BR\u003C\u002Fcode>\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>google_domain\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Domínio do Google\u003C\u002Ftd>\u003Ctd>\u003Ccode>google.com.br\u003C\u002Fcode>, \u003Ccode>google.de\u003C\u002Fcode>\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>lr\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Restringir idioma dos resultados\u003C\u002Ftd>\u003Ctd>\u003Ccode>lr=lang_pt\u003C\u002Fcode>, \u003Ccode>lr=lang_en\u003C\u002Fcode>\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>uule\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Localização precisa (cidade)\u003C\u002Ftd>\u003Ctd>\u003Ccode>w+CAIQICI...\u003C\u002Fcode> (base64)\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Ccode>pws\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Personalização web\u003C\u002Ftd>\u003Ctd>\u003Ccode>pws=0\u003C\u002Fcode> (desativada)\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>O parâmetro \u003Ccode>uule\u003C\u002Fcode> é o mais poderoso e o menos documentado. Ele aceita um valor codificado que representa uma localização precisa — cidade ou até mesmo coordenadas. O Google não documenta oficialmente o formato do \u003Ccode>uule\u003C\u002Fcode>, mas a comunidade de scraping identificou sua estrutura através de engenharia reversa:\u003C\u002Fp>\n\u003Cp>\u003Ccode>w+CAIQICI\u003C\u002Fcode> + caractere_de_comprimento + base64(nome_da_cidade)\u003C\u002Fp>\n\u003Cp>O caractere de comprimento é derivado do tamanho da string base64 usando \u003Ccode>chr(63 + len(b64))\u003C\u002Fcode>. A codificação \u003Ca href=\"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBase64\" rel=\"noopener noreferrer\">base64 é um padrão bem estabelecido\u003C\u002Fa>, e o prefixo \u003Ccode>w+CAIQICI\u003C\u002Fcode> é fixo para todas as localizações. Sempre adicione \u003Ccode>pws=0\u003C\u002Fcode> para obter uma baseline não personalizada — sem esse parâmetro, o Google pode injetar resultados baseados no histórico de pesquisa associado ao IP.\u003C\u002Fp>\n\n\u003Ch3>Construindo o uule e montando a URL de busca\u003C\u002Fh3>\n\u003Cpre>\u003Ccode>import base64\nimport urllib.parse\n\ndef build_uule(city_name):\n    &quot;&quot;&quot;Constrói o parâmetro uule do Google para uma cidade específica.&quot;&quot;&quot;\n    b64 = base64.b64encode(city_name.encode(&quot;utf-8&quot;)).decode(&quot;utf-8&quot;)\n    length_char = chr(63 + len(b64))\n    return f&quot;w+CAIQICI{length_char}{b64}&quot;\n\ndef build_serp_url(query, gl, hl, city, google_domain=&quot;google.com&quot;, num=10):\n    uule = build_uule(city)\n    params = {\n        &quot;q&quot;: query,\n        &quot;gl&quot;: gl,\n        &quot;hl&quot;: hl,\n        &quot;uule&quot;: uule,\n        &quot;pws&quot;: &quot;0&quot;,\n        &quot;num&quot;: str(num),\n    }\n    base = f&quot;https:\u002F\u002Fwww.{google_domain}\u002Fsearch&quot;\n    return base + &quot;?&quot; + urllib.parse.urlencode(params)\n\n# Exemplo: &quot;pizza&quot; em São Paulo, Brasil\nurl = build_serp_url(&quot;pizza&quot;, gl=&quot;BR&quot;, hl=&quot;pt-BR&quot;, city=&quot;Sao Paulo&quot;)\nprint(url)\n# https:\u002F\u002Fwww.google.com\u002Fsearch?q=pizza&amp;gl=BR&amp;hl=pt-BR&amp;uule=w%2BCAIQICI...&amp;pws=0&amp;num=10\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Note que \u003Ccode>urllib.parse.urlencode\u003C\u002Fcode> codifica automaticamente o \u003Ccode>+\u003C\u002Fcode> do prefixo uule como \u003Ccode>%2B\u003C\u002Fcode>, garantindo que o Google interprete o parâmetro corretamente.\u003C\u002Fp>\n\n\u003Ch2>Alinhando geografia do IP com parâmetros de consulta\u003C\u002Fh2>\n\u003Cp>Aqui está o ponto crítico que muitos desenvolvedores ignoram: o Google verifica a consistência entre a geografia do IP e os parâmetros de localização. Se você enviar \u003Ccode>gl=US\u003C\u002Fcode> e \u003Ccode>uule=New York\u003C\u002Fcode> através de um IP alemão, o Google pode ignorar seus parâmetros, retornar resultados híbridos inconsistentes ou acionar um CAPTCHA via redirecionamento 302.\u003C\u002Fp>\n\u003Cp>A solução é rotear cada requisição através de um proxy residencial cuja geografia corresponda ao mercado alvo. Com ProxyHat, você especifica país e cidade diretamente no nome de usuário: \u003Ccode>user-country-US-region-new_york-city-new_york_city:pass@gate.proxyhat.com:8080\u003C\u002Fcode>. Isso garante que o IP de saída seja um IP residencial real localizado em Nova York, alinhado com \u003Ccode>gl=US\u003C\u002Fcode> e \u003Ccode>uule=New York\u003C\u002Fcode>.\u003C\u002Fp>\n\n\u003Ch3>Proxy genérico vs ProxyHat com geo-targeting\u003C\u002Fh3>\n\u003Cpre>\u003Ccode>import requests\nfrom requests.adapters import HTTPAdapter\nfrom urllib3.util.retry import Retry\n\n# --- Proxy genérico (raw) ---\nraw_proxy = &quot;http:\u002F\u002Fuser:pass@190.0.0.1:8080&quot;\n\n# --- ProxyHat com geo-targeting (country + city) ---\nproxyhat_proxy = (\n    &quot;http:\u002F\u002Fuser-country-BR-region-sao_paulo-city-sao_paulo:pass&quot;\n    &quot;@gate.proxyhat.com:8080&quot;\n)\n\nsession = requests.Session()\nsession.proxies = {&quot;http&quot;: proxyhat_proxy, &quot;https&quot;: proxyhat_proxy}\n\nretry = Retry(total=3, backoff_factor=2,\n              status_forcelist=[429, 500, 502, 503])\nadapter = HTTPAdapter(max_retries=retry)\nsession.mount(&quot;https:\u002F\u002F&quot;, adapter)\n\nresponse = session.get(url, timeout=30)\nprint(f&quot;Status: {response.status_code}, Length: {len(response.text)}&quot;)\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>A diferença é fundamental: o proxy genérico não controla a geografia do IP de saída, enquanto o ProxyHat com \u003Ccode>-country-BR-region-sao_paulo-city-sao_paulo\u003C\u002Fcode> garante um IP residencial em São Paulo. O timeout de 30 segundos acomoda a latência adicional de proxies residenciais (~200–500ms).\u003C\u002Fp>\n\n\u003Ch3>Usando curl_cffi com impersonação de Chrome\u003C\u002Fh3>\n\u003Cp>O Google detecta fingerprints TLS inconsistentes. A biblioteca \u003Ccode>curl_cffi\u003C\u002Fcode> resolve isso impersonando o handshake TLS do Chrome:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>from curl_cffi import requests as cffi_requests\n\nproxyhat_proxy = (\n    &quot;http:\u002F\u002Fuser-country-US-region-new_york-city-new_york_city:pass&quot;\n    &quot;@gate.proxyhat.com:8080&quot;\n)\n\nurl = build_serp_url(&quot;coffee shops&quot;, gl=&quot;US&quot;, hl=&quot;en-US&quot;,\n                     city=&quot;New York&quot;, google_domain=&quot;google.com&quot;)\n\nresponse = cffi_requests.get(\n    url,\n    proxies={&quot;https&quot;: proxyhat_proxy},\n    impersonate=&quot;chrome&quot;,\n    timeout=30,\n)\n\nif response.status_code == 200:\n    html = response.text\n    print(f&quot;Recebidos {len(html)} caracteres&quot;)\nelif response.status_code == 429:\n    print(&quot;Rate limited - aplicar backoff exponencial&quot;)\nelse:\n    print(f&quot;Status inesperado: {response.status_code}&quot;)\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch2>Parsing de resultados orgânicos e local pack com selectolax\u003C\u002Fh2>\n\u003Cp>Depois de receber o HTML do SERP, você precisa extrair os resultados orgânicos e o \u003Cem>local pack\u003C\u002Fem> (a caixa de mapas com negócios locais). O Google muda a estrutura do HTML frequentemente, então use uma biblioteca de parsing rápida e tolerante. A \u003Ccode>selectolax\u003C\u002Fcode> usa \u003Ccode>libhtml5ever\u003C\u002Fcode> (Rust) por baixo, oferecendo velocidade próxima ao parsing nativo do navegador.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>from selectolax.parser import HTMLParser\n\ndef parse_serp(html):\n    tree = HTMLParser(html)\n    results = {&quot;organic&quot;: [], &quot;local_pack&quot;: []}\n\n    # Resultados orgânicos\n    for div in tree.css(&quot;div.g&quot;):\n        title_el = div.css_first(&quot;h3&quot;)\n        link_el = div.css_first(&quot;a&quot;)\n        if title_el and link_el:\n            results[&quot;organic&quot;].append({\n                &quot;title&quot;: title_el.text(strip=True),\n                &quot;url&quot;: link_el.attributes.get(&quot;href&quot;, &quot;&quot;),\n            })\n\n    # Local Pack (mapa + negócios locais)\n    for div in tree.css(&quot;div[role=&apos;article&apos;]&quot;):\n        name_el = div.css_first(&quot;div.dbg0pd&quot;)\n        if name_el:\n            results[&quot;local_pack&quot;].append({\n                &quot;name&quot;: name_el.text(strip=True),\n            })\n\n    return results\n\nparsed = parse_serp(html)\nprint(f&quot;Organicos: {len(parsed[&apos;organic&apos;])}&quot;)\nprint(f&quot;Local pack: {len(parsed[&apos;local_pack&apos;])}&quot;)\nfor r in parsed[&quot;organic&quot;][:3]:\n    print(f&quot;  {r[&apos;title&apos;]}&quot;)\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Os seletores CSS (\u003Ccode>div.g\u003C\u002Fcode>, \u003Ccode>div.dbg0pd\u003C\u002Fcode>) mudam periodicamente. Monitore a taxa de resultados extraídos por página — se cair abaixo de 8 resultados em uma página de 10, provavelmente o seletor quebrou e precisa de atualização.\u003C\u002Fp>\n\n\u003Ch2>Sessões sticky para SERPs de múltiplas páginas\u003C\u002Fh2>\n\u003Cp>Ao coletar múltiplas páginas de resultados (páginas 1–3), é importante manter o mesmo IP entre requisições. Se o IP mudar entre páginas, o Google pode interpretar como comportamento anômalo e retornar resultados diferentes ou bloquear. O ProxyHat suporta sessões sticky através do parâmetro \u003Ccode>session\u003C\u002Fcode> no nome de usuário.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>import uuid\nimport requests\n\ndef scrape_multipage(query, gl, hl, city, region, pages=3):\n    &quot;&quot;&quot;Raspa múltiplas páginas mantendo o mesmo IP (sticky session).&quot;&quot;&quot;\n    session_id = f&quot;serp-{uuid.uuid4().hex[:8]}&quot;\n    proxy = (\n        f&quot;http:\u002F\u002Fuser-country-{gl}-region-{region}-city-{city.replace(&apos; &apos;, &apos;_&apos;).lower()}&quot;\n        f&quot;-sid-{session_id}:pass@gate.proxyhat.com:8080&quot;\n    )\n\n    all_results = []\n    s = requests.Session()\n    s.proxies = {&quot;http&quot;: proxy, &quot;https&quot;: proxy}\n\n    for page in range(pages):\n        start = page * 10\n        url = build_serp_url(query, gl, hl, city, num=10)\n        url = url + &quot;&amp;start=&quot; + str(start)\n\n        resp = s.get(url, timeout=30)\n        if resp.status_code != 200:\n            print(f&quot;Pagina {page+1}: status {resp.status_code}, parando&quot;)\n            break\n\n        parsed = parse_serp(resp.text)\n        all_results.extend(parsed[&quot;organic&quot;])\n        print(f&quot;Pagina {page+1}: {len(parsed[&apos;organic&apos;])} resultados&quot;)\n\n    return all_results\n\nresults = scrape_multipage(&quot;dentista&quot;, &quot;BR&quot;, &quot;pt-BR&quot;,\n                           &quot;Rio de Janeiro&quot;, &quot;rio_de_janeiro&quot;, pages=3)\nprint(f&quot;Total coletado: {len(results)} resultados&quot;)\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch2>Backoff, retries e pools de proxy por país\u003C\u002Fh2>\n\u003Cp>Mesmo com proxies residenciais, você encontrará rate limits (HTTP 429) e CAPTCHAs ocasionais. O \u003Ca href=\"https:\u002F\u002Fdatatracker.ietf.org\u002Fdoc\u002Fhtml\u002Frfc7231#section-6.5.13\" rel=\"noopener noreferrer\">RFC 7231\u003C\u002Fa> define o status 429 e o header \u003Ccode>Retry-After\u003C\u002Fcode>, que o Google pode enviar para indicar quando tentar novamente. Sempre respeite esse header quando presente.\u003C\u002Fp>\n\u003Cp>Estratégia recomendada:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Backoff exponencial\u003C\u002Fstrong>: dobre o tempo de espera a cada tentativa, com jitter aleatório\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Rotação de sessão\u003C\u002Fstrong>: mude o identificador de sessão a cada retry para obter um novo IP\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Pools por país\u003C\u002Fstrong>: mantenha configurações de proxy separadas por mercado\u003C\u002Fli>\n\u003Cli>Timeout adequado: 30 segundos é um bom padrão para requisições via proxy\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cpre>\u003Ccode>import time\nimport random\nimport uuid\nimport logging\nimport requests\n\nlogging.basicConfig(level=logging.INFO)\nlogger = logging.getLogger(&quot;serp_scraper&quot;)\n\nPROXY_POOLS = {\n    &quot;US&quot;: &quot;http:\u002F\u002Fuser-country-US-sid-{sid}:pass@gate.proxyhat.com:8080&quot;,\n    &quot;BR&quot;: &quot;http:\u002F\u002Fuser-country-BR-sid-{sid}:pass@gate.proxyhat.com:8080&quot;,\n    &quot;DE&quot;: &quot;http:\u002F\u002Fuser-country-DE-sid-{sid}:pass@gate.proxyhat.com:8080&quot;,\n}\n\ndef fetch_with_backoff(url, country, max_retries=5):\n    for attempt in range(max_retries):\n        sid = f&quot;retry-{attempt}-{uuid.uuid4().hex[:6]}&quot;\n        proxy = PROXY_POOLS[country].format(sid=sid)\n\n        try:\n            resp = requests.get(\n                url,\n                proxies={&quot;https&quot;: proxy, &quot;http&quot;: proxy},\n                timeout=30,\n            )\n            if resp.status_code == 200:\n                return resp.text\n            elif resp.status_code == 429:\n                wait = (2 ** attempt) + random.uniform(0, 1)\n                logger.warning(f&quot;429 recebido, esperando {wait:.1f}s&quot;)\n                time.sleep(wait)\n            elif resp.status_code == 302:\n                logger.warning(&quot;Redirect (possivel CAPTCHA)&quot;)\n                time.sleep(5)\n            else:\n                logger.error(f&quot;Status {resp.status_code}&quot;)\n                time.sleep(2)\n        except requests.RequestException as e:\n            logger.error(f&quot;Erro de rede: {e}&quot;)\n            time.sleep(2)\n\n    return None\n\n# Uso:\nurl = build_serp_url(&quot;restaurante&quot;, gl=&quot;BR&quot;, hl=&quot;pt-BR&quot;, city=&quot;Sao Paulo&quot;)\nhtml = fetch_with_backoff(url, &quot;BR&quot;)\nif html:\n    parsed = parse_serp(html)\n    print(f&quot;{len(parsed[&apos;organic&apos;])} resultados orgânicos&quot;)\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch3>Comparação de tipos de proxy para SERP scraping\u003C\u002Fh3>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\u003Cth>Tipo de Proxy\u003C\u002Fth>\u003Cth>Precisão Geográfica\u003C\u002Fth>\u003Cth>Taxa de Sucesso\u003C\u002Fth>\u003Cth>Latência Típica\u003C\u002Fth>\u003Cth>Custo\u003C\u002Fth>\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\u003Ctd>Datacenter\u003C\u002Ftd>\u003Ctd>Baixa — IPs de datacenter conhecidos\u003C\u002Ftd>\u003Ctd>30–50%\u003C\u002Ftd>\u003Ctd>~50ms\u003C\u002Ftd>\u003Ctd>Baixo\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Residencial\u003C\u002Ftd>\u003Ctd>Alta — IPs reais de ISP por cidade\u003C\u002Ftd>\u003Ctd>85–95%\u003C\u002Ftd>\u003Ctd>~200–500ms\u003C\u002Ftd>\u003Ctd>Médio\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Mobile\u003C\u002Ftd>\u003Ctd>Muito alta — IPs de operadora móvel\u003C\u002Ftd>\u003Ctd>90–98%\u003C\u002Ftd>\u003Ctd>~300–800ms\u003C\u002Ftd>\u003Ctd>Alto\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Para geo-targeted SERP scraping, proxies residenciais oferecem o melhor equilíbrio entre custo e confiabilidade. Datacenter proxies são facilmente detectados pelo Google, resultando em taxas de sucesso de apenas 30–50%. Mais de 50 requisições simultâneas por IP aumenta significativamente a taxa de bloqueio.\u003C\u002Fp>\n\n\u003Ch2>Erros comuns e casos extremos\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>Parâmetros inconsistentes: \u003Ccode>gl=US\u003C\u002Fcode> com \u003Ccode>hl=pt-BR\u003C\u002Fcode> e IP brasileiro — o Google pode priorizar o IP sobre os parâmetros\u003C\u002Fli>\n\u003Cli>uule com nome errado: \"New York City\" vs \"New York\" — use o nome canônico sem qualificadores extras\u003C\u002Fli>\n\u003Cli>Esquecer pws=0: sem esse parâmetro, resultados podem variar entre coletas mesmo com o mesmo IP\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Não tratar redirecionamentos 302\u003C\u002Fstrong>: o Google usa 302 para redirecionar para CAPTCHAs; trate como sinal de bloqueio\u003C\u002Fli>\n\u003Cli>Concorrência excessiva: mais de 50 requisições simultâneas por IP dispara rate limiting rápido\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Não respeitar robots.txt\u003C\u002Fstrong>: sempre verifique o \u003Ccode>robots.txt\u003C\u002Fcode> do domínio alvo antes de coletar\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>Configuração no ProxyHat\u003C\u002Fh2>\n\u003Cp>O ProxyHat simplifica o geo-targeting através de flags no nome de usuário. Para SERP scraping localizado, a configuração é direta:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>País: \u003Ccode>user-country-US:pass@gate.proxyhat.com:8080\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>País + cidade: \u003Ccode>user-country-US-region-new_york-city-new_york_city:pass@gate.proxyhat.com:8080\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Sessão sticky: \u003Ccode>user-country-US-region-new_york-city-new_york_city-sid-abc123:pass@gate.proxyhat.com:8080\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>SOCKS5: \u003Ccode>socks5:\u002F\u002Fuser-country-US-region-new_york-city-new_york_city:pass@gate.proxyhat.com:1080\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Todas as requisições vão através de \u003Ccode>gate.proxyhat.com:8080\u003C\u002Fcode> (HTTP) ou \u003Ccode>gate.proxyhat.com:1080\u003C\u002Fcode> (SOCKS5). Consulte a \u003Ca href=\"https:\u002F\u002Fdocs.proxyhat.com\u002F\" rel=\"noopener noreferrer\">documentação do ProxyHat\u003C\u002Fa> para detalhes completos de autenticação e parâmetros avançados.\u003C\u002Fp>\n\u003Cp>Para explorar localizações disponíveis, visite \u003Ca href=\"\u002Fpt\u002Flocations\">nossa página de localizações\u003C\u002Fa>. Para comparar planos, veja \u003Ca href=\"\u002Fpt\u002Fpricing\">preços do ProxyHat\u003C\u002Fa>. Se você está construindo um pipeline de scraping mais amplo, confira nosso guia de \u003Ca href=\"\u002Fpt\u002Fuse-cases\u002Fweb-scraping\">web scraping\u003C\u002Fa> e \u003Ca href=\"\u002Fpt\u002Fuse-cases\u002Fserp-tracking\">SERP tracking\u003C\u002Fa>.\u003C\u002Fp>\n\n\u003Ch3>Exemplo rápido com curl\u003C\u002Fh3>\n\u003Cpre>\u003Ccode>curl -x &quot;http:\u002F\u002Fuser-country-US-region-new_york-city-new_york_city:pass@gate.proxyhat.com:8080&quot; \\\n  &quot;https:\u002F\u002Fwww.google.com\u002Fsearch?q=coffee&amp;gl=US&amp;hl=en-US&amp;pws=0&amp;num=10&quot; \\\n  -H &quot;User-Agent: Mozilla\u002F5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\u002F537.36&quot; \\\n  --compressed\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch2>Considerações sobre dados públicos e ToS\u003C\u002Fh2>\n\u003Cp>Raspagem de SERPs do Google existe em uma área cinzenta legal. Os \u003Ca href=\"https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\" rel=\"noopener noreferrer\">Termos de Serviço do Google\u003C\u002Fa> proíbem scraping automatizado. Na União Europeia, o GDPR se aplica a dados pessoais que possam aparecer nos resultados. Recomendações práticas:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Colete apenas dados públicos não pessoais (rankings, títulos, URLs)\u003C\u002Fli>\n\u003Cli>Não armazene dados pessoais de indivíduos identificados nos resultados\u003C\u002Fli>\n\u003Cli>Respeite \u003Ccode>robots.txt\u003C\u002Fcode> de cada domínio\u003C\u002Fli>\n\u003Cli>Use rate limiting razoável (não exceda 1 requisição por segundo por IP)\u003C\u002Fli>\n\u003Cli>Considere a API oficial do Google quando possível, embora ela não ofereça o mesmo nível de geo-targeting por cidade\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>Principais aprendizados\u003C\u002Fh2>\n\u003Cblockquote>\n\u003Cp>Key Takeaways:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>O parâmetro \u003Ccode>uule\u003C\u002Fcode> é essencial para precisão a nível de cidade — \u003Ccode>gl\u003C\u002Fcode> sozinho é insuficiente para SEO local\u003C\u002Fli>\n\u003Cli>A geografia do IP deve corresponder aos parâmetros de localização — use proxies residenciais por cidade\u003C\u002Fli>\n\u003Cli>Sempre adicione \u003Ccode>pws=0\u003C\u002Fcode> para baselines não personalizados e consistentes\u003C\u002Fli>\n\u003Cli>Use sessões sticky ao coletar múltiplas páginas do mesmo SERP\u003C\u002Fli>\n\u003Cli>Implemente backoff exponencial com rotação de sessão para tratar HTTP 429 e CAPTCHAs\u003C\u002Fli>\n\u003Cli>ProxyHat: \u003Ccode>user-country-US-region-new_york-city-new_york_city-sid-abc123:pass@gate.proxyhat.com:8080\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fblockquote>","Melhores Práticas Geo-Targeted SERP Scraping | ProxyHat","Guia de geo-targeted SERP scraping com Python: uule, gl, hl, proxies residenciais por cidade e anti-bloqueio. Aprenda a raspar SERPs locais com precisão.","\u002Fpt\u002Fblog\u002Fpraticas-serp-scraping-geo-targeted",null,"https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fpraticas-serp-scraping-geo-targeted-og.webp",[17,20,23,26],{"question":18,"answer":19},"O que é geo-targeted SERP scraping e quais são as melhores práticas?","Geo-targeted SERP scraping é a coleta de páginas de resultados do Google configuradas para uma localização específica, usando parâmetros como gl (país), hl (idioma) e uule (cidade). As melhores práticas incluem alinhar a geografia do IP proxy com os parâmetros de URL, usar pws=0 para desativar personalização, construir o uule corretamente com base64 do nome da cidade, e implementar sessões sticky para coleta de múltiplas páginas. Proxies residenciais com targeting de cidade são essenciais para evitar detecção.",{"question":21,"answer":22},"Por que o geo-targeted SERP scraping importa para usuários de proxy?","O Google retorna resultados diferentes conforme a localização do IP do solicitante. Sem proxies geo-targeted, seus dados de ranking refletirão a localização do seu servidor e não do mercado alvo. Proxies residenciais com targeting de cidade garantem que cada requisição venha de um IP real na localização correta, produzindo SERPs autênticos. Isso é crítico para rank tracking local, análise de concorrência por mercado e auditoria de SEO multi-regional.",{"question":24,"answer":25},"Qual tipo de proxy funciona melhor para geo-targeted SERP scraping?","Proxies residenciais são a melhor escolha, oferecendo taxas de sucesso de 85–95% com latência de 200–500ms. Datacenter proxies são facilmente detectados pelo Google (30–50% de sucesso). Mobile proxies têm a taxa mais alta (90–98%) mas custam mais. Para a maioria dos casos, proxies residenciais com targeting de cidade oferecem o melhor equilíbrio entre custo, confiabilidade e precisão geográfica.",{"question":27,"answer":28},"Como evitar bloqueios ao implementar geo-targeted SERP scraping?","Para evitar bloqueios: use proxies residenciais com geo-targeting por cidade, implemente backoff exponencial ao receber HTTP 429, rotacione sessões a cada retry, mantenha concorrência baixa (máximo 50 requisições simultâneas por IP), use curl_cffi com impersonação de Chrome para fingerprint TLS consistente, e sempre adicione pws=0. Trate redirecionamentos 302 como possíveis CAPTCHAs e faça pausas adequadas entre coletas.",false,"2026-07-31T16:11:16+00:00","2026-10-03T23:52:59+00:00","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fpraticas-serp-scraping-geo-targeted-master.webp","Geo-Targeted SERP Scraping Best Practices for Local SEO Data","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fpraticas-serp-scraping-geo-targeted-card.webp",12,{"name":37,"slug":38,"bio":39,"avatar_url":14,"website_url":14,"social_links":14},"ProxyHat Team","proxyhat-team","The ProxyHat editorial team covers proxies, web scraping, and data extraction.",[41],{"id":42,"slug":43,"name":44,"description":14,"meta_title":45,"meta_description":46,"parent_id":14},3,"serp-e-seo","SERP e SEO","Guias de SERP e SEO | Blog ProxyHat","Como rastrear posições em mecanismos de busca e extrair dados SERP com proxies.",[],{"en":49,"x-default":49},"\u002Fblog\u002Fgeo-targeted-serp-scraping-best-practices",{"zh":51,"ja":52,"pl":53,"es":54,"it":55,"tr":56,"ko":57,"en":49,"ru":58,"de":59,"fr":60,"pt":13},"\u002Fcn\u002Fblog\u002Fserp-dili-dingwei-zhuaqu-zhinan","\u002Fja\u002Fblog\u002Fgeo-targeted-serp-scraping-guide","\u002Fpl\u002Fblog\u002Fgeotargetowane-scrapowanie-serp-najlepsze-praktyki","\u002Fes\u002Fblog\u002Fscraping-serp-geo-segmentado-mejores-practicas","\u002Fit\u002Fblog\u002Fscraping-serp-geo-targetato-best-practices","\u002Ftr\u002Fblog\u002Fcografi-hedefli-serp-kazima-rehberi","\u002Fko\u002Fblog\u002Fgeo-targeted-serp-scraping-guide","\u002Fru\u002Fblog\u002Fgeo-targeted-serp-scraping-best-practices","\u002Fde\u002Fblog\u002Fgeo-targeted-serp-scraping-leitfaden","\u002Ffr\u002Fblog\u002Fscraping-serp-geocible-meilleures-pratiques",59,[63,80,96,113],{"id":64,"slug":65,"title":66,"excerpt":67,"featured_image_url":68,"featured_image_alt":69,"card_image_url":70,"og_image_url":71,"published_at":72,"updated_at":72,"content_updated_at":73,"reading_time_minutes":74,"is_featured":29,"indexable":29,"views":75,"author":76,"categories":77,"tags":79},155,"rastreamento-ranking-palavras-chave-amazon-proxies","Rastreamento de Ranking de Palavras-Chave na Amazon com Proxies: Guia para Desenvolvedores","Aprenda a implementar rastreamento de ranking de palavras-chave na Amazon com proxies residenciais, usando Python, curl_cffi e Playwright. Inclui exemplos de código, dicas de produção e armadilhas comuns.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Frastreamento-ranking-palavras-chave-amazon-proxies-master.webp","Amazon Keyword Rank Tracking with Proxies: A Developer's Guide","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Frastreamento-ranking-palavras-chave-amazon-proxies-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Frastreamento-ranking-palavras-chave-amazon-proxies-og.webp","2026-07-16T16:05:31+00:00","2026-10-03T08:21:21+00:00",13,98,{"name":37,"slug":38,"bio":39,"avatar_url":14,"website_url":14,"social_links":14},[78],{"id":42,"slug":43,"name":44,"description":14,"meta_title":45,"meta_description":46,"parent_id":14},[],{"id":81,"slug":82,"title":83,"excerpt":84,"featured_image_url":85,"featured_image_alt":86,"card_image_url":87,"og_image_url":88,"published_at":89,"updated_at":89,"content_updated_at":90,"reading_time_minutes":35,"is_featured":29,"indexable":29,"views":91,"author":92,"categories":93,"tags":95},153,"raspar-people-also-autocomplete-python-1","Como Raspar People Also Ask e Autocomplete do Google para Pesquisa de Palavras-chave (Guia Python)","Aprenda a raspar People Also Ask e Autocomplete do Google com Python, httpx e Playwright usando proxies residenciais para pesquisa de palavras-chave em escala.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fraspar-people-also-autocomplete-python-1-master.webp","Scrape Google People Also Ask and Autocomplete for Keyword Research (Python Guide)","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fraspar-people-also-autocomplete-python-1-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fraspar-people-also-autocomplete-python-1-og.webp","2026-07-14T16:06:25+00:00","2026-10-03T08:29:54+00:00",124,{"name":37,"slug":38,"bio":39,"avatar_url":14,"website_url":14,"social_links":14},[94],{"id":42,"slug":43,"name":44,"description":14,"meta_title":45,"meta_description":46,"parent_id":14},[],{"id":97,"slug":98,"title":99,"excerpt":100,"featured_image_url":101,"featured_image_alt":102,"card_image_url":103,"og_image_url":104,"published_at":105,"updated_at":105,"content_updated_at":106,"reading_time_minutes":107,"is_featured":29,"indexable":29,"views":108,"author":109,"categories":110,"tags":112},154,"como-rastrear-marca-google-ai-overviews","Como rastrear sua marca no Google AI Overviews: guia estratégico para equipes de SEO e dados","Guia prático para medir a visibilidade da sua marca no Google AI Overviews e answer engines usando proxies residenciais com Playwright. Inclui dados a capturar, build-vs-buy e governança.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fcomo-rastrear-marca-google-ai-overviews-master.webp","How to Track Your Brand in Google AI Overviews: A Strategic Guide for SEO & Data Teams","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fcomo-rastrear-marca-google-ai-overviews-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Fcomo-rastrear-marca-google-ai-overviews-og.webp","2026-07-14T10:05:37+00:00","2026-10-03T08:29:51+00:00",10,66,{"name":37,"slug":38,"bio":39,"avatar_url":14,"website_url":14,"social_links":14},[111],{"id":42,"slug":43,"name":44,"description":14,"meta_title":45,"meta_description":46,"parent_id":14},[],{"id":114,"slug":115,"title":116,"excerpt":117,"featured_image_url":118,"featured_image_alt":119,"card_image_url":120,"og_image_url":121,"published_at":122,"updated_at":122,"content_updated_at":123,"reading_time_minutes":35,"is_featured":29,"indexable":29,"views":124,"author":125,"categories":126,"tags":128},152,"rastreador-ranking-google-python-proxies-residenciais","Construir um Rastreador de Ranking Google em Python com Proxies Residenciais","Guia prático para desenvolvedores: construa um rastreador de posições Google em Python com proxies residenciais, paginação SERP, contornação de fingerprint TLS\u002FJA3 e armazenamento em SQLite.","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Frastreador-ranking-google-python-proxies-residenciais-master.webp","Build a Google Rank Tracker in Python with Residential Proxies","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Frastreador-ranking-google-python-proxies-residenciais-card.webp","https:\u002F\u002Fstatic.proxyhat.com\u002Fstorage\u002Fblog-covers\u002Fpt\u002Frastreador-ranking-google-python-proxies-residenciais-og.webp","2026-07-02T16:04:58+00:00","2026-10-03T23:53:00+00:00",56,{"name":37,"slug":38,"bio":39,"avatar_url":14,"website_url":14,"social_links":14},[127],{"id":42,"slug":43,"name":44,"description":14,"meta_title":45,"meta_description":46,"parent_id":14},[],[]]