Resposta rápida
Verifique os preços de Jumia, Takealot e Konga correspondendo à variante do produto, vendedor, moeda e contexto de entrega. A partir de 15 de outubro de 2026, o tráfego de proxies residenciais AfricaProxies começa em US$ 0,50/GB, sem KYC e com financiamento em cripto. O exemplo em Python faz uma única pedido limitado a um alvo HTTPS autorizado; as permissões de acesso e reutilização de cada comerciante ainda regem o estudo real.
Factos principais
| Jumia Nigéria | Registe NGN e o vendedor e variante de produto exatos |
|---|---|
| Takealot | Registo ZAR, condições de venda e cumprimento |
| Konga | Manter o contexto original da oferta e entrega da Nigéria |
| Rota de acesso | Feed de merchant, API aprovado ou permissão explícita de recolha |
| Teste de rede | Uma solicitação autorizada limitada; sem redirecionamentos automáticos |
| Faturação | tráfego enviado e recebido, incluindo cabeçalhos |
Como criar um registro comparável de preços do varejo africano?
Escolha a rota de dados permitida
Utilize um feed do comerciante, uma API aprovada ou acesso expressamente permitido. Defina os campos autorizados e a frequência antes de repetir um estudo da Jumia, da Takealot ou da Konga.
Igualar a oferta
Mantenha o modelo, variante, vendedor, estado do stock e quantidade constantes. Registe NGN ou ZAR e o destino de entrega; uma taxa de envio ausente permanece como desconhecida em vez de zero.
Guardar uma observação datada
Guarde o URL de origem, o método de recolha e a hora da observação juntamente com o preço original na moeda local. Um redirecionamento, uma recusa ou um limite de pedidos são resultados a analisar antes de retomar.
Qual combinação de vendedor e país estou observando?
Identifique o site efetivo do comerciante para o país antes de recolher um registo. A Jumia Nigeria e a Jumia Kenya correspondem a mercados diferentes; a Konga é uma plataforma de comércio nigeriana, enquanto a Takealot é um exemplo de retalho sul-africano. Guarde a moeda e o destino originais em cada linha. Um IP de país não identifica o vendedor, a variante do produto nem o custo final de entrega.
Como posso evitar uma comparação de preços falsa?
Correlacione o modelo, a capacidade, a condição, o vendedor e o contexto de envio. Mantenha o estado de stock de uma oferta separado do seu preço. Se um comerciante listar uma taxa de envio e outro não, relate essa evidência em falta em vez de atribuir zero. Preserve a URL da fonte e a hora da observação para que um revisor possa voltar à oferta exata. A conversão de moeda pertence a um cálculo datado separado.
Qual via devo usar para coletar dados?
Prefira um feed fornecido por um comerciante ou uma API aprovada para recolha repetida. Caso contrário, obtenha permissão para as páginas, campos e frequência de pedidos pretendidos. Inspecione os termos de acesso do alvo e os limites documentados. A visibilidade de uma página pública não é uma autorização geral para automatizar. Pare em caso de negação de acesso ou resposta de estrangulamento e resolva a rota permitida antes de retomar.
import os
from urllib.parse import quote, urlsplit
import requests
# Only your own target or a URL covered by written permission.
target = os.environ["AUTHORIZED_TARGET_URL"]
allowed_host = os.environ["AUTHORIZED_TARGET_HOST"]
parts = urlsplit(target)
if (parts.scheme != "https" or parts.hostname != allowed_host
or parts.username or parts.password):
raise SystemExit("Target must match the authorized HTTPS host without embedded credentials")
user = quote(os.environ["PROXY_USER"] + "-country-ng", safe="")
password = quote(os.environ["PROXY_PASSWORD"], safe="")
proxy = f"http://{user}:{password}@gw.africaproxies.com:7777"
try:
with requests.Session() as session:
session.trust_env = False
with session.get(target, proxies={"http": proxy, "https": proxy},
timeout=(10, 30), allow_redirects=False, stream=True) as response:
response.raise_for_status()
if 300 <= response.status_code < 400:
raise SystemExit("Inspect and authorize the redirect separately")
total = 0
for chunk in response.iter_content(8192):
total += len(chunk)
if total > 1_000_000:
raise SystemExit("Sample body limit reached")
print({"status": response.status_code, "decoded_body_bytes": total})
except requests.exceptions.RequestException as error:
status = error.response.status_code if error.response is not None else "unavailable"
# Do not print the exception, URL, proxy address or chained traceback.
raise SystemExit(f"Request stopped: {type(error).__name__}; status={status}") from NoneO que esta amostra de diagnóstico mede?
A amostra verifica o status do transporte e um corpo de resposta decodificado com limite. Não extrai o preço de um retalhista, executa JavaScript de navegador ou relata totais de tráfego faturáveis. As solicitações podem descomprimir uma resposta, portanto, o tamanho do corpo decodificado impresso não é uma medição de faturamento de proxy. O uso real da conta inclui ambas as direções e cabeçalhos. O código não segue redirecionamentos até que o host redirecionado seja aprovado separadamente.
Como ampliar depois de um diagnóstico bem-sucedido?
Primeiro, valide uma pequena amostra autorizada para qualidade de dados e âmbito legal. Use a frequência de pedidos permitida e preserve os erros como estados em vez de valores de preço fabricados. Meça o uso real da conta antes de definir o orçamento. Uma resposta de diagnóstico bem-sucedida não prova que o stock do país permanecerá disponível durante todo um cronograma. Mantenha a disponibilidade da cidade e as interrupções de sessão com o mesmo IP no registo do experimento.
Perguntas frequentes
Posso executar este exemplo diretamente em qualquer página da Jumia?
Apenas se esse alvo for seu ou o acesso proposto for autorizado. Defina o host de destino exato aprovado e URL; a amostra não seleciona deliberadamente um retalhista automaticamente. Um produto Jumia visível publicamente não autoriza por si só a recolha repetida, por isso defina o método permitido antes de executar o código.
O código coleta dados de finalização da compra ou de pagamento?
Não. O fluxo de trabalho diz respeito a ofertas públicas autorizadas em vez de credenciais de checkout, registros de clientes ou detalhes de pagamento. Portais bancários e de pagamento são bloqueados pela política de serviço. Para pesquisas de Jumia, Takealot ou Konga, registre o produto público e o contexto de entrega; use um sandbox aprovado para sua própria interface transacional QA.
O que uma resposta 429 significa para o meu projeto?
Uma resposta 429 diz à amostra para parar para que os limites do alvo e a rota de acesso permitida possam ser inspecionados. Não aumente a concorrência ou altere as saídas em resposta a essa recusa. Mantenha a categoria e o tempo da resposta, reveja a autorização do projeto e utilize um feed aprovado ou API onde apropriado.
O tamanho do corpo decodificado é igual aos GB faturados?
Não. O corpo da resposta decodificado impresso pelo Requests é diferente da contabilização de tráfego do serviço. A faturação inclui upload, download e cabeçalhos, enquanto a descompressão pode alterar o tamanho do corpo exibido. Utilize o tráfego medido da conta para um orçamento Jumia ou Takealot, em vez de multiplicar os bytes do ficheiro guardado por uma contagem de páginas assumida.
E quanto a um redirecionamento para outro domínio?
A amostra para sem seguir o redirecionamento. Inspecione o host do destino e o motivo do redirecionamento, e autorize-o separadamente antes de o adicionar ao fluxo de trabalho. Um comerciante pode enviar uma oferta para outro domínio ou rota de conta; o URL aprovado original não aprova automaticamente esse novo alvo.
Como mantenho as credenciais de acesso fora dos relatórios?
Use variáveis de ambiente, credenciais de acesso do projeto e logs de diagnóstico redigidos. Nunca imprima o proxy URL com o seu nome de utilizador e palavra-passe incorporados. A amostra rejeita credenciais no alvo URL e captura falhas de Requests sem imprimir as suas URLs ou tracebacks encadeados. Mantenha também os tokens de consulta fora dos registos partilhados.
Fontes (1)
- Requests: advanced usage, proxies and streaming — Requests documentation (2026-10-14)