最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python爬蟲之驗證碼篇3-滑動驗證碼識別技術

 更新時間:2019年04月11日 11:33:50   作者:夢想橡皮擦  
本篇涉及到的驗證碼為滑動驗證碼,不同于極驗證,本驗證碼難度略低,需要的將滑塊拖動到矩形區(qū)域右側即可完成。對python爬蟲滑動驗證碼識別技術感興趣的朋友跟隨小編一起看看吧

滑動驗證碼介紹

本篇涉及到的驗證碼為滑動驗證碼,不同于極驗證,本驗證碼難度略低,需要的將滑塊拖動到矩形區(qū)域右側即可完成。

這類驗證碼不常見了,官方介紹地址為:https://promotion.aliyun.com/ntms/act/captchaIntroAndDemo.html

使用起來肯定是非常安全的了,不是很好通過機器檢測

如何判斷驗證碼類型

這個驗證碼的標識一般比較明顯,在頁面源碼中一般存在一個 nc.js 基本可以判定是阿里云的驗證碼了

<script type="text/javascript" src="http://g.alicdn.com/sd/ncpc/nc.js?t=1552906749855"></script>

識別套路

截止到2019年3月18日,本驗證碼加入了大量的selenium關鍵字驗證,所以單純的模擬拖拽被反爬的概率滿高的,你也知道一般情況爬蟲具備時效性 不確保這種手段過一段時間還可以使用!

導入selenium必備的一些模塊與方法


from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
# from selenium.webdriver.support import expected_conditions as EC
# from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver import ActionChains
import time
import random

在啟動selenium之前必須要設置一個本機的代理,進行基本的反[反爬] 處理,很多爬蟲在獲取用戶指紋的時候,都比較喜歡selenium,因為使用selenium模擬瀏覽器進行數據抓取,能夠繞過客戶JS加密,繞過爬蟲檢測,繞過簽名機制

但是selenium越來越多的被各種網站進行了相關屏蔽,因為selenium在運行的時候會暴露出一些預定義的Javascript變量(特征字符串),例如"window.navigator.webdriver",在非selenium環(huán)境下其值為undefined,而在selenium環(huán)境下,其值為true


下圖所示為selenium驅動下Chrome控制臺打印出的值


 細致的繞過去的方法,可能需要單獨的一篇博客進行贅述了,這里我只對上面的參數進行屏蔽,使用到的是之前博客中涉及的mitmdump進行代理

https://docs.mitmproxy.org/stable/concepts-certificates/

mitmdump進行代理

技術參考來源:https://zhuanlan.zhihu.com/p/43581988

關于這個模塊的基本使用,參考我前面的博客即可,這里核心使用了如下代碼

indject_js_proxy.py
from mitmproxy import ctx
injected_javascript = '''
// overwrite the `languages` property to use a custom getter
Object.defineProperty(navigator, "languages", {
 get: function() {
  return ["zh-CN","zh","zh-TW","en-US","en"];
 }
});
// Overwrite the `plugins` property to use a custom getter.
Object.defineProperty(navigator, 'plugins', {
 get: () => [1, 2, 3, 4, 5],
});
// Pass the Webdriver test
Object.defineProperty(navigator, 'webdriver', {
 get: () => false,
});
// Pass the Chrome Test.
// We can mock this in as much depth as we need for the test.
window.navigator.chrome = {
 runtime: {},
 // etc.
};
// Pass the Permissions Test.
const originalQuery = window.navigator.permissions.query;
window.navigator.permissions.query = (parameters) => (
 parameters.name === 'notifications' ?
  Promise.resolve({ state: Notification.permission }) :
  originalQuery(parameters)
);
'''
 
