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验证码识别的实例详解
Sep 09 Python
详解Python发送email的三种方式
Oct 18 Python
python RabbitMQ 使用详细介绍(小结)
Nov 08 Python
使用Python向DataFrame中指定位置添加一列或多列的方法
Jan 29 Python
Python基础知识点 初识Python.md
May 14 Python
关于Python形参打包与解包小技巧分享
Aug 24 Python
python日志模块logbook使用方法
Sep 19 Python
Python中filter与lambda的结合使用详解
Dec 24 Python
python程序输出无内容的解决方式
Apr 09 Python
python3.7+selenium模拟淘宝登录功能的实现
May 26 Python
基于python和flask实现http接口过程解析
Jun 15 Python
利用python汇总统计多张Excel
Sep 22 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
phpMyAdmin 链接表的附加功能尚未激活的问题
2010/08/01 PHP
php的4种常见运行方式
2015/03/20 PHP
PHP计算加权平均数的方法
2015/07/16 PHP
PHP7中I/O模型内核剖析详解
2019/04/14 PHP
JavaScript CSS 修改学习第四章 透明度设置
2010/02/19 Javascript
JS获取select-option-text_value的方法
2013/12/26 Javascript
javascript中2个感叹号的用法实例详解
2014/09/04 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
Javascript基础知识盲点总结之函数
2016/05/15 Javascript
对象转换为原始值的实现方法
2016/06/06 Javascript
Backbone View 之间通信的三种方式
2016/08/09 Javascript
jQuery自定义图片上传插件实例代码
2017/04/04 jQuery
vue Element-ui input 远程搜索与修改建议显示模版的示例代码
2017/10/19 Javascript
使用vux实现上拉刷新功能遇到的坑
2018/02/08 Javascript
javaScript强制保留两位小数的输入数校验和小数保留问题
2018/05/09 Javascript
vue中使用微信公众号js-sdk踩坑记录
2019/03/29 Javascript
Javascript 类型转换、封闭函数及常见内置对象操作示例
2019/11/15 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
2019/12/30 Javascript
浅谈webpack构建工具配置和常用插件总结
2020/05/11 Javascript
详谈vue中router-link和传统a链接的区别
2020/07/22 Javascript
python进程管理工具supervisor使用实例
2014/09/17 Python
详解python中init方法和随机数方法
2019/03/13 Python
基于python3 的百度图片下载器的实现代码
2019/11/05 Python
使用Keras预训练好的模型进行目标类别预测详解
2020/06/27 Python
python+opencv实现车道线检测
2021/02/19 Python
马来西亚在线药房:RoyalePharma
2019/12/01 全球购物
浙大网新C/C++面试解惑
2015/05/27 面试题
请说出这段代码执行后a和b的值分别是多少
2015/03/28 面试题
幼师自荐信
2013/10/26 职场文书
毕业生找工作的求职信范文
2013/12/24 职场文书
教师绩效考核方案
2014/01/21 职场文书
幼儿教育感言
2014/02/05 职场文书
《奇妙的国际互联网》 教学反思
2014/02/25 职场文书
2015年圣诞节活动总结
2015/03/24 职场文书
个人廉政承诺书
2015/04/28 职场文书
JavaScript执行机制详细介绍
2021/12/06 Javascript