首頁  >  文章  >  後端開發  >  Python爬蟲爬驗證碼實作功能詳細介紹

Python爬蟲爬驗證碼實作功能詳細介紹

高洛峰
高洛峰原創
2017-03-06 13:59:092348瀏覽

這篇文章主要介紹了Python爬蟲爬驗證碼實現功能詳解的相關資料,需要的朋友可以參考下

主要實作功能:

- 登陸網頁

- 動態等待網頁載入

- 驗證碼下載

很早就有一個想法,就是自動按照腳本執行一個功能,節省大量的人力──個人比較懶。花了幾天寫了寫,本著想完成驗證碼的識別,從根本上解決問題,只是難度太高,識別的準確率又太低,計劃再次告一段落。
希望這次經驗可以與大家分享與交流。

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(&#39;utf8&#39;)
broswer = webdriver.Chrome()
broswer.maximize_window()
username = &#39;test&#39;
password = &#39;test&#39;
url = &#39;http://graduate.buct.edu.cn&#39;
broswer.get(url)</code>


等待網頁載入完成

#使用的是selenium中的WebDriverWait,上面的程式碼中已經載入


#
<code class="hljs livecodeserver">url = &#39;http://graduate.buct.edu.cn&#39;
broswer.get(url)
wait = WebDriverWait(webdriver,5) #设置超时时间5s
# 在这里输入表单填写并加载的代码
elm = wait.until(lambda webdriver: broswer.find_element_by_xpath(xpathMenuCheck))</code>
# 在这里输入表单填写并加载的代码
elm = wait.until(lambda webdriver: broswer.find_element_by_xpath(xpathMenuCheck))</code>


元素定位、字元輸入

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

Python爬蟲爬驗證碼實作功能詳細介紹

vczKprbLJnJkcXVvO9Gh1PHT0LnYtcSyv7fWPGJyIC8+DQo8aW1nIGFsdD0="這裡寫圖說明" .png " title="\" />

這裡我們看到有一個value = “1”,考慮到下拉框的屬性,我們只要想辦法把這個value賦值給UserRole就好了。

這裡使用的是透過selenium的Select模組來進行選擇,定位控制項使用 find_element_by_**,能一一對應,很方便。

<code class="hljs sql">select = Select(broswer.find_element_by_id(&#39;UserRole&#39;))
select.select_by_value(&#39;2&#39;)
name = broswer.find_element_by_id(&#39;username&#39;)
name.send_keys(username)
pswd = broswer.find_element_by_id(&#39;password&#39;)
pswd.send_keys(password)
btnlg = broswer.find_element_by_id(&#39;btnLogin&#39;)
btnlg.click()</code>


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

Python爬蟲爬驗證碼實作功能詳細介紹

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

Python爬蟲爬驗證碼實作功能詳細介紹

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

Python爬蟲爬驗證碼實作功能詳細介紹

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


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


Python爬蟲爬驗證碼實作功能詳細介紹

#爬取資訊


########### #####接下來我們要進行的步驟是爬取現有的有效報表:###
<code class="hljs axapta"># 寻找有效报告
flag = 1
count = 2
count_valid = 0
while flag:
  try:
    category = broswer.find_element_by_xpath(&#39;//*[@id="dgData00"]/tbody/tr[&#39; + str(count) + &#39;]/td[1]&#39;).text
    count += 1
  except common.exceptions.NoSuchElementException:
    break
# 获取报告信息
flag = 1
for currentLecture in range(2, count):
  # 类别
  category = broswer.find_element_by_xpath(&#39;//*[@id="dgData00"]/tbody/tr[&#39; + str(currentLecture) + &#39;]/td[1]&#39;).text
  # 名称
  name = broswer.find_element_by_xpath(&#39;//*[@id="dgData00"]/tbody/tr[&#39; + str(currentLecture) + &#39;]/td[2]&#39;).text
  # 单位
  unitsPublish = broswer.find_element_by_xpath(&#39;//*[@id="dgData00"]/tbody/tr[&#39; + str(currentLecture) + &#39;]/td[3]&#39;).text
  # 开始时间
  startTime = broswer.find_element_by_xpath(&#39;//*[@id="dgData00"]/tbody/tr[&#39; + str(currentLecture) + &#39;]/td[4]&#39;).text
  # 截止时间
  endTime = broswer.find_element_by_xpath(&#39;//*[@id="dgData00"]/tbody/tr[&#39; + str(currentLecture) + &#39;]/td[5]&#39;).text</code>
#########

爬取验证码

Python爬蟲爬驗證碼實作功能詳細介紹

对网页中的验证码进行元素审查后,我们发现了其中的一个一个链接,是 IdentifyingCode.apsx,后面我们就对这个页面进行加载,并批量获取验证码。

Python爬蟲爬驗證碼實作功能詳細介紹

爬取的思路是用selenium截取当前页面(仅显示部分),并保存到本地——需要翻页并截取特定位置的请研究:

broswer.set_window_position(**)相关函数;然后人工进行验证码的定位,通过PIL模块进行截取并保存。

最后调用谷歌在Python下的pytesser进行字符识别,但这个网站的验证码有很多的干扰,外加字符旋转,仅仅能识别其中的一部分字符。


<code class="hljs livecodeserver"># 获取验证码并验证(仅仅一幅)
authCodeURL = broswer.find_element_by_xpath(&#39;//*[@id="Table2"]/tbody/tr[2]/td/p/img&#39;).get_attribute(&#39;src&#39;) # 获取验证码地址
broswer.get(authCodeURL)
broswer.save_screenshot(&#39;text.png&#39;)
rangle = (0, 0, 64, 28)
i = Image.open(&#39;text.png&#39;)
frame4 = i.crop(rangle)
frame4.save(&#39;authcode.png&#39;)
qq = Image.open(&#39;authcode.png&#39;)
text = pytesser.image_to_string(qq).strip()</code>
<code class="hljs axapta"># 批量获取验证码
authCodeURL = broswer.find_element_by_xpath(&#39;//*[@id="Table2"]/tbody/tr[2]/td/p/img&#39;).get_attribute(&#39;src&#39;) # 获取验证码地址
# 获取学习样本
for count in range(10):
  broswer.get(authCodeURL)
  broswer.save_screenshot(&#39;text.png&#39;)
  rangle = (1, 1, 62, 27)
  i = Image.open(&#39;text.png&#39;)
  frame4 = i.crop(rangle)
  frame4.save(&#39;authcode&#39; + str(count) + &#39;.png&#39;)
  print &#39;count:&#39; + str(count)
  broswer.refresh()
broswer.quit()</code>


爬取下来的验证码

Python爬蟲爬驗證碼實作功能詳細介紹

一部分验证码原图:

从上面的验证码看出,字符是带旋转的,而且因为旋转造成的重叠对于后续的识别也有很大的影响。我曾尝试过使用神经网络进行训练,但因没有进行特征向量的提取,准确率低得离谱。

关于Python爬虫爬验证码实现功能详解就给大家介绍到这里,希望对大家有所帮助!

更多Python爬蟲爬驗證碼實作功能詳細介紹相关文章请关注PHP中文网!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn