五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > Python注冊登錄時驗證碼識別處理方法實例

Python注冊登錄時驗證碼識別處理方法實例

文章來源:365jz.com     點擊數(shù):943    更新時間:2018-01-31 11:27   參與評論

Python驗證碼識別處理方法實例

對于爬蟲來說,一個比較大的阻礙就是驗證碼,驗證碼也是反爬蟲的有效措施之一。接下來針對驗證碼出現(xiàn)的方式,就如何突破驗證碼進行進一步的探討。

10.2.1 IP代理

當你使用同一個IP頻繁訪問網(wǎng)頁時,這時候網(wǎng)站服務器就極有可能將你判定為爬蟲,此時會在網(wǎng)頁中出現(xiàn)驗證碼,輸入正確才能正常訪問,類似淘寶的這種情況,如圖10-20所示。


圖10-20 訪問驗證

這種驗證碼的產(chǎn)生原因是由于同一IP的頻繁訪問,當然你可以加大爬蟲的延時,做到和人訪問速率一樣,不過這樣效率稍微低一些,好的做法是換IP進行訪問。

之前對于urllib2和Requests如何配置代理IP的方法已經(jīng)進行了講解,這里不再進行贅述。大家可能更關心的是如何獲取更多的代理IP,主要有以下幾種方式:

·首先是VPN:國內(nèi)和國外很多廠商提供VPN服務,可以分配不同的網(wǎng)絡線路,并可以自動更換IP,實時性很高,速度很快。穩(wěn)定可靠的VPN的價格一般都不低,適合商用。

·IP代理池:一些廠商將很多IP做成代理池,提供API接口,允許用戶使用程序調(diào)用。穩(wěn)定的IP代理池也是很貴的,不適合個人學習使用。

·ADSL寬帶撥號:大家肯定都用過撥號上網(wǎng)的方式,ADSL有個特點是斷開再重新連接時分配的IP會變化,爬蟲可以利用這個原理更換IP。由于更換IP需要斷開再重連,使用這種方式的效率并不高,適合實時性不高的場景。

VPN和IP代理池都有廠商各自提供的更換IP接口,大家可以根據(jù)自己選擇的廠商進行配置。

ADSL寬帶撥號,可以使用Python實現(xiàn)撥號和斷開,比如Windows提供了一個用于操作撥號的命令rasdial,接下來用Python操作這個命令實現(xiàn)上網(wǎng),代碼如下:

# coding:utf-8 import os
import time
g_adsl_account = {"name": "adsl", "username": "xxxxxxx", "password": "xxxxxxx"} class Adsl(object):
##################################################### # __init__ : name: adsl名稱

##################################################### def __init__(self):
self.name = g_adsl_account["name"]

self.username = g_adsl_account["username"] self.password = g_adsl_account["password"] ##################################################### # set_adsl : 修改adsl設置

##################################################### def set_adsl(self, account):
self.name = account["name"] self.username = account["username"] self.password = account["password"] ##################################################### # connect : 寬帶撥號

##################################################### def connect(self):
cmd_str = "rasdial %s %s %s" % (self.name, self.username, self.
password)
os.system(cmd_str)
time.sleep(5)
#################################################### # disconnect : 斷開寬帶連接

################################################## def disconnect(self):
cmd_str = "rasdial %s /disconnect" % self.name
os.system(cmd_str)
time.sleep(5)
#####################################################

# reconnect : 重新進行撥號

##################################################### def reconnect(self):
self.disconnect()
self.connect()
if __name__=='__main__':
adsl = Adsl()
adsl.connect()

現(xiàn)在有很多提供寬帶撥號的服務商,提供專門的VPS撥號主機,例如無極網(wǎng)絡等,價格不是很貴,也相對比較穩(wěn)定,大家可以嘗試去用一下,IP基本上是秒切換。

最后提供一個適合個人使用的代理方式IPProxyPool,這是本人用Python寫的一個開源項目,放置于GitHub:https://github.com/qiyeboy/IPProxyPool。原理:通過爬取各大IP代理網(wǎng)站的免費IP,將這些IP進行去重、檢測代理有效性等操作,最后存儲到SQLite數(shù)據(jù)庫中,并提供一個API接口,方便大家調(diào)用。以Windows使用進行講解:

1)使用git將代碼clone到本地,或在GitHub上下載IPProxyPool壓縮包解壓即可

2)進入IPProxyPool目錄,在命令行窗口運行Python IPProxys.py

這個時候IPProxyPool就開始工作,爬取免費IP了。每半個小時進行一次IP的爬取和校驗,防止IP失效,效果如圖10-21所示。



圖10-21 IPProxys運行

那我們自己的爬蟲如何獲取IPProxyPool提供的IP呢?非常簡單,IPProxyPool提供了一個HTTP請求接口,假如我們的爬蟲程序和IPProxys在同一臺主機上,可以向127.0.0.1:8000發(fā)送一個GET請求,請求參數(shù)如表10-3所示。

表10-3 GET參數(shù)

假如發(fā)送的GET請求為http://127.0.0.1:8000/
types=0&count=5&county=中國,這個請求的意思是返回5個IP所在地在中國,類型為高匿的IP地址,響應格式為JSON,按照響應速度由高到低,返回數(shù)據(jù),類似[{“ip”:“220.160.22.115”,“port”:80},

{“ip”:“183.129.151.130”,“port”:80},{“ip”:“59.52.243.88”,“port”:80},{“ip”:“112.228.35.24”,“port”:8888},{“ip”:

“106.75.176.4”,“port”:80}],大家在爬蟲程序中只要將響應進行解析即可。示例代碼如下:

import requests
import json
r = requests.get('http://127.0.0.1:8000/types=0&count=5&country=中國')
ip_ports = json.loads(r.text)
print ip_ports
ip = ip_ports[0]['ip'] port = ip_ports[0]['port'] proxies={ 'http':'http://%s:%s'%(ip,port), 'https':'http://%s:%s'%(ip,port)
} r = requests.get('http://ip.chinaz.com/',proxies=proxies)
r.encoding='utf-8'
print r.text

根據(jù)我的統(tǒng)計,一般有用的代理IP在70個左右,完全滿足個人的需要。

10.2.2 Cookie登錄

當我們在登錄的時候遇到了驗證碼,這時候我們需要人工識別之后才能登錄上去,其實這是個非常繁瑣的過程,每次登錄都要我們手動輸入驗證碼,很不可取。但是大部分的網(wǎng)站當你登錄上去之后,

Cookie都會保持較長的一段時間,避免因用戶頻繁輸入賬號和密碼造成的不便。我們可以利用這個特性,當我們登錄成功一次之后,可以將Cookie信息保存到本地,下次登錄時直接使用Cookie登錄。以10.1

節(jié)的知乎登錄為例,我們可以加入兩個函數(shù):save_session和load_session。代碼如下:

def save_session(session):
# 將session寫入文件: session.txt
with open('session.txt', 'wb') as f:
cPickle.dump(session.headers, f)
cPickle.dump(session.cookies.get_dict(), f)
print '[+] 將session寫入文件: session.txt'
def load_session():
# 加載session
with open('session.txt', 'rb') as f:
headers = cPickle.load(f)
cookies = cPickle.load(f)
return headers,cookies

10.2.3 傳統(tǒng)驗證碼識別

當我們識別并手動輸入驗證碼,成功登錄,并保存Cookie信息以便下次使用,這些操作做完之后僅僅可以暫時松一口氣,因為Cooke總有失效的時候,下次還是要重復這個過程,尤其是爬取的網(wǎng)站很多時,將是一個很繁重的工作。如果能使用Python程序自動識別驗證碼,這將是一件省時省力的事情,這就涉及傳統(tǒng)驗證碼的識別。

為什么限定為傳統(tǒng)驗證碼呢?傳統(tǒng)驗證碼即傳統(tǒng)的輸入型驗證碼,可以是數(shù)字、字母和漢字,這類驗證碼不涉及驗證碼含義的分析,僅僅識別驗證碼的內(nèi)容,識別相對簡單,進行驗證碼識別需要使用到tesseract-ocr。下面講解一下Python如何使用tesseract-ocr進行驗證碼識別。

Python識別驗證碼需要安裝tesseract-ocr、pytesseract和Pillow。

Ubuntu:

·tesseract-ocr:sudo apt-get install tesseract-ocr·pytesseract:sudo pip install pytesseract·Pillow:sudo pip install pillow
Windows:

·tesseract-ocr:下載鏈接為http://digi.bib.uni-mannheim.de/
tesseract/,下載后直接安裝,建議使用安裝過程中的默認選項,安裝目錄默認為C:\Program Files(x86)\Tesseract-OCR。


·pytesseract:pip install pytesseract·Pillow:pip install pillow

安裝完成后開始進行識別驗證碼,以這個驗證碼為例,識別代碼如下:

# coding:utf-8 import pytesseract
from PIL import Image
image = Image.open('code.png')
# 設置tesseract的安裝路徑

pytesseract.tesseract_cmd = 'c:\\Program Files (x86)\\Tesseract-OCR\\
tesseract.exe'
code = pytesseract.image_to_string(image)
print code

輸出結(jié)果為:

0376

我們只是簡單介紹了tesseract-ocr的使用,對驗證碼的識別涉及圖像處理方面的知識,提高識別率還要學習訓練樣本,本節(jié)不進行擴展講解,感興趣的話大家可以自行研究。

 


圖10-22 注冊界面

注冊完成后,官方提供了各種編程語言接入方式的示例,其中就有Python的,如圖10-23所示。

大家可以根據(jù)提供的API示例,開發(fā)自己的識別程序。


圖10-23 Python示例

10.2.5 滑動驗證碼

滑動驗證碼是最近比較流行的驗證方式,是一種基于行為的驗證方式,如圖10-24所示。


圖10-24 滑動驗證碼

滑動驗證碼雖然驗證方式比較特別,不過依然有辦法突破,一種通用的辦法是使用selenium來進行處理。主要的技術要點有:

·在瀏覽器上模擬鼠標拖動的操作。

·計算圖片中缺口的偏移量。

·模擬人類拖動鼠標的軌跡。

由于涉及圖像拼接方面的知識,此處不再深入講解。如果遇到這種情況,大家可以采取多賬號登錄后,保存cookie信息,組建cookie池的方法繞過。

 

如對本文有疑問,請?zhí)峤坏浇涣髡搲瑥V大熱心網(wǎng)友會為你解答??! 點擊進入論壇

發(fā)表評論 (943人查看,0條評論)
請自覺遵守互聯(lián)網(wǎng)相關的政策法規(guī),嚴禁發(fā)布色情、暴力、反動的言論。
昵稱:
最新評論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學習

業(yè)務咨詢

· 技術支持
· 服務時間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權所有 鄂ICP備17013400號