def response(flow):
  # Only process 200 responses of HTML content.
  if not flow.response.status_code == 200:
    return
 
  # Inject a script tag containing the JavaScript.
  html = flow.response.text
  html = html.replace('<head>', '<head><script>%s</script>' % injected_javascript)
  flow.response.text = str(html)
  ctx.log.info('>>>> js代碼插入成功 <<<<')
 
  # 只要url鏈接以target開頭,則將網頁內容替換為目前網址
  # target = 'https://target-url.com'
  # if flow.url.startswith(target):
  #   flow.response.text = flow.url

上述腳本放置任意目錄,之后進行mitmdump的啟動即可

C:\user>mitmdump -s indject_js_proxy.py  
Loading script indject_js_proxy.py
Proxy server listening at http://*:8080

啟動之后,通過webdriver訪問

測試網站:https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html

如果webDriver是綠色,也說明代理起作用了

selenium爬取

接下來就是通過selenium進行一些模擬行為的操作了,這部分代碼比較簡單,編寫的時候參考一下注釋即可。

# 實例化一個啟動參數對象
chrome_options = Options()
# 添加啟動參數
chrome_options.add_argument('--proxy-server=127.0.0.1:8080')
# 將參數對象傳入Chrome,則啟動了一個設置了窗口大小的Chrome
driver = webdriver.Chrome(chrome_options=chrome_options)

關鍵函數

def move_to_gap(tracks):
  driver.get("https://passport.zcool.com.cn/regPhone.do?appId=1006&cback=https://my.zcool.com.cn/focus/activity")
  # 找到滑塊span
  need_move_span = driver.find_element_by_xpath('//*[@id="nc_1_n1t"]/span')
  # 模擬按住鼠標左鍵
  ActionChains(driver).click_and_hold(need_move_span).perform()
  for x in tracks: # 模擬人的拖動軌跡
    print(x)
    ActionChains(driver).move_by_offset(xoffset=x,yoffset=random.randint(1,3)).perform()
  time.sleep(1)
  ActionChains(driver).release().perform() # 釋放左鍵

注意看到上述代碼中有何核心的點 --- 拖拽距離的 列表tracks

if __name__ == '__main__':
  move_to_gap(get_track(295))

這個地方可以借鑒網上的方案即可

def get_track(distance):
  '''
  拿到移動軌跡,模仿人的滑動行為,先勻加速后勻減速
  勻變速運動基本公式:
  ①v=v0+at
  ②s=v0t+(1/2)at²
  ③v²-v0²=2as

  :param distance: 需要移動的距離
  :return: 存放每0.2秒移動的距離
  '''
  # 初速度
  v=0
  # 單位時間為0.2s來統(tǒng)計軌跡,軌跡即0.2內的位移
  t=0.1
  # 位移/軌跡列表,列表內的一個元素代表0.2s的位移
  tracks=[]
  # 當前的位移
  current=0
  # 到達mid值開始減速
  mid=distance * 4/5

  distance += 10 # 先滑過一點,最后再反著滑動回來

  while current < distance:
    if current < mid:
      # 加速度越小,單位時間的位移越小,模擬的軌跡就越多越詳細
      a = 2 # 加速運動
    else:
      a = -3 # 減速運動

    # 初速度
    v0 = v
    # 0.2秒時間內的位移
    s = v0*t+0.5*a*(t**2)
    # 當前的位置
    current += s
    # 添加到軌跡列表
    tracks.append(round(s))

    # 速度已經達到v,該速度作為下次的初速度
    v= v0+a*t

  # 反著滑動到大概準確位置
  for i in range(3):
    tracks.append(-2)
  for i in range(4):
    tracks.append(-1)
  return tracks

代碼注釋已經添加好,可以自行查閱,臨摹一下即可明白

最后開始進行嘗試,實測中,發(fā)現可以自動拖動,但是,出現一個問題是最后被識別為機器,這個地方,我進行了多次的修改與調整,最終從代碼層面發(fā)現實現確實有些復雜,所以改變策略,找一下chromedriver.exe是否有修改過的版本,中間去除了selenium的一些關鍵字,運氣不錯,被我找到了。

目前只有windows10版本和linux16.04版本
gitee地址:https://gitee.com/bobozhangyx/java-crawler/tree/master/file/%E7%BC%96%E8%AF%91%E5%90%8E%E7%9A%84chromedriver

下載之后,替換你的 chromedriver.exe


再次運行,成功驗證


總結

以上所述是小編給大家介紹的python爬蟲之驗證碼篇3-滑動驗證碼識別技術,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

相關文章

  • Python繪圖并標記出指定點(最大值點)方法實例

    Python繪圖并標記出指定點(最大值點)方法實例

    我們在用python畫散點圖的時候經常會需要標記出特定的點,這篇文章主要給大家介紹了關于Python繪圖并標記出指定點(最大值點)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • 一步步教你用python給女朋友寫個微信自動提醒的程序

    一步步教你用python給女朋友寫個微信自動提醒的程序

    如今微信已成為我們日常生活的主要交流工具,但是微信自身的功能有時候可能并不能滿足我們的需要,因此我們會想是否可以進行微信功能的拓展呢,這篇文章主要給大家介紹了關于利用python給女朋友寫了個微信自動提醒程序的相關資料,需要的朋友可以參考下
    2021-10-10
  • ROS1?rosbag的詳細使用并且使用python合并bag包的方法

    ROS1?rosbag的詳細使用并且使用python合并bag包的方法

    這篇文章主要介紹了ROS1?rosbag的詳細使用,并且使用python來合并bag包,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • python中關于property的最詳細使用方法

    python中關于property的最詳細使用方法

    這篇文章主要介紹了python中關于property的最詳細使用方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Python利用命名空間解析XML文檔

    Python利用命名空間解析XML文檔

    這篇文章主要介紹了Python利用命名空間解析XML文檔,幫助大家更好的理解和學習Python,感興趣的朋友可以了解下
    2020-08-08
  • python文件讀取read及readlines兩種方法使用詳解

    python文件讀取read及readlines兩種方法使用詳解

    這篇文章主要為大家介紹了python文件讀取read及readlines兩種方法的使用示例及區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • python常見模塊與用法

    python常見模塊與用法

    這篇文章主要介紹了python常見模塊與用法,文中有非常詳細的代碼示例,對正在學習python的小伙伴們有一定的幫助,需要的朋友可以參考下
    2021-04-04
  • Python接口測試之如何使用requests發(fā)起請求

    Python接口測試之如何使用requests發(fā)起請求

    這篇文章主要介紹了Python接口測試之如何使用requests發(fā)起請求問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Python命令行定時任務自動化工作流程

    Python命令行定時任務自動化工作流程

    本文介紹如何使用Python編寫定時任務,以自動執(zhí)行命令行任務。您將學習如何安排定期的任務,處理任務結果,以及如何使用Python自動化工作流程,從而提高工作效率。無需手動執(zhí)行重復任務,Python幫您搞定
    2023-04-04
  • Python處理警告范例代碼示例及解釋

    Python處理警告范例代碼示例及解釋

    在Python中,可通過warnings庫觸發(fā)并處理警告,警告用于提示用戶代碼中的潛在問題而非異常,本文介紹如何使用warnings庫導入、定義警告觸發(fā)函數,并通過handle_warnings函數捕獲和處理不同類型的警告,需要的朋友可以參考下
    2024-10-10

最新評論

新丰县| 盈江县| 邢台县| 巴青县| 宁都县| 金平| 霍邱县| 滦南县| 三亚市| 汪清县| 贵定县| 凤城市| 尼木县| 新和县| 勃利县| 南召县| 临洮县| 涟水县| 汉寿县| 东源县| 盐山县| 乐平市| 汤阴县| 甘洛县| 凤翔县| 新源县| 金秀| 屯门区| 报价| 巴林右旗| 江陵县| 金沙县| 祁阳县| 堆龙德庆县| 长治市| 绥化市| 张家界市| 兴化市| 营山县| 舒城县| 花垣县|