Python Requests + XPath 爬取六只脚轨迹数据:30页/870条实战与反爬策略
Python Requests XPath 实战高效爬取户外轨迹数据与反爬策略1. 项目背景与目标户外运动爱好者经常会在六只脚等平台分享他们的GPS轨迹数据这些数据包含丰富的时空信息如经纬度、海拔、速度等。对于研究人员和数据分析师来说这些数据可以用来分析用户行为、优化景区规划或研究城市交通模式。本项目的目标是构建一个健壮的Python爬虫能够自动登录六只脚平台按关键词搜索并爬取多页轨迹数据处理常见的反爬机制将数据规范存储为结构化格式实现可配置的爬取参数2. 技术选型与准备2.1 核心工具链# 主要依赖库 import requests # 网络请求 from lxml import etree # HTML解析 import pandas as pd # 数据处理 from fake_useragent import UserAgent # 随机User-Agent生成 import time # 请求间隔控制 import json # JSON数据处理 import os # 文件系统操作 import re # 正则表达式2.2 环境配置建议创建虚拟环境python -m venv trail_env source trail_env/bin/activate # Linux/Mac trail_env\Scripts\activate # Windows安装依赖pip install requests lxml pandas fake-useragent3. 核心爬取逻辑实现3.1 网站结构分析六只脚网站的典型数据结构组件URL模式数据格式搜索页http://www.foooooot.com/search/trip/all/1/all/time/descent/?pageNkeywordXXXHTML轨迹详情http://www.foooooot.com/trip/[轨迹ID]/HTML轨迹数据http://www.foooooot.com/trip/[轨迹ID]/trackjson/JSON3.2 分步骤实现3.2.1 登录与会话保持def get_csrf_token(): 获取CSRF令牌 login_url http://www.foooooot.com/accounts/login/ headers {User-Agent: UserAgent().random} response requests.get(login_url, headersheaders) # 使用正则提取CSRF token pattern rinput typehidden namecsrfmiddlewaretoken value(.*?) csrf_token re.search(pattern, response.text).group(1) return csrf_token def login(session, csrf_token, email, password): 执行登录操作 login_data { csrfmiddlewaretoken: csrf_token, email: email, password: password, next: /accounts/login_complete/ } headers { User-Agent: UserAgent().random, Referer: http://www.foooooot.com/accounts/login/ } response session.post( http://www.foooooot.com/accounts/login/, datalogin_data, headersheaders ) return response.status_code 2003.2.2 分页爬取轨迹IDdef get_trip_ids(session, keyword, start_page1, max_pages30): 获取指定关键词的轨迹ID列表 trip_ids [] current_page start_page while True: url fhttp://www.foooooot.com/search/trip/all/1/all/time/descent/?page{current_page}keyword{keyword} response session.get(url) if response.status_code ! 200: break tree etree.HTML(response.text) links tree.xpath(//p[classtrip-title]/a/href) if not links: break # 提取轨迹ID/trip/123456/ → 123456 page_ids [link.split(/)[2] for link in links] trip_ids.extend(page_ids) # 控制请求频率 time.sleep(3 random.random() * 2) current_page 1 if current_page max_pages: break return trip_ids3.2.3 获取轨迹详情数据def get_trip_data(session, trip_id): 获取单条轨迹的详细数据 json_url fhttp://www.foooooot.com/trip/{trip_id}/trackjson/ try: response session.get(json_url, timeout10) if response.status_code 200: return response.json() except Exception as e: print(fError fetching trip {trip_id}: {str(e)}) return None4. 反爬策略应对方案4.1 常见反爬机制及对策反爬类型应对策略代码实现User-Agent检测随机User-AgentUserAgent().random请求频率限制随机延迟 指数退避time.sleep(2 random.random()*3)IP封锁代理IP池proxies{http: ip:port}登录验证保持会话 CSRF处理requests.Session()行为检测模拟人类操作模式随机点击、滚动等4.2 健壮性增强实现def safe_request(session, url, max_retries3, timeout10): 带重试机制的请求函数 for attempt in range(max_retries): try: response session.get( url, timeouttimeout, headers{User-Agent: UserAgent().random} ) if response.status_code 200: return response elif response.status_code 403: raise Exception(IP可能被封禁) except Exception as e: if attempt max_retries - 1: raise wait_time (2 ** attempt) random.random() time.sleep(wait_time) return None5. 数据存储与处理5.1 数据结构设计典型的轨迹数据包含以下字段{ timestamp: 1625097600, # UNIX时间戳 latitude: 39.9075, # 纬度 longitude: 116.3972, # 经度 altitude: 50.2, # 海拔(米) speed: 5.3, # 速度(km/h) distance: 1250.4 # 累计距离(米) }5.2 存储方案比较格式优点缺点适用场景CSV易读兼容性好无模式查询效率低小型数据集快速原型JSON结构化保留类型存储空间较大复杂嵌套数据SQLite查询高效支持索引需要数据库知识中型数据集需要查询Parquet列式存储高效压缩需要特殊工具读取大数据量分析5.3 示例存储实现def save_to_csv(data, keyword, trip_id): 保存单条轨迹数据到CSV os.makedirs(f{keyword}_tracks, exist_okTrue) filename f{keyword}_tracks/{trip_id}.csv df pd.DataFrame(data) df.to_csv(filename, indexFalse, encodingutf-8-sig) print(fSaved {len(df)} points to {filename}) def save_to_sqlite(data, db_pathtracks.db): 保存到SQLite数据库 import sqlite3 conn sqlite3.connect(db_path) df pd.DataFrame(data) df.to_sql(tracks, conn, if_existsappend, indexFalse) conn.close()6. 完整爬虫架构6.1 主程序流程def main(): # 初始化配置 keyword input(请输入搜索关键词: ) start_page int(input(请输入起始页码: )) max_pages int(input(请输入最大爬取页数: )) # 创建会话 session requests.Session() # 登录流程 csrf_token get_csrf_token() if not login(session, csrf_token, your_email, your_password): print(登录失败) return # 获取轨迹ID列表 trip_ids get_trip_ids(session, keyword, start_page, max_pages) print(f共发现{len(trip_ids)}条轨迹) # 爬取每条轨迹数据 for trip_id in trip_ids: try: data get_trip_data(session, trip_id) if data: save_to_csv(data, keyword, trip_id) time.sleep(2 random.random()) # 随机延迟 except Exception as e: print(f处理轨迹{trip_id}时出错: {str(e)}) continue print(爬取任务完成) if __name__ __main__: main()6.2 配置参数建议# config.py DEFAULT_CONFIG { request: { timeout: 15, retries: 3, delay: (2, 5) # 随机延迟范围(秒) }, auth: { email: youremail.com, password: your_password }, storage: { format: csv, # csv/json/sqlite output_dir: ./data } }7. 高级技巧与优化7.1 性能优化策略异步请求使用aiohttp替代requestsimport aiohttp import asyncio async def fetch(session, url): async with session.get(url) as response: return await response.json() async def main(): async with aiohttp.ClientSession() as session: tasks [fetch(session, url) for url in urls] return await asyncio.gather(*tasks)连接池复用配置requests.Session的连接池session requests.Session() adapter requests.adapters.HTTPAdapter( pool_connections10, pool_maxsize50, max_retries3 ) session.mount(http://, adapter)7.2 数据质量保障数据验证def validate_track_point(point): required_fields [latitude, longitude, timestamp] return all(field in point for field in required_fields)异常数据处理def clean_data(data): # 移除无效数据点 return [p for p in data if -90 p[latitude] 90 and -180 p[longitude] 180]8. 可视化与分析示例8.1 使用Pandas进行基础分析import pandas as pd import matplotlib.pyplot as plt # 加载数据 df pd.read_csv(岳麓山_tracks/123456.csv) # 计算基本统计量 stats df.describe() print(stats) # 绘制海拔变化图 plt.figure(figsize(10, 4)) df[altitude].plot(title海拔变化) plt.xlabel(轨迹点序号) plt.ylabel(海拔(米)) plt.show()8.2 使用Folium绘制轨迹地图import folium # 创建地图 m folium.Map( location[df[latitude].mean(), df[longitude].mean()], zoom_start14 ) # 添加轨迹线 folium.PolyLine( list(zip(df[latitude], df[longitude])), colorblue, weight2.5, opacity1 ).add_to(m) # 保存为HTML m.save(trail_map.html)9. 项目扩展方向分布式爬取使用Scrapy-Redis实现分布式爬虫实时监控添加Prometheus监控指标数据管道集成Apache Airflow实现定期爬取API服务使用FastAPI提供数据查询接口提示在实际项目中建议添加完善的日志记录和异常处理机制可以使用Python的logging模块实现分级日志记录。

