You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何循环遍历加拿大经纬度构造URL抓取门店数据且避免被网站封禁

加拿大Circle K门店数据批量抓取实现方案

经纬度遍历逻辑说明

你需要遍历的参数范围如下:

  • 纬度(lat):42 ~ 83(对应北纬范围)
  • 经度(lng):-141 ~ -53(西经对应URL内的负数值)

建议设置步长为0.5度,既能覆盖全部区域避免漏抓门店,也能大幅减少总请求量,降低触发反爬的概率。

反爬优化核心规则

  • 请求间隔设置随机值,不要使用固定间隔,避免被网站识别为机器行为
  • 单次请求返回状态码异常时,主动增加重试间隔,连续失败3次直接跳过当前坐标段
  • 对返回的门店数据按门店ID做去重处理,相邻坐标返回的重复门店不需要重复存储
  • 可定期轮换User-Agent参数,避免单一请求特征被拦截

完整实现代码

import requests
import time
import random

# 初始化去重集合,用来存已经抓取过的门店ID
store_ids = set()
# 坐标参数范围和步长设置
LAT_MIN, LAT_MAX = 42, 83
LNG_MIN, LNG_MAX = -141, -53
STEP = 0.5
# UA池,用来轮换请求头降低拦截概率
UA_LIST = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Edge/114.0.1823.51 Safari/537.36'
]

payload={}

# 遍历所有坐标点
lat = LAT_MIN
while lat <= LAT_MAX:
    lng = LNG_MIN
    while lng <= LNG_MAX:
        # 随机选UA构造请求头
        headers = {
            'Connection': 'keep-alive',
            'sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
            'Accept': '*/*',
            'X-Requested-With': 'XMLHttpRequest',
            'sec-ch-ua-mobile': '?0',
            'User-Agent': random.choice(UA_LIST),
            'Sec-Fetch-Site': 'same-origin',
            'Sec-Fetch-Mode': 'cors',
            'Sec-Fetch-Dest': 'empty',
            'Referer': f'https://www.circlek.com/store-locator?Canada&lat={lat}&lng={lng}',
            'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8',
            'dnt': '1'
        }
        url = f"https://www.circlek.com/stores_new.php?lat={lat}&lng={lng}&services=&region=global"
        
        # 重试逻辑
        retry_count = 0
        while retry_count < 3:
            try:
                response = requests.request("GET", url, headers=headers, data=payload, timeout=10)
                if response.status_code == 200:
                    # 此处可替换为你自己的解析、去重、存储逻辑
                    print(response.text)
                    # 随机延时2-5秒再发下一个请求
                    time.sleep(random.uniform(2,5))
                    break
                else:
                    # 状态码异常,等待更长时间再重试
                    retry_count +=1
                    time.sleep(random.uniform(10,15))
            except Exception as e:
                retry_count +=1
                time.sleep(random.uniform(10,15))
        lng += STEP
    lat += STEP

内容的提问来源于stack exchange,提问作者John_Muir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 10:03:04