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开发之str.format()用法实例分析
Feb 22 Python
Python中的sort()方法使用基础教程
Jan 08 Python
在python3环境下的Django中使用MySQL数据库的实例
Aug 29 Python
python中利用zfill方法自动给数字前面补0
Apr 10 Python
PyQt5每天必学之布局管理
Apr 19 Python
Python 实现选择排序的算法步骤
Apr 22 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
Jun 19 Python
Python整数与Numpy数据溢出问题解决
Sep 11 Python
Django实现文件上传和下载功能
Oct 06 Python
python进程池实现的多进程文件夹copy器完整示例
Nov 27 Python
详解Python中openpyxl模块基本用法
Feb 23 Python
pycharm Tab键设置成4个空格的操作
Feb 26 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
PHP中实现图片的锐化
2006/10/09 PHP
php 随机记录mysql rand()造成CPU 100%的解决办法
2010/05/18 PHP
浅析PHP Socket技术
2013/08/02 PHP
PHP如何通过传引用的思想实现无限分类(代码简单)
2015/10/13 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
2016/10/08 PHP
自己的js工具_Form 封装
2009/08/21 Javascript
读jQuery之二(两种扩展)
2011/06/11 Javascript
jQuery带时间的日期控件代码分享
2015/08/26 Javascript
JS实现3D图片旋转展示效果代码
2015/09/22 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
2017/03/04 Javascript
node通过npm写一个cli命令行工具
2017/10/12 Javascript
Node.js Buffer用法解读
2018/05/18 Javascript
.vue文件 加scoped 样式不起作用的解决方法
2018/05/28 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
es6数据变更同步到视图层的方法
2019/03/04 Javascript
微信小程序利用swiper+css实现购物车商品删除功能
2019/03/06 Javascript
详解滑动穿透(锁body)终极探索
2019/04/16 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
2019/06/21 Javascript
在Vue中使用mockjs代码实例
2020/11/25 Vue.js
[52:06]完美世界DOTA2联赛决赛日 Inki vs LBZS 第一场 11.08
2020/11/10 DOTA
python中通过预先编译正则表达式提高效率
2017/09/25 Python
python基于twisted框架编写简单聊天室
2018/01/02 Python
对python3中pathlib库的Path类的使用详解
2018/10/14 Python
Python实现按逗号分隔列表的方法
2018/10/23 Python
python基础知识(一)变量与简单数据类型详解
2019/04/17 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
2019/08/17 Python
使用pickle存储数据dump 和 load实例讲解
2019/12/30 Python
python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例
2020/02/28 Python
python 使用事件对象asyncio.Event来同步协程的操作
2020/05/04 Python
金融专业推荐信
2013/11/14 职场文书
家长评语大全
2014/01/22 职场文书
遥感技术与仪器求职信
2014/02/22 职场文书
优秀安全员事迹材料
2014/05/11 职场文书
抵押贷款承诺书
2014/05/30 职场文书
2015年世界卫生日活动总结
2015/02/09 职场文书
中秋联欢会主持词
2015/07/04 职场文书