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进阶教程之模块(module)介绍
Aug 30 Python
python中bisect模块用法实例
Sep 25 Python
详解Python的Django框架中的模版继承
Jul 16 Python
Python 调用PIL库失败的解决方法
Jan 08 Python
详解PyCharm安装MicroPython插件的教程
Jun 24 Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
Aug 24 Python
python DataFrame转dict字典过程详解
Dec 26 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
Jun 30 Python
基于python实现删除指定文件类型
Jul 21 Python
Python3中FuzzyWuzzy库实例用法
Nov 18 Python
Python类型转换的魔术方法详解
Dec 23 Python
用pushplus+python监控亚马逊到货动态推送微信
Jan 29 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
关于shopex同步ucenter的redirect问题,导致script不运行
2013/04/10 PHP
PHP使用xmllint命令处理xml与html的方法
2014/12/15 PHP
ThinkPHP实现附件上传功能
2017/04/27 PHP
Extjs入门之动态加载树代码
2010/04/09 Javascript
javascript学习(二)javascript常见问题总结
2013/01/02 Javascript
js时间日期和毫秒的相互转换
2013/02/22 Javascript
jquery实现背景墙聚光灯效果示例分享
2014/03/02 Javascript
基于NodeJS的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
2014/09/26 NodeJs
深入理解javascript作用域第二篇之词法作用域和动态作用域
2016/07/24 Javascript
jQuery+HTML5+CSS3制作支持响应式布局时间轴插件
2016/08/10 Javascript
Javascript动画效果(4)
2016/10/11 Javascript
jquery编写日期选择器
2017/03/16 Javascript
Vue.js render方法使用详解
2017/04/05 Javascript
node.js中debug模块的简单介绍与使用
2017/04/25 Javascript
解决VUE框架 导致绑定事件的阻止冒泡失效问题
2018/02/24 Javascript
在vue中解决提示警告 for循环报错的方法
2018/09/28 Javascript
微信小程序textarea层级过高的解决方法
2019/03/04 Javascript
详解Vue前端对axios的封装和使用
2019/04/01 Javascript
Vue中props的详解
2019/05/16 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
2020/01/19 Javascript
星球大战与Python之间的那些事
2016/01/07 Python
Python实现破解12306图片验证码的方法分析
2017/12/29 Python
Python实现的远程登录windows系统功能示例
2018/06/21 Python
Python3用tkinter和PIL实现看图工具
2018/06/21 Python
Python中的函数式编程:不可变的数据结构
2018/10/08 Python
Python3 chardet模块查看编码格式的例子
2019/08/14 Python
django 快速启动数据库客户端程序的方法示例
2019/08/16 Python
Python基础之高级变量类型实例详解
2020/01/03 Python
Python grequests模块使用场景及代码实例
2020/08/10 Python
如何利用pycharm进行代码更新比较
2020/11/04 Python
波兰最大的宠物用品网上商店:FERA.PL
2019/08/11 全球购物
PHP面试题大全
2015/10/16 面试题
sleep()方法和wait()方法的区别是什么
2012/11/17 面试题
工程概预算专业毕业生求职信
2013/10/04 职场文书
2016关于读书活动的心得体会
2016/01/14 职场文书
Ajax常用封装库——Axios的使用
2021/05/08 Javascript