python爬虫之自动登录与验证码识别


Posted in Python onJune 15, 2020

在用爬虫爬取网站数据时,有些站点的一些关键数据的获取需要使用账号登录,这里可以使用requests发送登录请求,并用Session对象来自动处理相关Cookie。

另外在登录时,有些网站有时会要求输入验证码,比较简单的验证码可以直接用pytesser来识别,复杂的验证码可以依据相应的特征自己采集数据训练分类器。

以CSDN网站的登录为例,这里用Python的requests库与pytesser库写了一个登录函数。如果需要输入验证码,函数会首先下载验证码到本地,然后用pytesser识别验证码后登录,对于CSDN登录验证码,pytesser的识别率很高。

其中的pytesser的下载地址为: pytesser下载

具体代码如下:

#coding:utf-8
import sys
import time
import urllib
import shutil
import pytesser
import requests

from lxml import etree

config = {'gid': 1}

def parse(s, html, idx):
 result = {}

 tree = etree.HTML(html)
 try:
 result['lt'] = tree.xpath('//input[@name="lt"]/@value')[0]
 result['execution'] = tree.xpath('//input[@name="execution"]/@value')[0]
 result['path'] = tree.xpath('//form[@id="fm1"]/@action')[0]
 except IndexError, e:
 return None

 valimg = None
 valimgs = tree.xpath('//img[@id="yanzheng"]/@src')
 if len(valimgs) > 0:
 valimg = valimgs[0]

 validateCode = None
 if valimg:
 fname = 'img/' + str(idx) + '_' + str(config['gid']) + '.jpg'
 config['gid'] = config['gid'] + 1
 ri = s.get("https://passport.csdn.net" + valimg)
 with open(fname, 'wb') as f:
  for chk in ri:
  f.write(chk)
  f.close()
 validateCode = pytesser.image_file_to_string(fname)
 validateCode = validateCode.strip()
 validateCode = validateCode.replace(' ', '')
 validateCode = validateCode.replace('\n', '')
 result['validateCode'] = validateCode

 return result

def login(usr, pwd, idx):
 s = requests.Session()

 r = s.get('https://passport.csdn.net/account/login',
 headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0', 'Host': 'passport.csdn.net', })

 while True:
 res = parse(s, r.text, idx)
 if res == None:
  return False
 url = 'https://passport.csdn.net' + res['path']
 form = {'username': usr, 'password':pwd, '_eventId':'submit', 'execution':res['execution'], 'lt':res['lt'],}
 if res.has_key('validateCode'):
  form['validateCode'] = res['validateCode']
 s.headers.update({
  'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0',
  'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4',
  'Content-Type': 'application/x-www-form-urlencoded',
  'Host': 'passport.csdn.net',
  'Origin': 'https://passport.csdn.net',
  'Referer': 'https://passport.csdn.net/account/login',
  'Upgrade-Insecure-Requests': 1,
  })
 r = s.post(url, data=form)

 tree = etree.HTML(r.text)
 err_strs = tree.xpath('//span[@id="error-message"]/text()')
 if len(err_strs) == 0:
  return True
 err_str = err_strs[0]
 print err_str
 err = err_str.encode('utf8')

 validate_code_err = '验证码错误'
 usr_pass_err = '帐户名或登录密码不正确,请重新输入'
 try_later_err = '登录失败连续超过5次,请10分钟后再试'

 if err[:5] == validate_code_err[:5]:
  pass
 elif err[:5] == usr_pass_err[:5]:
  return False
 elif err[:5] == try_later_err[:5]:
  return False
 else:
  return True

if __name__ == '__main__':
 main(sys.argv[1], sys.argv[2], 0)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python回调函数用法实例详解
Jul 02 Python
Python用Bottle轻量级框架进行Web开发
Jun 08 Python
python入门教程之识别验证码
Mar 04 Python
python urllib urlopen()对象方法/代理的补充说明
Jun 29 Python
numpy中的delete删除数组整行和整列的实例
May 09 Python
浅谈flask源码之请求过程
Jul 26 Python
python 文本单词提取和词频统计的实例
Dec 22 Python
200行python代码实现2048游戏
Jul 17 Python
对python中的float除法和整除法的实例详解
Jul 20 Python
Python xlrd excel文件操作代码实例
Mar 10 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
May 24 Python
一劳永逸彻底解决pip install慢的办法
May 24 Python
python使用matplotlib模块绘制多条折线图、散点图
Apr 26 #Python
python绘制多个曲线的折线图
Mar 23 #Python
python使用Matplotlib绘制分段函数
Sep 25 #Python
python使用Matplotlib画饼图
Sep 25 #Python
python使用Matplotlib画条形图
Mar 25 #Python
python使用matplotlib画饼状图
Sep 25 #Python
符合语言习惯的 Python 优雅编程技巧【推荐】
Sep 25 #Python
You might like
千呼万唤始出来,DOTA2勇士令状不朽宝藏Ⅱ现已推出
2020/08/25 DOTA
PHP开发工具ZendStudio下Xdebug工具使用说明详解
2013/11/11 PHP
PHP获取用户访问IP地址的5种方法
2016/05/16 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
Alliance vs AM BO3 第一场2.13
2021/03/10 DOTA
Javascript typeof 用法
2008/12/28 Javascript
Prototype源码浅析 String部分(四)之补充
2012/01/16 Javascript
createTextRange()的使用示例含文本框选中部分文字内容
2014/02/24 Javascript
jQuery判断checkbox是否选中的3种方法
2014/08/12 Javascript
js实现支持手机滑动切换的轮播图片效果实例
2015/04/29 Javascript
JavaScript订单操作小程序完整版
2017/06/23 Javascript
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
JS实现为动态创建的元素添加事件操作示例
2018/03/17 Javascript
详解vue-cli项目中怎么使用mock数据
2018/05/29 Javascript
mpvue 项目初始化及实现授权登录的实现方法
2020/07/20 Javascript
[53:15]Mineski vs iG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python的mysqldb安装步骤详解
2017/08/14 Python
Python模块搜索路径代码详解
2018/01/29 Python
django中send_mail功能实现详解
2018/02/06 Python
Python 处理图片像素点的实例
2019/01/08 Python
520使用Python实现“我爱你”表白
2020/05/20 Python
python 将html转换为pdf的几种方法
2020/12/29 Python
JD Sports马来西亚:英国领先的运动鞋和运动服饰零售商
2018/03/13 全球购物
教育系毕业生中文求职信范文
2013/10/06 职场文书
银行实习自我鉴定
2013/10/12 职场文书
英语自荐信范文
2013/12/11 职场文书
餐饮加盟计划书
2014/01/10 职场文书
体育教学随笔感言
2014/02/24 职场文书
学习十八大坚定理想信念心得体会
2014/03/11 职场文书
大学生通用个人自我评价
2014/04/27 职场文书
领导班子四风问题个人对照检查材料
2014/10/04 职场文书
2014年行政后勤工作总结
2014/12/06 职场文书
2014年环保局工作总结
2014/12/11 职场文书
避暑山庄导游词
2015/02/04 职场文书
年终奖金发放管理制度,中小企业适用,拿去救急吧!
2019/07/12 职场文书
使用Bandicam录制鼠标指针并附带点击声音,还可以添加点击动画效果
2022/04/11 数码科技