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

Python爬蟲爬驗證碼實現功能詳解

 更新時間:2016年04月14日 11:52:45   作者:Buf_Discoverer  
這篇文章主要介紹了Python爬蟲爬驗證碼實現功能詳解的相關資料,需要的朋友可以參考下

主要實現功能:

- 登陸網頁

- 動態(tài)等待網頁加載

- 驗證碼下載

很早就有一個想法,就是自動按照腳本執(zhí)行一個功能,節(jié)省大量的人力——個人比較懶?;藥滋鞂懥藢懀局胪瓿沈炞C碼的識別,從根本上解決問題,只是難度太高,識別的準確率又太低,計劃再次告一段落。
希望這次經歷可以與大家進行分享和交流。

Python打開瀏覽器

相比與自帶的urllib2模塊,操作比較麻煩,針對于一部分網頁還需要對cookie進行保存,很不方便。于是,我這里使用的是Python2.7下的selenium模塊進行網頁上的操作。

測試網頁http://graduate.buct.edu.cn

打開網頁:(需下載chromedriver)

為了支持中文字符輸出,我們需要調用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>

等待網頁加載完畢

使用的是selenium中的WebDriverWait,上面的代碼中已經加載

<code class="hljs livecodeserver">url = 'http://graduate.buct.edu.cn'
broswer.get(url)
wait = WebDriverWait(webdriver,5) #設置超時時間5s
# 在這里輸入表單填寫并加載的代碼
elm = wait.until(lambda webdriver: broswer.find_element_by_xpath(xpathMenuCheck))</code>

元素定位、字符輸入

接下來我們需要進行登錄操作:這里我使用的是Chrome,右鍵選擇需要進行填寫內容的部分,選擇檢查,會自動轉跳到 F12下的開發(fā)者模式(全程需要這個功能來找到相關的資源)。

vczKprbLJnJkcXVvO9Gh1PHT0LnYtcSyv7fWPGJyIC8+DQo8aW1nIGFsdD0="這里寫圖片描述" src="http://m.fzitv.net/uploadfile/Collfiles/20160414/20160414092144893.png" title="\" />

這里我們看到有一個value = “1”,考慮到下拉框的屬性,我們只要想辦法把這個value賦值給UserRole就好了。
這里使用的是通過selenium的Select模塊來進行選擇,定位控件使用 find_element_by_**,能一一對應,很方便。

<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>

這是用腳本自動填充完的效果,之后就會轉跳到下一頁。


這里,我需要的是功能是自動對學術報告進行報名


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


對于元素的定位,我優(yōu)先選擇了 xpath,根據測試,可以唯一定位一個元素的位置,很好用。

<code class="hljs perl">//*[@id="dgData00"]/tbody/tr/td[2] (前面是xpath)</code>

爬取信息

接下來我們要進行的步驟是爬取現有的有效報告:

<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>

爬取驗證碼

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

爬取的思路是用selenium截取當前頁面(僅顯示部分),并保存到本地——需要翻頁并截取特定位置的請研究:

broswer.set_window_position(**)相關函數;然后人工進行驗證碼的定位,通過PIL模塊進行截取并保存。

最后調用谷歌在Python下的pytesser進行字符識別,但這個網站的驗證碼有很多的干擾,外加字符旋轉,僅僅能識別其中的一部分字符。

<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') # 獲取驗證碼地址
# 獲取學習樣本
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>

爬取下來的驗證碼

一部分驗證碼原圖:

從上面的驗證碼看出,字符是帶旋轉的,而且因為旋轉造成的重疊對于后續(xù)的識別也有很大的影響。我曾嘗試過使用神經網絡進行訓練,但因沒有進行特征向量的提取,準確率低得離譜。

關于Python爬蟲爬驗證碼實現功能詳解就給大家介紹到這里,希望對大家有所幫助!

相關文章

  • 從零開始安裝Conda并搭建Python環(huán)境的全過程

    從零開始安裝Conda并搭建Python環(huán)境的全過程

    conda是一個開源的包、環(huán)境管理器,可以用于在同一個機器上創(chuàng)建不同的虛擬環(huán)境,這篇文章主要介紹了安裝Conda并搭建Python環(huán)境的相關資料,需要的朋友可以參考下
    2025-04-04
  • Flask藍圖學習教程

    Flask藍圖學習教程

    在Flask中,使用藍圖Blueprint來分模塊組織管理。藍圖實際可以理解為是一個存儲一組視圖方法的容器對象,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-10-10
  • Python實現自動發(fā)送測試報告郵件的示例代碼

    Python實現自動發(fā)送測試報告郵件的示例代碼

    SMTP也就是簡單郵件傳輸協(xié)議,是一種提供可靠且有效電子郵件傳輸的協(xié)議,python的smtplib模塊就提供了一種很方便的途徑發(fā)送電子郵件,它對smtp協(xié)議進行了簡單的封裝,下面就來和大家簡單聊聊吧
    2023-07-07
  • Python中用post、get方式提交數據的方法示例

    Python中用post、get方式提交數據的方法示例

    最近在學習使用Python,發(fā)現網上很少提到如何使用post,所以下面這篇文章主要給大家介紹了關于Python中用post、get方式提交數據的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-09-09
  • Python雙向循環(huán)鏈表實現方法分析

    Python雙向循環(huán)鏈表實現方法分析

    這篇文章主要介紹了Python雙向循環(huán)鏈表,結合實例形式分析了Python雙向鏈表的定義、遍歷、添加、刪除、搜索等相關操作技巧,需要的朋友可以參考下
    2018-07-07
  • tensorflow2 自定義損失函數使用的隱藏坑

    tensorflow2 自定義損失函數使用的隱藏坑

    本文主要介紹了tensorflow2 自定義損失函數使用的隱藏坑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-07-07
  • Python中@符號的具體使用

    Python中@符號的具體使用

    本文主要介紹了Python中@符號的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • Python解決八皇后問題示例

    Python解決八皇后問題示例

    這篇文章主要介紹了Python解決八皇后問題,簡單描述了八皇后問題的原理并結合實例形式分析了Python基于遞歸算法解決八皇后問題的相關操作技巧,需要的朋友可以參考下
    2018-04-04
  • Python對象類型及其運算方法(詳解)

    Python對象類型及其運算方法(詳解)

    下面小編就為大家?guī)硪黄狿ython對象類型及其運算方法(詳解)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • python pygame實現球球大作戰(zhàn)

    python pygame實現球球大作戰(zhàn)

    這篇文章主要為大家詳細介紹了Python pygame實現球球大作戰(zhàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11

最新評論

永昌县| 罗甸县| 渝北区| 全南县| 丹东市| 四川省| 泽普县| 理塘县| 台北市| 扶风县| 万载县| 甘德县| 黑河市| 大邑县| 肃南| 扬中市| 曲靖市| 房山区| 缙云县| 万宁市| 施甸县| 怀柔区| 连云港市| 思茅市| 房产| 诏安县| 鹿邑县| 武夷山市| 台江县| 高清| 新巴尔虎左旗| 广安市| 咸宁市| 杭州市| 南投市| 阳原县| 大理市| 班戈县| 武威市| 安宁市| 乐安县|