:采集景區(qū)接駁車路線與班次目錄,解決路線站點解析與日期動態(tài)切換)
祝?本期內(nèi)容已收錄至專欄《Python爬蟲實戰(zhàn)》,持續(xù)完善知識體系與項目實戰(zhàn),建議先訂閱收藏,后續(xù)查閱更方便~秘?本期爬蟲難度指數(shù):????☆(高級)??福利:一次訂閱后,專欄內(nèi)的所有文章可永久免費看,持續(xù)更新中,保底1000+(篇)硬核實戰(zhàn)內(nèi)容。全文目錄:?? 開篇語0?? 前言(Preface)1?? 摘要(Abstract)2?? 背景與需求(Why)2.1 為什么要采集景區(qū)接駁車數(shù)據(jù)2.2 數(shù)據(jù)可以用于什么場景2.3 本文的目標站點與頁面職責2.4 目標字段清單3?? 合規(guī)與注意事項3.1 robots.txt 是什么3.2 不要進行攻擊式并發(fā)3.3 不采集敏感信息3.4 不繞過登錄和付費限制3.5 User-Agent 應說明身份3.6 本地緩存也是合規(guī)措施4?? 技術(shù)選型與整體流程(What / How)4.1 靜態(tài)、動態(tài)頁面與 API 的區(qū)別靜態(tài) HTML動態(tài)渲染頁面JSON API4.2 為什么選擇 Requests 和 BeautifulSoup4.3 整體流程采集解析清洗存儲5?? 環(huán)境準備與依賴安裝5.1 Python 版本5.2 創(chuàng)建虛擬環(huán)境5.3 安裝依賴5.4 推薦項目結(jié)構(gòu)6?? 數(shù)據(jù)模型設(shè)計6.1 `models.py`6.2 為什么站點要保存順序6.3 為什么班次窗口單獨建模7?? 配置文件7.1 為什么保留兜底站點8?? 核心實現(xiàn):請求層(Fetcher)8.1 完整 `fetcher.py`8.2 headers 的作用User-AgentRefererAcceptAccept-Language8.3 timeout 為什么必須設(shè)置8.4 Session 和 Cookie8.5 重試和指數(shù)退避8.6 respect_retry_after_header8.7 robots 獲取失敗時為何默認拒絕9?? 核心實現(xiàn):解析層(Parser)9.1 不使用固定表格下標9.2 完整 `parser.py`?? 10?? 解析層重點拆解10.1 列表頁如何獲得詳情鏈接10.2 為什么根據(jù)表頭語義映射列10.3 路線—站點結(jié)構(gòu)如何恢復10.4 如何防止站點鏈死循環(huán)10.5 缺失字段如何處理1??1?? 日期班次動態(tài)切換11.1 英文日期區(qū)間解析11.2 月份映射11.3 跨年判斷11.4 為什么不能只比較月份11.5 按目標日期匹配11.6 `No Service` 不能當普通空值11.7 目標年份為何需要參數(shù)1??2?? 數(shù)據(jù)存儲與導出(Storage)12.1 數(shù)據(jù)庫表設(shè)計路線表班次窗口表12.2 字段映射表12.3 完整 `storage.py`12.4 去重策略第一層:業(yè)務(wù)唯一鍵第二層:內(nèi)容哈希URL 唯一為什么不夠1??3?? 命令行入口13.1 為什么使用命令行參數(shù)1??4?? 運行方式與結(jié)果展示14.1 啟動命令14.2 輸出位置14.3 查看 SQLite14.4 示例結(jié)果14.5 CSV 編碼為什么使用 UTF-8-SIG1??5?? 離線測試15.1 測試 HTML15.2 測試代碼15.3 測試覆蓋了什么1??6?? 常見問題與排錯16.1 返回 40316.2 返回 42916.3 是否需要代理16.4 HTML 抓到空殼16.5 Playwright 備用方案16.6 解析結(jié)果為空16.7 選擇器變化16.8 編碼和亂碼16.9 SSL 錯誤16.10 日期匹配不到16.11 頁面寫 `After January 2`1??7?? 進階優(yōu)化17.1 增量更新17.2 斷點續(xù)跑17.3 日志17.4 監(jiān)控指標17.5 結(jié)構(gòu)異常檢測17.6 條件請求17.7 多景區(qū)配置化17.8 線程并發(fā)17.9 asyncio17.10 Scrapy 改造17.11 定時任務(wù)17.12 Airflow1??8?? 增加本地緩存模式1??9?? 數(shù)據(jù)質(zhì)量進一步處理19.1 站點名稱標準化19.2 時間轉(zhuǎn)換為 24 小時制19.3 運營時間不等于發(fā)車間隔19.4 班次狀態(tài)細分19.5 來源追蹤2??0?? 生產(chǎn)環(huán)境建議20.1 保存原始快照20.2 生成頁面哈希20.3 解析失敗時不要覆蓋舊數(shù)據(jù)20.4 使用事務(wù)20.5 數(shù)據(jù)過期標記2??1?? 一份更簡短的單文件版本2??2?? 從本文案例遷移到其他景區(qū)第一步:確認數(shù)據(jù)來源第二步:確定線路模型第三步:識別站點來源第四步:設(shè)計日期規(guī)則第五步:建立驗證樣本2??3?? 常見設(shè)計誤區(qū)誤區(qū)一:一條路線只保存一條運營時間誤區(qū)二:把停運解析成空值誤區(qū)三:只依賴一個 CSS 類名誤區(qū)四:每次調(diào)試都訪問遠程頁面誤區(qū)五:出現(xiàn)錯誤就無限重試誤區(qū)六:為了“完整”而猜測缺失數(shù)據(jù)2??4?? 總結(jié)與延伸閱讀?? 文末? 專欄持續(xù)更新中|建議收藏 + 訂閱? 互動征集? 免責聲明?? 開篇語哈嘍,各位小伙伴們你們好呀~我是【喵手】。運營社區(qū): C站 / 掘金 / 騰訊云 / 阿里云 / 華為云 / 51CTO歡迎大家常來逛逛,一起學習,一起進步~??我長期專注Python 爬蟲工程化實戰(zhàn),主理專欄?? 《Python爬蟲實戰(zhàn)》:從采集策略到