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解释器理解Python中的字节码
Apr 01 Python
浅析Python中return和finally共同挖的坑
Aug 18 Python
用Python登录好友QQ空间点赞的示例代码
Nov 04 Python
python print 按逗号或空格分隔的方法
May 02 Python
浅谈python 读excel数值为浮点型的问题
Dec 25 Python
获取django框架orm query执行的sql语句实现方法分析
Jun 20 Python
python提取log文件内容并画出图表
Jul 08 Python
简单了解python变量的作用域
Jul 30 Python
PyQtGraph在pyqt中的应用及安装过程
Aug 04 Python
Python3直接爬取图片URL并保存示例
Dec 18 Python
python数据预处理 :数据共线性处理详解
Feb 24 Python
python中opencv实现图片文本倾斜校正
Jun 11 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
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
2015/12/14 PHP
PHP模板引擎Smarty自定义变量调解器用法
2016/04/11 PHP
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
JavaScript 面向对象的之私有成员和公开成员
2010/05/04 Javascript
深入理解JavaScript系列(15) 函数(Functions)
2012/04/12 Javascript
offsetHeight在OnLoad中获取为0的现象
2013/07/22 Javascript
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
单元选择合并变色示例代码
2014/05/26 Javascript
最短的IE判断var ie=!-[1,]分析
2014/05/28 Javascript
使用CamanJS在Web页面上处理图像的技巧
2015/08/18 Javascript
轻松使用jQuery双向select控件Bootstrap Dual Listbox
2015/12/13 Javascript
bootstrap-wysiwyg结合ajax实现图片上传实时刷新功能
2016/05/27 Javascript
Angular使用 ng-img-max 调整浏览器中的图片的示例代码
2017/08/17 Javascript
element-ui中的select下拉列表设置默认值方法
2018/08/24 Javascript
jQuery+Datatables实现表格批量删除功能【推荐】
2018/10/24 jQuery
javascript中call()、apply()的区别
2019/03/21 Javascript
JS如何把字符串转换成json
2020/02/21 Javascript
vue实现购物车案例
2020/05/30 Javascript
vue离开当前页面触发的函数代码
2020/09/01 Javascript
vue3 watch和watchEffect的使用以及有哪些区别
2021/01/26 Vue.js
解决await在forEach中不起作用的问题
2021/02/25 Javascript
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
Python文本相似性计算之编辑距离详解
2016/11/28 Python
python字典DICT类型合并详解
2017/08/17 Python
Python使用progressbar模块实现的显示进度条功能
2018/05/31 Python
利用Python如何批量更新服务器文件
2018/07/29 Python
详解PyCharm配置Anaconda的艰难心路历程
2018/08/13 Python
使用Scrapy爬取动态数据
2018/10/21 Python
python实现多进程代码示例
2018/10/31 Python
Python批量查询关键词微信指数实例方法
2019/06/27 Python
把vgg-face.mat权重迁移到pytorch模型示例
2019/12/27 Python
德国大型和小型家用电器网上商店:Energeto
2019/05/15 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?用contains来区分是否有重复的对象。还是都不用
2013/07/30 面试题
转党组织关系介绍信
2014/01/08 职场文书
单位作风建设自查报告
2014/10/23 职场文书
出差报告格式模板
2014/11/06 职场文书