欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python爬蟲爬驗(yàn)證碼實(shí)現(xiàn)功能詳解

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

主要實(shí)現(xiàn)功能:

- 登陸網(wǎng)頁(yè)

- 動(dòng)態(tài)等待網(wǎng)頁(yè)加載

- 驗(yàn)證碼下載

很早就有一個(gè)想法,就是自動(dòng)按照腳本執(zhí)行一個(gè)功能,節(jié)省大量的人力——個(gè)人比較懶?;藥滋鞂懥藢?,本著想完成驗(yàn)證碼的識(shí)別,從根本上解決問(wèn)題,只是難度太高,識(shí)別的準(zhǔn)確率又太低,計(jì)劃再次告一段落。
希望這次經(jīng)歷可以與大家進(jìn)行分享和交流。

Python打開(kāi)瀏覽器

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

測(cè)試網(wǎng)頁(yè)http://graduate.buct.edu.cn

打開(kāi)網(wǎng)頁(yè):(需下載chromedriver)

為了支持中文字符輸出,我們需要調(diào)用sys模塊,把默認(rèn)編碼改為 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)頁(yè)加載完畢

使用的是selenium中的WebDriverWait,上面的代碼中已經(jīng)加載

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

元素定位、字符輸入

接下來(lái)我們需要進(jìn)行登錄操作:這里我使用的是Chrome,右鍵選擇需要進(jìn)行填寫內(nèi)容的部分,選擇檢查,會(huì)自動(dòng)轉(zhuǎn)跳到 F12下的開(kāi)發(fā)者模式(全程需要這個(gè)功能來(lái)找到相關(guān)的資源)。

vczKprbLJnJkcXVvO9Gh1PHT0LnYtcSyv7fWPGJyIC8+DQo8aW1nIGFsdD0="這里寫圖片描述" src="http://www.dbjr.com.cn/uploadfile/Collfiles/20160414/20160414092144893.png" title="\" />

這里我們看到有一個(gè)value = “1”,考慮到下拉框的屬性,我們只要想辦法把這個(gè)value賦值給UserRole就好了。
這里使用的是通過(guò)selenium的Select模塊來(lái)進(jìn)行選擇,定位控件使用 find_element_by_**,能一一對(duì)應(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>

這是用腳本自動(dòng)填充完的效果,之后就會(huì)轉(zhuǎn)跳到下一頁(yè)。


這里,我需要的是功能是自動(dòng)對(duì)學(xué)術(shù)報(bào)告進(jìn)行報(bào)名


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


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

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

爬取信息

接下來(lái)我們要進(jìn)行的步驟是爬取現(xiàn)有的有效報(bào)告:

<code class="hljs axapta"># 尋找有效報(bào)告
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
# 獲取報(bào)告信息
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
  # 開(kāi)始時(shí)間
  startTime = broswer.find_element_by_xpath('//*[@id="dgData00"]/tbody/tr[' + str(currentLecture) + ']/td[4]').text
  # 截止時(shí)間
  endTime = broswer.find_element_by_xpath('//*[@id="dgData00"]/tbody/tr[' + str(currentLecture) + ']/td[5]').text</code>

爬取驗(yàn)證碼

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

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

broswer.set_window_position(**)相關(guān)函數(shù);然后人工進(jìn)行驗(yàn)證碼的定位,通過(guò)PIL模塊進(jìn)行截取并保存。

最后調(diào)用谷歌在Python下的pytesser進(jìn)行字符識(shí)別,但這個(gè)網(wǎng)站的驗(yàn)證碼有很多的干擾,外加字符旋轉(zhuǎn),僅僅能識(shí)別其中的一部分字符。

<code class="hljs livecodeserver"># 獲取驗(yàn)證碼并驗(yàn)證(僅僅一幅)
authCodeURL = broswer.find_element_by_xpath('//*[@id="Table2"]/tbody/tr[2]/td/p/img').get_attribute('src') # 獲取驗(yàn)證碼地址
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"># 批量獲取驗(yàn)證碼
authCodeURL = broswer.find_element_by_xpath('//*[@id="Table2"]/tbody/tr[2]/td/p/img').get_attribute('src') # 獲取驗(yàn)證碼地址
# 獲取學(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>

爬取下來(lái)的驗(yàn)證碼

一部分驗(yàn)證碼原圖:

從上面的驗(yàn)證碼看出,字符是帶旋轉(zhuǎn)的,而且因?yàn)樾D(zhuǎn)造成的重疊對(duì)于后續(xù)的識(shí)別也有很大的影響。我曾嘗試過(guò)使用神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,但因沒(méi)有進(jìn)行特征向量的提取,準(zhǔn)確率低得離譜。

