PyCharm Python爬取locatefamily印度街列全页数据及文件导出的方法咨询
原代码失效核心原因
- 分页URL拼接逻辑错误:直接在
index.html后缀后拼接数字,生成的链接为index.html1、index.html2这类无效地址,实际站点分页规则为第一页index.html,后续页面为index_2.html、index_3.html格式 - 请求缺少常规请求头:裸requests请求的默认User-Agent会被站点反爬规则拦截,多数请求返回403状态或空响应
- 异常处理逻辑错位:
time.sleep(30)写在continue语句之后,触发异常时会直接跳过休眠逻辑,高频请求极易触发IP封禁 - 元素提取逻辑错误:默认定位
p标签提取文本,但列表条目下多数有效文本不存在于p标签中,直接提取会触发空值报错 - 无数据导出逻辑:爬取的数据仅在控制台打印,未落地为CSV或TXT文件
修正后可稳定运行的完整代码
from bs4 import BeautifulSoup import requests import time import csv # 构造合规分页链接 base_url = "https://www.locatefamily.com/Street-Lists/India/" page_list = [base_url + "index.html"] for i in range(2, 60): page_list.append(base_url + f"index_{i}.html") # 配置常规浏览器请求头,绕过基础反爬校验 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } street_data = [] for idx, page in enumerate(page_list): try: resp = requests.get(page, headers=headers, timeout=10) resp.encoding = resp.apparent_encoding soup = BeautifulSoup(resp.text, 'html.parser') # 定位所有街道列表条目 items = soup.find_all('div', {'class': 'list-group-item'}) print(f"正在爬取第{idx+1}页,获取到{len(items)}条有效数据") for item in items: # 提取条目全量有效文本,避免空标签报错 clean_text = item.get_text(strip=True, separator=" ") street_data.append(clean_text) # 每爬完一页固定间隔1.5秒,降低请求频率 time.sleep(1.5) except Exception as e: print(f"第{idx+1}页爬取出错:{str(e)}") # 异常触发时休眠20秒再继续,避免触发反爬封禁 time.sleep(20) continue # 导出CSV文件,带BOM头确保Excel打开无中文乱码 with open("india_street_list.csv", "w", newline="", encoding="utf-8-sig") as f: writer = csv.writer(f) writer.writerow(["印度街道列表条目内容"]) for row in street_data: writer.writerow([row]) # 同步导出TXT记事本文件 with open("india_street_list.txt", "w", encoding="utf-8") as f: f.write("\n".join(street_data)) print(f"全量爬取完成,共获取{len(street_data)}条数据,已保存为CSV和TXT文件")
运行注意事项
- 如果运行过程中连续出现403响应,可将单页爬取间隔从1.5秒调整为3-5秒,降低请求频率
- 若站点实际总页数不足59页,代码会自动跳过不存在的无效分页链接,不会影响有效页面的数据采集
- 导出的CSV文件默认使用
utf-8-sig编码,直接用Excel打开不会出现中文或特殊字符乱码
内容的提问来源于stack exchange,提问作者samsung galaxy
相关产品推荐
相关产品推荐