相关新闻

村长团队GTA5序列帧动画超详细零基础教程

村长团队GTA5序列帧动画超详细零基础教程

GTA5序列帧动画超详细零基础教程一、前期必备工具下载与安装1、首先下载安装Blender软件,优先选择3.0以上稳定版本,同时安装适配Blender版本的Sollumz插件,这是GTA5模组制作核心插件,缺一不可;2、下载安装OpenIV软件&a…

2026/7/10 8:04:24 阅读更多 →
Shell脚本精读 · S13-01 | POSIX sh 与 Bash:语法对照表

Shell脚本精读 · S13-01 | POSIX sh 与 Bash:语法对照表

模块:S13 可移植性与规范 篇号:S13-01 / 42 预计阅读:50 分钟 主线:Bash(对照 POSIX sh) 文章目录本篇目标30 秒速览正文1. 先看清 shebang2. POSIX sh 与 Bash 关系(够用理解)3. 总…

2026/7/10 8:02:23 阅读更多 →
STM32F103 ADC 12位配置实战:单通道与多通道采样,误差控制在±0.01V

STM32F103 ADC 12位配置实战:单通道与多通道采样,误差控制在±0.01V

STM32F103 ADC 12位配置实战:单通道与多通道采样精度优化指南1. 硬件设计基础与误差源分析在嵌入式传感器数据采集系统中,ADC精度直接影响最终测量结果的可靠性。STM32F103C8T6内置的12位逐次逼近型ADC理论上具有1LSB的理想精度,但实际应用中…

