Python爬蟲爬驗證碼實現(xiàn)功能詳解
主要實現(xiàn)功能:
- 登陸網(wǎng)頁
- 動態(tài)等待網(wǎng)頁加載
- 驗證碼下載
很早就有一個想法,就是自動按照腳本執(zhí)行一個功能,節(jié)省大量的人力——個人比較懶?;藥滋鞂懥藢懀局胪瓿沈炞C碼的識別,從根本上解決問題,只是難度太高,識別的準(zhǔn)確率又太低,計劃再次告一段落。
希望這次經(jīng)歷可以與大家進行分享和交流。
Python打開瀏覽器
相比與自帶的urllib2模塊,操作比較麻煩,針對于一部分網(wǎng)頁還需要對cookie進行保存,很不方便。于是,我這里使用的是Python2.7下的selenium模塊進行網(wǎng)頁上的操作。
測試網(wǎng)頁:http://graduate.buct.edu.cn
打開網(wǎng)頁:(需下載chromedriver)
為了支持中文字符輸出,我們需要調(diào)用sys模塊,把默認編碼改為 UTF-8
<code class="hljs python">from selenium.webdriver.support.ui import Select, WebDriverWait
from selenium import webdriver
from selenium import common
from PIL import Image
import pytesser
import sys
reload(sys)
sys.setdefaultencoding('utf8')
broswer = webdriver.Chrome()
broswer.maximize_window()
username = 'test'
password = 'test'
url = 'http://graduate.buct.edu.cn'
broswer.get(url)</code>
等待網(wǎng)頁加載完畢
使用的是selenium中的WebDriverWait,上面的代碼中已經(jīng)加載
<code class="hljs livecodeserver">url = 'http://graduate.buct.edu.cn' broswer.get(url) wait = WebDriverWait(webdriver,5) #設(shè)置超時時間5s # 在這里輸入表單填寫并加載的代碼 elm = wait.until(lambda webdriver: broswer.find_element_by_xpath(xpathMenuCheck))</code>
元素定位、字符輸入
接下來我們需要進行登錄操作:這里我使用的是Chrome,右鍵選擇需要進行填寫內(nèi)容的部分,選擇檢查,會自動轉(zhuǎn)跳到 F12下的開發(fā)者模式(全程需要這個功能來找到相關(guān)的資源)。

vczKprbLJnJkcXVvO9Gh1PHT0LnYtcSyv7fWPGJyIC8+DQo8aW1nIGFsdD0="這里寫圖片描述" src="http://chabaoo.cn/uploadfile/Collfiles/20160414/20160414092144893.png" title="\" />
這里我們看到有一個value = “1”,考慮到下拉框的屬性,我們只要想辦法把這個value賦值給UserRole就好了。
這里使用的是通過selenium的Select模塊來進行選擇,定位控件使用 find_element_by_**,能一一對應(yīng),很方便。
<code class="hljs sql">select = Select(broswer.find_element_by_id('UserRole'))
select.select_by_value('2')
name = broswer.find_element_by_id('username')
name.send_keys(username)
pswd = broswer.find_element_by_id('password')
pswd.send_keys(password)
btnlg = broswer.find_element_by_id('btnLogin')
btnlg.click()</code>
這是用腳本自動填充完的效果,之后就會轉(zhuǎn)跳到下一頁。

這里,我需要的是功能是自動對學(xué)術(shù)報告進行報名

對需要已有的報告右鍵即可發(fā)現(xiàn)和這個活動有關(guān)的消息,因現(xiàn)在沒有報告,所以只顯示了標(biāo)題,但對于后面的有效報告識別有相似的地方。

對于元素的定位,我優(yōu)先選擇了 xpath,根據(jù)測試,可以唯一定位一個元素的位置,很好用。
<code class="hljs perl">//*[@id="dgData00"]/tbody/tr/td[2] (前面是xpath)</code>

爬取信息
接下來我們要進行的步驟是爬取現(xiàn)有的有效報告:
<code class="hljs axapta"># 尋找有效報告
flag = 1
count = 2
count_valid = 0
while flag:
try:
category = broswer.find_element_by_xpath('//*[@id="dgData00"]/tbody/tr[' + str(count) + ']/td[1]').text
count += 1
except common.exceptions.NoSuchElementException:
break
# 獲取報告信息
flag = 1
for currentLecture in range(2, count):
# 類別
category = broswer.find_element_by_xpath('//*[@id="dgData00"]/tbody/tr[' + str(currentLecture) + ']/td[1]').text
# 名稱
name = broswer.find_element_by_xpath('//*[@id="dgData00"]/tbody/tr[' + str(currentLecture) + ']/td[2]').text
# 單位
unitsPublish = broswer.find_element_by_xpath('//*[@id="dgData00"]/tbody/tr[' + str(currentLecture) + ']/td[3]').text
# 開始時間
startTime = broswer.find_element_by_xpath('//*[@id="dgData00"]/tbody/tr[' + str(currentLecture) + ']/td[4]').text
# 截止時間
endTime = broswer.find_element_by_xpath('//*[@id="dgData00"]/tbody/tr[' + str(currentLecture) + ']/td[5]').text</code>
爬取驗證碼

對網(wǎng)頁中的驗證碼進行元素審查后,我們發(fā)現(xiàn)了其中的一個一個鏈接,是 IdentifyingCode.apsx,后面我們就對這個頁面進行加載,并批量獲取驗證碼。

爬取的思路是用selenium截取當(dāng)前頁面(僅顯示部分),并保存到本地——需要翻頁并截取特定位置的請研究:
broswer.set_window_position(**)相關(guān)函數(shù);然后人工進行驗證碼的定位,通過PIL模塊進行截取并保存。
最后調(diào)用谷歌在Python下的pytesser進行字符識別,但這個網(wǎng)站的驗證碼有很多的干擾,外加字符旋轉(zhuǎn),僅僅能識別其中的一部分字符。
<code class="hljs livecodeserver"># 獲取驗證碼并驗證(僅僅一幅)
authCodeURL = broswer.find_element_by_xpath('//*[@id="Table2"]/tbody/tr[2]/td/p/img').get_attribute('src') # 獲取驗證碼地址
broswer.get(authCodeURL)
broswer.save_screenshot('text.png')
rangle = (0, 0, 64, 28)
i = Image.open('text.png')
frame4 = i.crop(rangle)
frame4.save('authcode.png')
qq = Image.open('authcode.png')
text = pytesser.image_to_string(qq).strip()</code>
<code class="hljs axapta"># 批量獲取驗證碼
authCodeURL = broswer.find_element_by_xpath('//*[@id="Table2"]/tbody/tr[2]/td/p/img').get_attribute('src') # 獲取驗證碼地址
# 獲取學(xué)習(xí)樣本
for count in range(10):
broswer.get(authCodeURL)
broswer.save_screenshot('text.png')
rangle = (1, 1, 62, 27)
i = Image.open('text.png')
frame4 = i.crop(rangle)
frame4.save('authcode' + str(count) + '.png')
print 'count:' + str(count)
broswer.refresh()
broswer.quit()</code>
爬取下來的驗證碼

一部分驗證碼原圖:

從上面的驗證碼看出,字符是帶旋轉(zhuǎn)的,而且因為旋轉(zhuǎn)造成的重疊對于后續(xù)的識別也有很大的影響。我曾嘗試過使用神經(jīng)網(wǎng)絡(luò)進行訓(xùn)練,但因沒有進行特征向量的提取,準(zhǔn)確率低得離譜。
關(guān)于Python爬蟲爬驗證碼實現(xiàn)功能詳解就給大家介紹到這里,希望對大家有所幫助!
- 用Python爬蟲破解滑動驗證碼的案例解析
- python網(wǎng)絡(luò)爬蟲實現(xiàn)發(fā)送短信驗證碼的方法
- Python爬蟲爬取ts碎片視頻+驗證碼登錄功能
- python爬蟲如何解決圖片驗證碼
- Python爬蟲模擬登陸嗶哩嗶哩(bilibili)并突破點選驗證碼功能
- Python3爬蟲里關(guān)于識別微博宮格驗證碼的知識點詳解
- Python3爬蟲關(guān)于識別點觸點選驗證碼的實例講解
- Python3爬蟲關(guān)于識別檢驗滑動驗證碼的實例
- Python3爬蟲中識別圖形驗證碼的實例講解
- Python3網(wǎng)絡(luò)爬蟲開發(fā)實戰(zhàn)之極驗滑動驗證碼的識別
- python爬蟲解決驗證碼的思路及示例
- Python爬蟲實現(xiàn)驗證碼登錄代碼實例
- python爬蟲之驗證碼篇3-滑動驗證碼識別技術(shù)
- python爬蟲之自動登錄與驗證碼識別
- Python爬蟲模擬登錄帶驗證碼網(wǎng)站
- 爬蟲Python驗證碼識別入門
相關(guān)文章
Python桌面應(yīng)用開發(fā)實戰(zhàn)之PyQt的安裝使用
這篇文章主要給大家介紹了關(guān)于Python桌面應(yīng)用開發(fā)實戰(zhàn)之PyQt的安裝使用,PyQt是一個功能強大的Python庫,用于創(chuàng)建圖形用戶界面(GUI)應(yīng)用程序,需要的朋友可以參考下2023-08-08
python3.6使用pymysql連接Mysql數(shù)據(jù)庫
這篇文章主要為大家詳細介紹了python3.6使用pymysql連接Mysql數(shù)據(jù)庫,以及簡單的增刪改查操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05
基于Matplotlib?調(diào)用?pyplot?模塊中?figure()?函數(shù)處理?figure圖形對象
這篇文章主要介紹了基于Matplotlib?調(diào)用?pyplot?模塊中?figure()?函數(shù)處理?figure圖形對象,matplotlib.pyplot模塊能夠快速地生成圖像,但如果使用面向?qū)ο蟮木幊趟枷?,我們就可以更好地控制和自定義圖像,下面就來詳細介紹其內(nèi)容,需要的朋友可以參考下2022-02-02
python讀取word 中指定位置的表格及表格數(shù)據(jù)
這篇文章主要介紹了python讀取word 中指定位置的表格及表格數(shù)據(jù),本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友參考下吧2019-10-10
使用 NumPy 和 Matplotlib 繪制函數(shù)圖
Matplotlib 是 Python 的繪圖庫。 它可與 NumPy 一起使用,提供了一種有效的 MatLab 開源替代方案。 它也可以和圖形工具包一起使用,如 PyQt 和 wxPython2021-09-09

