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之引用和类属性的初步理解
May 15 Python
Python安装使用命令行交互模块pexpect的基础教程
May 12 Python
Python 文件操作的详解及实例
Sep 18 Python
Pycharm导入Python包,模块的图文教程
Jun 13 Python
Python爬虫:url中带字典列表参数的编码转换方法
Aug 21 Python
Python 50行爬虫抓取并处理图灵书目过程详解
Sep 20 Python
django使用xadmin的全局配置详解
Nov 15 Python
django项目中新增app的2种实现方法
Apr 01 Python
python实现坦克大战
Apr 24 Python
详细分析Python collections工具库
Jul 16 Python
Python使用windows设置定时执行脚本
Nov 12 Python
python爬取抖音视频的实例分析
Jan 19 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显示Facebook的粉丝数量方法
2014/01/08 PHP
Destoon实现多表查询示例
2014/08/21 PHP
php生成高清缩略图实例详解
2015/12/07 PHP
ThinkPHP的常用配置选项汇总
2016/03/24 PHP
使用php完成常见的文件上传功能(推荐)
2017/01/13 PHP
javascript的事件描述
2006/09/08 Javascript
JavaScript回调(callback)函数概念自我理解及示例
2013/07/04 Javascript
JavaScript中字符串分割函数split用法实例
2015/04/07 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
2015/05/25 Javascript
举例讲解jQuery中可见性过滤选择器的使用
2016/04/18 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
2017/01/03 Javascript
React快速入门教程
2017/01/17 Javascript
从零开始搭建vue移动端项目到上线的步骤
2018/10/15 Javascript
VUE路由动态加载实例代码讲解
2019/08/26 Javascript
微信小程序 scroll-view 实现锚点跳转功能
2019/12/12 Javascript
[14:19]2018年度COSER大赛-完美盛典
2018/12/16 DOTA
python中获得当前目录和上级目录的实现方法
2017/10/12 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
2018/06/19 Python
Python 类的特殊成员解析
2018/06/20 Python
Sanic框架请求与响应实例分析
2018/07/16 Python
Python之循环结构
2019/01/15 Python
Python基于yield遍历多个可迭代对象
2020/03/12 Python
Python greenlet和gevent使用代码示例解析
2020/04/01 Python
matplotlib基础绘图命令之bar的使用方法
2020/08/13 Python
美国著名的婴儿学步鞋老品牌:Robeez
2016/08/20 全球购物
中专毕业生求职简历的自我评价
2013/10/21 职场文书
行政人事经理职位说明书
2014/03/05 职场文书
岗位职责风险点
2014/03/12 职场文书
《假如》教学反思
2014/04/17 职场文书
综合素质自我评价怎么写
2014/09/14 职场文书
热情服务标语
2014/10/07 职场文书
岗位竞聘报告范文
2014/11/06 职场文书
单位介绍信格式
2015/01/31 职场文书
特岗教师个人总结
2015/02/10 职场文书
立案决定书范文
2015/06/24 职场文书
浅谈pytorch中stack和cat的及to_tensor的坑
2021/05/20 Python