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