<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> <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> # 在这里输入表单填写并加载的代码 elm = wait.until(lambda webdriver: broswer.find_element_by_xpath(xpathMenuCheck))</code>
元素定位、字符输入
接下来我们需要进行登录操作:这里我使用的是Chrome,右键选择需要进行填写内容的部分,选择检查,会自动转跳到 F12下的开发者模式(全程需要这个功能来找到相关的资源)。
vczKprbLJnJkcXVvO9Gh1PHT0LnYtcSyv7fWPGJyIC8+DQo8aW1nIGFsdD0="这里写图片描述" src="http://HdhCmsTestuploadfile/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>
爬取信息
接下来我们要进行的步骤是爬取现有的有效报告:
<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> <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> 爬取下来的验证码
一部分验证码原图:
从上面的验证码看出,字符是带旋转的,而且因为旋转造成的重叠对于后续的识别也有很大的影响。我曾尝试过使用神经网络进行训练,但因没有进行特征向量的提取,准确率低得离谱。
关于Python爬虫爬验证码实现功能详解就给大家介绍到这里,希望对大家有所帮助!
更多Python爬虫爬验证码实现功能详细介绍相关文章请关注PHP中文网!
查看更多关于Python爬虫爬验证码实现功能详细介绍的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did82657