task1-初始爬蟲
爬蟲用python好,python庫多,功能全
反爬機制和反反爬機制
顧名思義,一個是防范爬蟲的,一個是應對限制爬蟲的方法
好的,我們來更深入地探討反爬機制和反反爬策略的細節,包括具體的技術手段、實現原理和對抗邏輯。這是一個持續演進的“貓鼠游戲”。
一、反爬機制 (Anti-Scraping Mechanisms) - 網站的防御盾牌
網站采用反爬機制的主要目的是:
1. ?保護服務器資源:防止爬蟲過度消耗帶寬、CPU和內存,影響正常用戶訪問。
2. ?保障數據安全與商業利益:?防止敏感數據、價格信息、用戶內容、知識產權等被大規模抓取和濫用。
3. ?維護服務穩定性:防止爬蟲導致的突發流量高峰(DDoS效應)使服務癱瘓。
4. ?遵守法規與隱私:?防止爬取受法律保護(如GDPR, CCPA)或個人隱私的數據。
5. ?控制數據訪問權限:?確保只有授權用戶(如付費用戶)才能訪問特定數據。
6. ?提升垃圾信息門檻:?防止自動化腳本批量注冊、發帖、刷票等。常見且詳細的反爬技術手段:
1. ?基于請求特征的識別與攔截:
? ? * ? User-Agent 檢測與過濾:?檢查HTTP請求頭中的`User-Agent`字段。如果缺失、格式錯誤、包含常見爬蟲庫/框架名稱(如`python-requests`, `scrapy`, `selenium`等)或明顯是偽造的低質量UA,則可能被攔截。**對抗:?使用大量真實瀏覽器UA輪換,精心偽造完整請求頭。
? ? * ? 請求頭完整性檢查:?檢查請求頭是否包含瀏覽器通常會發送的字段,如 `Accept`, `Accept-Language`, `Accept-Encoding`, `Connection`, `Referer` (來源頁), `Cookie` 等。缺失關鍵頭部的請求會被懷疑。對抗:?模擬真實瀏覽器的完整請求頭集合。
? ? * ? IP 地址頻率限制與封禁:
? ? ? ? * ? 速率限制 (Rate Limiting):?限制單個IP在單位時間(秒/分/小時)內對特定API或頁面的請求次數。超出閾值則返回429錯誤或臨時封禁。
? ? ? ? * ? IP 封禁 (IP Banning):?對觸發規則(如高頻請求、訪問敏感路徑、觸發蜜罐)的IP進行長時間或永久封禁。
? ? ? ? * ? IP 信譽庫:?使用第三方IP信譽服務,直接攔截已知數據中心IP(云服務器、代理服務器)或標記為惡意的IP。對抗:?大規模、高質量的代理IP池(住宅代理 > 數據中心代理,輪換頻繁),分布式爬蟲架構。
? ? * ? 請求頻率與模式異常檢測:?分析請求的時間間隔(過于規律或極短)、訪問路徑順序(不符合用戶正常瀏覽邏輯)、頁面停留時間(極短)等行為模式。對抗:?在請求間加入隨機延遲,模擬人類瀏覽路徑和速度。2. ?基于會話與身份驗證的防護:
? ? * ? 強制登錄/注冊:?將目標數據放在需要用戶登錄后才能訪問的頁面。對抗:?模擬登錄流程(處理表單、Cookie/Session保持),購買/獲取賬號池。
? ? * ? Cookie/Token 驗證:
? ? ? ? * ? 首次訪問設置復雜Cookie或Token,后續請求必須攜帶并驗證其有效性。
? ? ? ? * ? 利用Cookie進行會話跟蹤和狀態維持,檢測異常會話。
? ? ? ? * ? 生成防篡改的加密Token(如JWT)或簽名參數,驗證請求合法性。對抗: 仔細分析登錄流程和后續請求,完整維護Cookie和Session,逆向工程Token生成算法(難度高)。
? ? *? ?驗證碼 (CAPTCHA):
? ? ? ? *? ?傳統圖文驗證碼: 扭曲、粘連、背景干擾的文字/數字識別。
? ? ? ? *? ?行為驗證碼:
? ? ? ? ? ? * ? 滑動拼圖:?拖動滑塊拼合圖片。
? ? ? ? ? ? * ? 點選文字:?按順序點擊圖片中的文字。
? ? ? ? ? ? * ? 空間推理:?旋轉圖片至正確方向。
? ? ? ? ? ? * ? 智能驗證:?無感驗證,通過分析鼠標軌跡、點擊位置、設備信息等隱式判斷人機。
? ? ? ? * ? 二次驗證:?在特定操作(如翻頁過多)后觸發驗證碼。對抗:?使用OCR庫(對簡單驗證碼),接入第三方打碼平臺(人工識別),使用自動化瀏覽器+機器學習模型(如基于TensorFlow/PyTorch訓練識別模型),嘗試繞過觸發點(如控制請求頻率避免觸發)。3. ?基于內容呈現與結構的防護:
? ? * ? JavaScript 渲染與動態加載 (AJAX):關鍵數據(如列表、價格、詳情)不在初始HTML中,而是由瀏覽器執行JavaScript后,通過AJAX/WebSocket從后端API獲取并動態插入DOM。簡單的HTTP請求爬蟲只能獲取“空殼”HTML。對抗:?使用無頭瀏覽器(Headless Browsers)如 Selenium, Puppeteer (Node.js), Playwright, Splash (Scrapy)?等模擬完整瀏覽器環境執行JS;或通過網絡請求分析(瀏覽器開發者工具的Network面板)找到直接提供數據的API接口并模擬調用。
? ? * ? CSS 樣式混淆:?使用CSS類名或樣式規則對數據進行視覺偽裝或邏輯混淆。
? ? ? ? * ? 字體映射 (Font Glyph Mapping):?使用自定義字體文件,HTML中的字符編碼(如`&#xXXXX;`)對應字體文件中不同的字形(如數字1可能實際顯示為5)。爬蟲直接提取HTML得到的是亂碼。對抗:分析字體文件(`.woff`, `.ttf`)建立編碼到實際字符的映射關系。
? ? ? ? * ? 類名隨機化/無意義化:?HTML標簽的`class`屬性每次加載隨機生成(如`<div class="j83hx s9k2t">¥100</div>`),無法通過穩定CSS選擇器定位。**對抗:** 通過相對位置、標簽層級、鄰近文本特征或XPath定位;分析JS生成邏輯(如果固定)。
? ? ? ? * ? 偽元素隱藏:?利用CSS的`::before`, `::after`偽元素和`content`屬性插入關鍵數據,這些內容不在HTML源碼里。**對抗:** 使用能渲染CSS的無頭瀏覽器提取完整DOM。
? ? * ? HTML 結構混淆/陷阱:
? ? ? ? * ? 動態變化的DOM結構:?標簽結構、嵌套層級、屬性名每次請求可能微調。
? ? ? ? * ? 蜜罐鏈接 (Honeypot Traps):?在HTML中插入對用戶不可見(`display: none;`, `visibility: hidden;`, 極小尺寸、顏色與背景相同)但對爬蟲可見的鏈接(`<a>`)。爬蟲訪問這些鏈接會被記錄并封禁IP。對抗:?在解析HTML時忽略隱藏元素或特定樣式的元素。
? ? ? ? * ? 虛假/冗余數據:?插入大量無關或錯誤數據干擾爬蟲解析。4. ?基于API接口的防護:
? ? * ? API 訪問令牌 (API Keys/Access Tokens):?要求請求攜帶唯一密鑰,并嚴格限制調用配額。
? ? * ? 參數簽名/加密:?要求請求參數按照特定規則排序并加上密鑰進行哈希(如HMAC-SHA256)生成簽名`sign`,或者對參數進行加密。服務器端驗證簽名/解密正確性。對抗:逆向工程JS代碼中的簽名/加密算法(難度高,常混淆)。
? ? *? ?GraphQL 查詢限制與復雜度分析:?防止惡意構造復雜查詢耗盡資源。
? ? * ? WebSockets 協議:?使用非HTTP協議傳輸數據,增加抓包和分析難度。5. ?其他高級手段:
? ? * ? TLS 指紋/HTTP2 指紋:檢測客戶端(爬蟲庫/瀏覽器)在建立加密連接時的獨特特征。
? ? * ? 瀏覽器指紋 (Browser Fingerprinting):?收集瀏覽器特性(Canvas, WebGL, 字體列表, 插件列表, 屏幕分辨率, 時區, 語言等)生成唯一標識符,追蹤和識別爬蟲。**對抗:** 使用真實瀏覽器環境(無頭瀏覽器),但需注意特征暴露;使用插件修改指紋(可能不穩定)。
? ? * ? 機器學習行為分析:?在服務端部署ML模型,實時分析用戶/爬蟲的點擊流、鼠標移動軌跡、頁面交互模式等,識別自動化行為。**對抗:** 在無頭瀏覽器中模擬更逼真的人類行為(隨機移動、滾動、點擊延遲),難度極大。
? ? * ? 法律聲明與 robots.txt:?`robots.txt` 文件聲明哪些路徑允許/禁止爬取(無強制力,但提供法律依據)。清晰的服務條款禁止爬蟲。對抗:?法律風險考量,遵守`robots.txt`(至少是尊重),避免爬取明確禁止的數據。二、反反爬策略 (Anti-Anti-Scraping Strategies) - 爬蟲的矛
爬蟲開發者的目標是:穩定、高效、低成本地獲取目標數據,同時盡量降低對目標網站的影響和規避法律風險。
詳細的反反爬策略與技術:
1. ?偽裝成人類瀏覽器:
? ? * ? 精心偽造請求頭:?使用真實、多樣化的`User-Agent`,并確保`Accept*`, `Connection`, `Referer`, `Cookie` 等頭部完整且合理。工具:`fake_useragent`庫。
? ? * ? 維持會話狀態:?正確處理登錄后的`Cookies`和`Session`,并在后續請求中攜帶。使用`requests.Session()`或自動化瀏覽器管理會話。
? ? * ? 模擬瀏覽行為:
? ? ? ? * ? 隨機延遲:?在請求間加入隨機時間間隔(如 `time.sleep(random.uniform(1, 5))`)。
? ? ? ? * ? 瀏覽路徑:?模擬用戶點擊鏈接的自然順序,而非直接訪問深層鏈接。
? ? ? ? * ? 頁面停留:?在獲取頁面后“等待”一段時間再解析或發起下一個請求(尤其在無頭瀏覽器中)。
? ? ? ? * ? 鼠標移動與滾動 (無頭瀏覽器):?使用自動化瀏覽器API模擬人類在頁面上的隨機鼠標移動、滾動操作。2. ?分布式架構與IP管理:
? ? * ? 大規模代理IP池:
? ? ? ? * ? 類型選擇:?優先使用住宅代理(IP來自真實家庭寬帶,更難被識別)和移動代理,其次是高質量的數據中心代理。避免免費代理(不穩定、不安全、易被封)。
? ? ? ? * ? 輪換策略:?每個請求/每個會話/達到一定頻率后自動切換IP。
? ? ? ? * ? 代理提供商:?選擇可靠、IP池大、更新快的服務商(如BrightData, Oxylabs, Smartproxy等)。
? ? ? ? * ? 代理協議支持:?HTTP(S), SOCKS4/5。
? ? * ? 分布式爬蟲: 在多臺機器(或云服務器)上部署爬蟲節點,共享任務隊列和結果存儲,分散請求源IP和負載。工具:Scrapy-Redis, Celery。3. ?應對驗證碼:
? ? * ? 降低觸發頻率: 通過控制請求速度、模擬人類行為、維護有效會話,盡量減少觸發驗證碼。
? ? * ? 自動化識別 (簡單驗證碼):?使用 `pytesseract` (OCR) + 圖像預處理(二值化、降噪、去干擾線)。
? ? * ? 第三方打碼平臺:?將驗證碼圖片發送給平臺,由人工打碼員識別后返回結果(如Super鷹、圖鑒)。需付費,有延遲。
? ? * ? 機器學習模型:?針對特定網站的復雜驗證碼(如點選、滑動),收集標注數據訓練CNN等模型進行識別。投入成本高。
? ? * ? 自動化瀏覽器交互 (行為驗證碼):?使用Selenium/Puppeteer/Playwright的API模擬拖動滑塊、點擊等操作。可能需要分析JS軌跡生成算法(難度高)或使用預錄制的軌跡。
? ? * ? 驗證碼服務集成:?使用如2Captcha, Anti-Captcha等服務的API自動處理驗證碼(背后也是人工或AI)。4. ?處理動態內容 (JavaScript/AJAX):
? ? * ? 無頭瀏覽器:
? ? ? ? * ? Selenium:?老牌,支持多語言和瀏覽器(需對應WebDriver),功能強大但相對慢。
? ? ? ? * ? Puppeteer: 官方Chrome/Chromium無頭控制庫(Node.js),速度快,API現代。
? ? ? ? * ? Playwright:?由Puppeteer原團隊開發(支持Node.js, Python, .NET, Java),支持Chromium, WebKit, Firefox,功能最全面。
? ? ? ? * ? Splash:?基于Webkit的無頭瀏覽器,專為Scrapy設計,輕量高效。
? ? ? ? * ? 關鍵:?使用`wait`函數(如`WebDriverWait`, `page.waitForSelector`, `page.waitForFunction`)等待目標元素或數據加載完成再提取。
? ? * ? API 逆向工程:
? ? ? ? * ? 使用瀏覽器開發者工具的Network面板,觀察頁面加載過程中發出的XHR/Fetch請求。
? ? ? ? * ? 分析請求的URL、方法(GET/POST)、請求頭(特別是`Authorization`, `Cookie`, `X-Requested-With`, `Content-Type`)、請求參數(Query String, Form Data, Request Payload - 可能含簽名/加密)。
? ? ? ? * ? 嘗試直接模擬這些API請求獲取結構化數據(通常是JSON)。這通常比渲染整個頁面效率高得多,但需要破解可能的簽名/加密機制。5. ?解析混淆數據:
? ? * ? CSS 字體映射:
? ? ? ? * ? 下載網頁中引用的自定義字體文件(.woff, .ttf)。
? ? ? ? * ? 使用`fonttools`等庫解析字體文件,獲取字符編碼(Unicode codepoint)到字形名稱(Glyph name)或輪廓的映射。
? ? ? ? * ? 對比網頁源碼中的編碼(如``)和字體映射關系,找到對應的實際字符。可能需要動態維護映射,因為字體文件可能更換。
? ? * ? CSS 類名混淆/偽元素:
? ? ? ? * ? 無頭瀏覽器渲染:?直接獲取渲染后的DOM文本(`element.textContent`, `element.innerHTML`),這是最可靠的方式。
? ? ? ? * ? 相對定位/XPath:?如果結構相對穩定,使用基于鄰近元素、父節點或特定文本模式的XPath定位。
? ? ? ? * ? 分析JS:?如果類名由固定JS邏輯生成(非完全隨機),嘗試分析JS代碼確定規則。
? ? * ? 蜜罐識別:?在解析HTML時,檢查元素的CSS樣式屬性(計算樣式`getComputedStyle(element)`),過濾掉`display: none`, `visibility: hidden`, `opacity: 0`, 極小尺寸(`width/height <= 1px`)或位置在視口外的元素。避免點擊或跟隨這些鏈接。6. ?應對高級指紋和行為檢測:
? ? * ? 無頭瀏覽器配置:
? ? ? ? * ? 啟用`--disable-blink-features=AutomationControlled`等標志隱藏自動化特征。
? ? ? ? * ? 覆蓋`navigator.webdriver`屬性為`undefined`或`false`。
? ? ? ? * ? 安裝插件(如Puppeteer Extra Stealth Plugin)修改各種瀏覽器指紋特征(Canvas, WebGL, 字體, 插件列表等)。
? ? ? ? * ? 模擬不同設備配置文件(分辨率、User-Agent、觸摸支持等)。
? ? * ? 更精細的行為模擬:?在無頭瀏覽器中,除了點擊和輸入,加入更隨機的鼠標移動軌跡(使用`bezier-curves`模擬人類移動)、滾動的速度和停頓、表單填寫的思考時間等。這非常復雜且效果不一定好。7. ?健壯性與容錯:
? ? * ? 錯誤處理:?對網絡錯誤(Timeout, ConnectionError)、HTTP錯誤碼(403, 404, 429, 500)、解析失敗、驗證碼出現等情況進行捕獲和相應處理(重試、換IP、休眠、記錄日志、跳過等)。
? ? * ? 重試機制:?對可重試錯誤(如429, 網絡抖動)實施帶退避策略的重試(如指數退避)。
? ? * ? 狀態持久化:?保存爬取進度(URL隊列、已爬URL集合、已解析數據),支持斷點續爬。
? ? * ? 監控與告警: 監控爬蟲運行狀態、成功率、被封情況,及時告警。三、核心對抗邏輯與注意事項
*? ?成本與收益的平衡: 反爬措施越強,反反爬的成本(時間、金錢、技術難度)越高。爬蟲開發者需要評估目標數據的價值是否值得投入。
*? ?持續對抗與更新: 沒有一勞永逸的方案。網站會不斷升級防御,爬蟲腳本也需要持續維護和更新策略。
*? ?尊重 `robots.txt` 與法律合規: 始終檢查目標網站的`robots.txt`文件。即使技術上能繞過反爬,也要考慮服務條款、版權法、數據保護法(GDPR, CCPA, PIPL等)和計算機濫用法。爬取公開數據通常風險較低,但繞過登錄抓取私有數據、大規模爬取導致服務中斷、侵犯版權或隱私可能面臨法律訴訟。
*? ?道德考量: 避免對目標網站造成過大負擔。控制爬取速度,盡量在網站訪問低峰期運行。
*? ?選擇合適工具: 根據目標網站的反爬強度選擇技術棧。簡單網站用`requests`/`BeautifulSoup`;動態網站用`Selenium`/`Playwright`;需要大規模分布式和IP管理用`Scrapy`+代理中間件;破解API優先考慮。總結:
反爬與反反爬是一場高度技術化的動態博弈。理解雙方使用的詳細技術原理是制定有效策略的基礎。成功的爬蟲開發者需要精通網絡協議(HTTP/HTTPS)、瀏覽器工作原理、前端技術(HTML/CSS/JS)、編程、數據分析,并具備逆向工程思維和持續學習能力,同時時刻牢記法律與道德的邊界。
(AI生成,僅供參考)
robots協議——表明可以進行爬蟲的頁面和不能爬蟲的頁面,提供法律聲明
可以使用的庫:
from urllib.request import urlopen;import requests——用法有所不同;最開始,我們是爬取頁面的源代碼
頁面渲染
一、所有數據否直接寫在HTML中,通過頁面源代碼獲得
二、客戶端渲染(前端JS渲染)
客戶端第一次請求后,服務器A返回HTML框架(其中有對應數據的服務器地址);
之后,想查看什么數據,請求后,對應服務器B會返回相關數據,填充到對應框架的位置。
協議
簡單了解,這里只需認識
HTTP協議:Hyper Text Transfer Protocol(超?本傳輸協議),是?于從萬維?(WWW:World Wide Web )服務器傳輸超?本到本地瀏覽器的傳送協議。瀏覽器和服務器之間數據交互遵守的就是HTTP協議。
http
請求:(客戶端發給服務器)
請求? : 請求?式(get/post) 請求url地址 協議
請求頭 : 放?些服務器要使?的附加信息(這些信息中間不能多空一行,每行要連在一起)
請求體 :?般放?些請求參數(請求頭和請求體要用隔開一行)
響應:(服務器對客戶端發來的信息的回應,返回給客戶端)
狀態? : 協議 狀態碼
響應頭 :?放?些客戶端要使?的?些附加信息
響應體 : 服務器返回的真正客戶端要?的內容(HTML,json)等
請求頭中最常?的?些重要內容(爬?需要):
User-Agent
:請求載體的身份標識(?啥發送的請求)Referer
:防盜鏈(這次請求是從哪個??來的?反爬會?到)cookie
:本地字符串數據信息(?戶登錄信息,反爬的token)
響應頭中?些重要的內容:
Content-Type
:返回內容的內容類型,比如Content-Type: text/html; charset=utf-8
- 各種神奇的莫名其妙的字符串(這個需要經驗了,?般都是token字樣,防?各種攻擊和反爬)
寫爬蟲時,要先自己去看要爬的網頁的請求格式(爬蟲要先仿造瀏覽器去請求,get、post的請求格式不同)——上面了解http的知識就是為了這一步;
得到response后,就用相關庫的函數來操作。