主要实现功能:

- 登陆网页

- 动态等待网页载入

- 验证码下载

非常早就有一个想法,就是自己主动依照脚本运行一个功能。节省大量的人力——个人比較懒。花了几天写了写,本着想完成验证码的识别,从根本上解决这个问题,仅仅是难度太高,识别的准确率又太低。计划再次告一段落。

希望这次经历能够与大家进行分享和交流。

注:代码中的 username与password都是无效的!


Python打开浏览器

相比与自带的urllib2模块,操作比較麻烦。针对于一部分网页还须要对cookie进行保存,非常不方便。于是。我这里使用的是Python2.7下的selenium模块进行网页上的操作。

測试网页:http://graduate.buct.edu.cn


打开网页:(需下载chromedriver

为了支持中文字符输出,我们须要调用sys模块。把默认编码改为 UTF-8

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)

等待网页载入完成

使用的是selenium中的WebDriverWait。上面的代码中已经载入

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

元素定位、字符输入

接下来我们须要进行登录操作:这里我使用的是Chrome,右键选择须要进行填写内容的部分,选择检查,会自己主动转跳到 F12下的开发人员模式(全程须要这个功能来找到相关的资源)。

以下的UserRole部分就是和“教师端”选择有关的部分



这里我们看到有一个value = “1”,考虑到下拉框的属性,我们仅仅要想办法把这个value赋值给UserRole就好了。

这里使用的是通过selenium的Select模块来进行选择,定位控件使用 find_element_by_**,能一一相应,非常方便。

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

这是用脚本自己主动填充完的效果,之后就会转跳到下一页。


这里,我须要的是功能是自己主动对学术报告进行报名

对须要已有的报告右键就可以发现和这个活动有关的消息,因如今没有报告,所以仅仅显示了标题。但对于后面的有效报告识别有类似的地方。

对于元素的定位,我优先选择了 xpath。依据測试。能够唯一定位一个元素的位置,非常好用。

//*[@id="dgData00"]/tbody/tr/td[2]  (前面是xpath)


爬取信息

接下来我们要进行的步骤是爬取现有的有效报告:

# 寻找有效报告
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

爬取验证码

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

爬取的思路是用selenium截取当前页面(仅显示部分)。并保存到本地——须要翻页并截取特定位置的请研究:broswer.set_window_position(**)相关函数;然后人工进行验证码的定位,通过PIL模块进行截取并保存。

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

# 获取验证码并验证(仅仅一幅)
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()
# 批量获取验证码
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()

一部分验证码原图:

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


这个是一位作者实践后的心得:

http://www.cnblogs.com/sweetwxh/p/captcha_recognize.html

看了之后我变得清醒。决定不再继续识别验证码了。但这个经验非常实用,以后就能够拿来爬各种数据了

