1. 程式人生 > 實用技巧 >selenium補充及破解驗證碼的方法及高階案例

selenium補充及破解驗證碼的方法及高階案例

今日內容概要

  • selenium其他方法補充
  • requests-html模組
  • 破解驗證碼的方法
  • 研究高階爬蟲破解知乎登入

今日內容詳細

selenium其他方法補充

滑動驗證碼

"""滑動驗證碼其實用程式碼破解還不如自己手動劃一下,我們單純的瞭解一下程式碼破解的方式"""
#動作鏈(滑動驗證碼沒有程式碼破解的必要 不如手動滑獲取cookie即可)
from selenium import webdriver
from selenium.webdriver import ActionChains
import time
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser)
# actions.drag_and_drop(source, target)
actions.click_and_hold(source)
time.sleep(3)
for i in range(5):
    actions.move_by_offset(xoffset=17,yoffset=0).perform()
    time.sleep(0.5)

actions.release()

"""
為什麼不直接一步到位 而需要設定間歇停頓?
	滑動驗證碼內部有檢測機制,如果你速度太快並且很準
	那麼後臺會認為你是一個程式從而讓你校驗不通過
"""

獲取cookie

url = 'https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F'
driver = webdriver.Chrome()
driver.get(url=url)
time.sleep(50)
driver.refresh()
c = driver.get_cookies()
print(c)
# 得到了登入之後網站給出的cookies
with open('xxx.txt','w') as f:
  json.dump(c,f)

"""
cookie池
	獲取同一個網站很多授權之後的cookie存放於某處
	之後再訪問該網站的時候都是從中隨機獲取一個訪問
"""


破解登入的思路其實很明確 就是想法設法的拿到登入之後對方給你的cookie資訊即可

驗證碼的破解

三種方式
	方式1(最繁瑣)
  	程式碼破解
    	軟體:Tesseract-ocr 
    	模組:pytesseract
  方式2
  	打碼平臺
    	eg:http://www.yundama.com
  方式3
  	人工打碼

requests-html模組

使用此庫時,您將自動獲得:
    全面的JavaScript支援!
    CSS選擇器(又名jQuery風格,多虧了PyQuery)。
    XPath Selectors,使您感到內fa。
    模擬的使用者代理(如真實的Web瀏覽器)。
    自動跟隨重定向。
    連線池和cookie永續性。
    您知道和喜歡的請求體驗具有神奇的解析能力。
  
http://requests-html.kennethreitz.org/
https://github.com/psf/requests-html
    
    
# 支援非同步
from requests_html import AsyncHTMLSession
asession = AsyncHTMLSession()
async def get_pythonorg():
    r = await asession.get('https://www.baidu.com/')
    return r
async def get_reddit():
   r = await asession.get('https://www.jd.com/')
   return r
async def get_google():
   r = await asession.get('https://www.sogo.com/')
   return r
results = asession.run(get_pythonorg, get_reddit, get_google)
# results # check the requests all returned a 200 (success) code
# [<Response [200]>, <Response [200]>, <Response [200]>]
# Each item in the results list is a response object and can be interacted with as such
for result in results:
     print(result.html.url)
        
# 支援js呼叫
r = session.get('http://python-requests.org/')
r.html.render()
r.html.search('Python 2 will retire in only {months} months!')['months']
'<time>25</time>'

同步非同步

同步
	提交完請求之後原地等待任務的返回結果,什麼時候有結果什麼時候繼續下一步操作

非同步
	提交完請求之後不願地等待任務的返回結果直接執行下一個動作,任務後期會通過非同步回撥機制獲取
    
"""
非同步效率肯定比同步高
"""

知乎登入

"""
知乎的特點如果沒有登入那麼該網站任何資源你都別想看
"""

補充

window.open('https://www.sogo.com','','height=400px,width=400px')

window.close()  # 關閉當前頁