2026/7/10 7:58:22 阅读更多 →

最新新闻

如何在现代电脑上通过Xenia Canary重温Xbox 360经典游戏?实用安装与优化指南

如何在现代电脑上通过Xenia Canary重温Xbox 360经典游戏?实用安装与优化指南

如何在现代电脑上通过Xenia Canary重温Xbox 360经典游戏?实用安装与优化指南 【免费下载链接】xenia-canary Xbox 360 Emulator Research Project 项目地址: https://gitcode.com/gh_mirrors/xe/xenia-canary Xenia Canary是一款开源免费的Xbox 360模拟器研…

2026/7/10 9:02:39 阅读更多 →
SVPWM 空间矢量调制:从 MATLAB/Simulink 仿真到 STM32 实现,谐波降低 15%

SVPWM 空间矢量调制:从 MATLAB/Simulink 仿真到 STM32 实现,谐波降低 15%

SVPWM空间矢量调制技术:从MATLAB仿真到STM32嵌入式实现的工程实践引言:电力电子调制的技术演进在工业电机控制领域,如何高效精确地驱动三相电机一直是核心技术挑战。传统SPWM(正弦脉宽调制)技术虽然简单易实现&#xf…

2026/7/10 9:00:39 阅读更多 →
从自动化到主动智治:迈克生物携手华为推动医学检验智慧化实验室升级

从自动化到主动智治:迈克生物携手华为推动医学检验智慧化实验室升级

2026年7月8日,迈克生物股份有限公司与华为技术有限公司在华为松山湖园区签署深化合作协议。双方将聚焦数智技术与体外诊断产业深度融合,围绕智慧化实验室、集团全球一朵云、智能制造平台建设及鸿蒙IVD设备联合创新等领域展开深度协作,推动医学…

2026/7/10 8:58:38 阅读更多 →
基于AI Agent与MCP协议的渗透测试辅助工具VulnClaw实战指南

基于AI Agent与MCP协议的渗透测试辅助工具VulnClaw实战指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 1. VulnClaw 是什么?它能解决什么实际问题? 如果你正在学习或从事网络安全、渗透测试,或者对 AI A…

2026/7/10 8:56:38 阅读更多 →
STM32F429ZI与CMT-8540S-SMT嵌入式音频开发实战

STM32F429ZI与CMT-8540S-SMT嵌入式音频开发实战

1. 为什么选择STM32F429ZI与CMT-8540S-SMT组合 在嵌入式音频开发领域,硬件选型往往决定了项目的上限。STM32F429ZI这颗基于ARM Cortex-M4内核的微控制器,内置了2个专用音频PLL和全双工IS接口,时钟精度可达0.5%。这意味着它能够直接输出符合IS…

2026/7/10 8:52:36 阅读更多 →
C++17 元编程状态机 fsm-cxx 实战:5分钟构建线程安全事件驱动模型

C++17 元编程状态机 fsm-cxx 实战:5分钟构建线程安全事件驱动模型

C17 元编程状态机 fsm-cxx 实战:5分钟构建线程安全事件驱动模型 在嵌入式系统、游戏开发和网络协议栈中,状态机(Finite State Machine, FSM)是管理复杂逻辑的利器。传统实现常伴随冗长的switch-case语句和脆弱的状态转移表&#x…

2026/7/10 8:48:35 阅读更多 →

日新闻

STM32与LTC1864高精度ADC的SPI通信实现

STM32与LTC1864高精度ADC的SPI通信实现

1. 项目背景与核心需求在工业控制和嵌入式系统开发中,模拟信号与数字系统的无缝集成一直是工程师面临的关键挑战。LTC1864作为一款16位高精度ADC转换器,配合STM32F101ZG这类主流微控制器,能够构建高性能的模拟信号采集系统。这种组合特别适合…

2026/7/10 0:03:07 阅读更多 →
猫抓插件:浏览器资源嗅探与视频下载的终极解决方案

猫抓插件:浏览器资源嗅探与视频下载的终极解决方案

猫抓插件:浏览器资源嗅探与视频下载的终极解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为网页视频无法下载而烦恼吗&am…

2026/7/10 0:05:09 阅读更多 →
直流有刷电机驱动方案:TC78H653FTG与MKV46F256VLH16应用

直流有刷电机驱动方案:TC78H653FTG与MKV46F256VLH16应用

1. 直流有刷电机驱动方案概述在工业自动化和消费电子领域,直流有刷电机因其结构简单、控制方便、成本低廉等优势,仍然是许多应用场景的首选驱动方案。TC78H653FTG作为东芝推出的新一代H桥驱动器,与MKV46F256VLH16微控制器配合使用&#xff0c…

2026/7/10 0:05:09 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/9 21:41:05 阅读更多 →

月新闻