日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【python】——爬虫05 初级反爬笔记

發布時間:2023/12/14 python 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【python】——爬虫05 初级反爬笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這里寫自定義目錄標題

  • 一、反爬
    • 1. 反爬原因
    • 2. 服務器常反爬蟲
    • 3. 一些概念
    • 4. 反爬方向
      • 4.1 基于身份識別進行反爬
        • headers
        • 請求參數
      • 4.2 基于爬蟲行為進行反爬
        • 請求頻率
        • 爬取步驟
      • 4.3 基于數據加密進行反爬
        • 對響應中含有的數據進行特殊化處理
  • 二、驗證碼
    • 1. 圖片驗證碼
    • 2. 圖片識別引擎
    • 3. 打碼平臺
  • 三、js解析
    • 1.定位
    • 2. 加密步驟、py模擬
      • 法一:第三方js加載模塊
        • 人人網登錄抓包
      • 法二:python重現
        • 有道翻譯
          • salt
          • sign
          • lts

一、反爬

1. 反爬原因

  • 爬蟲占PV比例高,費錢(三月爬蟲
  • 資源被批量抓走
  • GREY

2. 服務器常反爬蟲

  • 低級的-不管服務器壓力
  • 失控的小爬蟲
  • 成型的商業對手
  • 抽風搜索引擎

3. 一些概念

  • 爬蟲:獲取數據的任何技術手段 ,批量
  • 反爬蟲:阻止獲取數據的任何技術手段 ,批量
  • 誤傷:錯將普通用戶為爬蟲
  • 攔截
  • 資源:機器 人力

4. 反爬方向

  • 基于身份識別進行反爬
  • 基于爬蟲行為進行反爬
  • 基于數據加密進行反爬

4.1 基于身份識別進行反爬

headers

  • User-Agent
  • referer
  • cookies

請求參數

  • html靜態文件中獲取
  • 發送請求獲取數據
  • js生成
  • 驗證碼

4.2 基于爬蟲行為進行反爬

請求頻率

  • 請求ip單位時間請求數量——購買多個賬號
  • 請求間隔——隨機休眠
  • 請求次數閾值

爬取步驟

  • 通過js實現跳轉反爬——抓包分析
  • 通過蜜罐獲取爬蟲ip——找缺陷
  • 通過假數據反爬
  • 阻塞任務隊列
  • 阻塞網絡IO——多線程

4.3 基于數據加密進行反爬

對響應中含有的數據進行特殊化處理

  • 特殊字體
  • css位移
  • 圖片
  • 編碼格式

二、驗證碼

1. 圖片驗證碼

  • 驗證碼 CAPTCHA
  • 區分人工、工具

2. 圖片識別引擎

  • 安裝tesseract.exe
  • 安裝python模塊pillow

3. 打碼平臺

會使用接口

三、js解析

1.定位

  • 定位 發送請去的包
  • search關鍵字定位
  • 元素綁定的事件監聽函數定位

2. 加密步驟、py模擬

法一:第三方js加載模塊

模塊js2py、pyv8 execjs一個翻譯工具

人人網登錄抓包

包:login 向服務器發送請求 post ,做驗證
查看post中的數據,密碼做過處理
搜索,無果
切換到手機端(login以上的包 都沒顯示了
xhr屬于ajax請求(rkey、clog
如何獲取加密后的密碼——get(rkey的url)就可了
定位加密文件
通過clog的initiator celllog.js
查找rkey
檢查登錄沒觸登錄后,才觸發函數
登錄按鈕綁定了事件——Event Listeners——綁定回調函數
找到加密函數,遇到的函數直接ctrl F定位

# 分析需要的: # t這個對象 # 導入函數 t.password = t.password.split("").reverse().join(""), setMaxDigits(130); var 0 =nes RSAKeyPair(n.e,"",n.n), r = encryptedString(o, t.password); t.password = r , t.rkey = n.rkey

法二:python重現

有道翻譯

蚌埠住了,那天(周二網技)解決不了的反爬要在這里解決了


把這個數據拿出來

i: 堅定選擇你 from: AUTO to: AUTO smartresult: dict client: fanyideskweb salt: 16368251416712 sign: 4ee9d8a60f9a753238307381d8360729 lts: 1636825141671 bv: 2c5a61877bd32cbd1c3db560d35de93d doctype: json version: 2.1 keyfrom: fanyi.web action: FY_BY_REALTlME

其實只要找這三個值由來

salt: 16368251416712 sign: 4ee9d8a60f9a753238307381d8360729 lts: 1636825141671

定位:

  • 找initiate
  • 查找所有文件
salt






sign

lts



改了一段時間的成功,面向對象學的像屎一樣

import requests import hashlib import time import random import jsonclass Youdao(object):def __init__(self, word):self.url = "https://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44","Cookie": "OUTFOX_SEARCH_USER_ID=1431318095@10.169.0.83; JSESSIONID=aaacVY1-8tYZ-bbE6OuMx; JSESSIONID=abcTpnzjEZLepfAy6OuMx; OUTFOX_SEARCH_USER_ID_NCOO=850288843.93545; UM_distinctid=179cabdde7ab32-0a0062b4a9d564-51361244-144000-179cabdde7b4ed; DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|; _ntes_nnid=c8abec4478ea4f7ceb5d9fceb62cbf81,1622604145716; _ga=GA1.2.1317045666.1630461915; SESSION_FROM_COOKIE=unknown; ___rl__test__cookies=1636904424584","Referer": "https://fanyi.youdao.com/"}self.DATA = Noneself.word = worddef generate(self):# ts: r = "" + (new Date).getTime()# salt: =ts + parseInt(10 * Math.random(), 10);# sign: n.md5("fanyideskweb" + e + i + "Y2FYu%TNSbMCxc3t2u^XT") salt是ilts = str(int(time.time() * 1000))salt = lts + str(random.randint(0, 9))aaa = "fanyideskweb" + self.word + salt + "Y2FYu%TNSbMCxc3t2u^XT"md5 = hashlib.md5()md5.update(aaa.encode())sign = md5.hexdigest()self.DATA = {"i": self.word,"from": "AUTO","to": "AUTO","smartresult": "dict","client": "fanyideskweb","salt": salt,"sign": sign,"lts": lts,"bv": "350570558960e08a67e4e9303822810a","doctype": "json","version": "2.1","keyfrom": "fanyi.web","action": "FY_BY_CLICKBUTTION"}def get_data(self):# print(self.DATA)response = requests.post(self.url, headers=self.headers, data=self.DATA)return response.contentdef parse_data(self, data):dict_data = json.loads(data)# try:# print(dict_data)# except:print(dict_data['translateResult'])def run(self):self.generate()# print(self.DATA)data = self.get_data()# print(data)self.parse_data(data)if __name__ == "__main__":youdao = Youdao("平安")youdao.run()

總結

以上是生活随笔為你收集整理的【python】——爬虫05 初级反爬笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。