Python 爬验证码的更多相关文章

  1. Python 爬取 热词并进行分类数据分析-[解释修复+热词引用]

    日期:2020.02.02 博客期:141 星期日 [本博客的代码如若要使用,请在下方评论区留言,之后再用(就是跟我说一声)] 所有相关跳转: a.[简单准备] b.[云图制作+数据导入] c.[拓扑 ...

  2. Python 爬取所有51VOA网站的Learn a words文本及mp3音频

    Python 爬取所有51VOA网站的Learn a words文本及mp3音频 #!/usr/bin/env python # -*- coding: utf-8 -*- #Python 爬取所有5 ...

  3. python爬取网站数据

    开学前接了一个任务,内容是从网上爬取特定属性的数据.正好之前学了python,练练手. 编码问题 因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这个机会算是彻底搞清楚了. 问题要从文字的编码讲 ...

  4. python爬取某个网页的图片-如百度贴吧

    python爬取某个网页的图片-如百度贴吧 作者:vpoet mail:vpoet_sir@163.com 注:随意copy,不用告诉我 #coding:utf-8 import urllib imp ...

  5. python爬爬爬之单网页html页面爬取

    python爬爬爬之单网页html页面爬取 作者:vpoet mail:vpoet_sir@163.com 注:随意copy 不用告诉我 #coding:utf-8 import urllib2 Re ...

  6. Python:爬取乌云厂商列表,使用BeautifulSoup解析

    在SSS论坛看到有人写的Python爬取乌云厂商,想练一下手,就照着重新写了一遍 原帖:http://bbs.sssie.com/thread-965-1-1.html #coding:utf- im ...

  7. 使用python爬取MedSci上的期刊信息

    使用python爬取medsci上的期刊信息,通过设定条件,然后获取相应的期刊的的影响因子排名,期刊名称,英文全称和影响因子.主要过程如下: 首先,通过分析网站http://www.medsci.cn ...

  8. python识别验证码——PIL,pytesser,pytesseract的安装

    1.使用Python识别验证码需要安装Python的图像处理模块(PIL.pytesser.pytesseract) (安装过程需要pip,在我的Python中已经安装pip了,pip的安装就不在赘述 ...

  9. Python 爬取美团酒店信息

    事由:近期和朋友聊天,聊到黄山酒店事情,需要了解一下黄山的酒店情况,然后就想着用python 爬一些数据出来,做个参考 主要思路:通过查找,基本思路清晰,目标明确,仅仅爬取美团莫一地区的酒店信息,不过 ...

随机推荐

  1. eclipse 垃圾回收器,内存释放

    http://zhangrong-0825-163-com.iteye.com/blog/7334071.如何在eclipse里修改web工程的访问路径,步骤如下: 点击web工程——>选择pr ...

  2. Java虚拟机学习 - 垃圾收集算法(3)

    跟踪收集器       跟踪收集器采用的为集中式的管理方式,全局记录对象之间的引用状态,执行时从一些列GC  Roots的对象做为起点,从这些节点向下开始进行搜索所有的引用链,当一个对象到GC  Ro ...

  3. Hadoop Archives

    原文地址:http://hadoop.apache.org/docs/r1.0.4/cn/hadoop_archives.html 什么是Hadoop archives? 如何创建archive? 如 ...

  4. NYOJ239 月老的难题 【二分图最大匹配·匈牙利】

    月老的难题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 月老准备给n个女孩与n个男孩牵红线.成就一对对美好的姻缘. 如今,因为一些原因,部分男孩与女孩可能结成幸福 ...

  5. Windows 7下在DebugView中显示调试信息

    自Windows Vista以来,调试信息在默认状态下是不显示的.为了显示调试信息,按照如下步骤设置即可: 1. 打开注册表: 2. 在HKLM\SYSTEM\CuurentControlSet\Co ...

  6. HDU--Elevator(水题)

    Elevator nid=24#time"> Time Limit: 1000ms   Memory limit: 32768K  有疑问?点这里^_^ 题目描写叙述 The high ...

  7. notepad++与ISE/Vivado关联

    转自:http://www.cnblogs.com/ninghechuan/p/6172237.html 1.notepad++与vivado关联 打开vivado软件,选择菜单栏“Tools——&g ...

  8. Dockerfile最佳实践(一)

    1.使用缓存  Dockerfile的每条指令都会将结果提交为新的镜像,下一跳指令将会基于上一步指令的镜像的基础上构建,如果一个镜像存在相同的父镜像和指令(除了ADD),Docker将会使用镜像而不是 ...

  9. Spark核心概念理解

    本文主要内容来自于<Hadoop权威指南>英文版中的Spark章节,能够说是个人的翻译版本号,涵盖了基本的Spark概念.假设想获得更好地阅读体验,能够訪问这里. 安装Spark 首先从s ...

  10. Linux安装Qt详细步骤 亲测总结

    下载 qt-everywhere-opensource-src-4.8.4.tar.gz================准备工作====================yum install kern ...