關(guān)于Python爬蟲爬驗(yàn)證碼實(shí)現(xiàn)功能詳解就給大家介紹到這里,希望對(duì)大家有所幫助!

相關(guān)文章

  • Opencv圖像處理:如何判斷圖片里某個(gè)顏色值占的比例

    Opencv圖像處理:如何判斷圖片里某個(gè)顏色值占的比例

    這篇文章主要介紹了Opencv圖像處理:如何判斷圖片里某個(gè)顏色值占的比例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • 五種Python轉(zhuǎn)義表示法

    五種Python轉(zhuǎn)義表示法

    這篇文章主要介紹了五種Python轉(zhuǎn)義表示法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Python桌面應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)之PyQt的安裝使用

    Python桌面應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)之PyQt的安裝使用

    這篇文章主要給大家介紹了關(guān)于Python桌面應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)之PyQt的安裝使用,PyQt是一個(gè)功能強(qiáng)大的Python庫(kù),用于創(chuàng)建圖形用戶界面(GUI)應(yīng)用程序,需要的朋友可以參考下
    2023-08-08
  • python3.6使用pymysql連接Mysql數(shù)據(jù)庫(kù)

    python3.6使用pymysql連接Mysql數(shù)據(jù)庫(kù)

    這篇文章主要為大家詳細(xì)介紹了python3.6使用pymysql連接Mysql數(shù)據(jù)庫(kù),以及簡(jiǎn)單的增刪改查操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • python+pyqt實(shí)現(xiàn)右下角彈出框

    python+pyqt實(shí)現(xiàn)右下角彈出框

    這篇文章主要為大家詳細(xì)介紹了python+pyqt實(shí)現(xiàn)右下角彈出框,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 基于Matplotlib?調(diào)用?pyplot?模塊中?figure()?函數(shù)處理?figure圖形對(duì)象

    基于Matplotlib?調(diào)用?pyplot?模塊中?figure()?函數(shù)處理?figure圖形對(duì)象

    這篇文章主要介紹了基于Matplotlib?調(diào)用?pyplot?模塊中?figure()?函數(shù)處理?figure圖形對(duì)象,matplotlib.pyplot模塊能夠快速地生成圖像,但如果使用面向?qū)ο蟮木幊趟枷耄覀兙涂梢愿玫乜刂坪妥远x圖像,下面就來(lái)詳細(xì)介紹其內(nèi)容,需要的朋友可以參考下
    2022-02-02
  • python中bs4.BeautifulSoup的基本用法

    python中bs4.BeautifulSoup的基本用法

    這篇文章主要介紹了python中bs4.BeautifulSoup的基本用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 超詳細(xì)注釋之OpenCV旋轉(zhuǎn)圖像任意角度

    超詳細(xì)注釋之OpenCV旋轉(zhuǎn)圖像任意角度

    這篇文章主要介紹了OpenCV旋轉(zhuǎn)圖像任意角度,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • python讀取word 中指定位置的表格及表格數(shù)據(jù)

    python讀取word 中指定位置的表格及表格數(shù)據(jù)

    這篇文章主要介紹了python讀取word 中指定位置的表格及表格數(shù)據(jù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2019-10-10
  • 使用 NumPy 和 Matplotlib 繪制函數(shù)圖

    使用 NumPy 和 Matplotlib 繪制函數(shù)圖

    Matplotlib 是 Python 的繪圖庫(kù)。 它可與 NumPy 一起使用,提供了一種有效的 MatLab 開(kāi)源替代方案。 它也可以和圖形工具包一起使用,如 PyQt 和 wxPython
    2021-09-09

最新評(píng)論