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实现的百度站长自动URL提交小工具
Jun 27 Python
python放大图片和画方格实现算法
Mar 30 Python
基于MTCNN/TensorFlow实现人脸检测
May 24 Python
在Django中URL正则表达式匹配的方法
Dec 20 Python
python实现图片转字符小工具
Apr 30 Python
利用Django模版生成树状结构实例代码
May 19 Python
python读csv文件时指定行为表头或无表头的方法
Jun 26 Python
python通过http下载文件的方法详解
Jul 26 Python
使用python3批量下载rbsp数据的示例代码
Dec 20 Python
PyCharm中配置PySide2的图文教程
Jun 18 Python
用python画城市轮播地图
May 28 Python
python实现学生信息管理系统(面向对象)
Jun 05 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
TMDPHP 模板引擎使用教程
2012/03/13 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
2014/10/16 PHP
php设计模式之适配器模式原理、用法及注意事项详解
2019/09/24 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
PHP SESSION跨页面传递失败解决方案
2020/12/11 PHP
在JavaScript中通过URL传递汉字的方法
2007/04/09 Javascript
javascript 防止刷新,后退,关闭
2010/08/07 Javascript
js String对象中常用方法小结(字符串操作)
2012/01/27 Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
2013/03/29 Javascript
jquery实现图片裁剪思路及实现
2013/08/16 Javascript
javascript中if和switch,==和===详解
2015/07/30 Javascript
微信小程序 开发之全局配置
2017/05/05 Javascript
laravel5.3 vue 实现收藏夹功能实例详解
2018/01/21 Javascript
element-ui组件中input等的change事件中传递自定义参数
2019/05/22 Javascript
nodejs制作小爬虫功能示例
2020/02/24 NodeJs
Js实现复选框的全选、全不选反选功能代码实例
2020/02/28 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
python使用pil生成图片验证码的方法
2015/05/08 Python
python去掉 unicode 字符串前面的u方法
2018/10/21 Python
简单介绍django提供的加密算法
2019/12/18 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
2020/03/09 Python
150行Python代码实现带界面的数独游戏
2020/04/04 Python
Matplotlib 绘制饼图解决文字重叠的方法
2020/07/24 Python
python函数超时自动退出的实操方法
2020/12/28 Python
jupyter notebook指定启动目录的方法
2021/03/02 Python
Mytheresa美国官网:德国知名的女性奢侈品电商
2017/05/27 全球购物
西部世纪面试题
2014/12/05 面试题
党员岗位承诺书
2014/03/25 职场文书
对教师的评语
2014/04/28 职场文书
项目申报专员岗位职责
2014/07/09 职场文书
自查自纠工作总结
2014/10/15 职场文书
2015年班主任个人工作总结
2015/03/31 职场文书
超市收银员岗位职责
2015/04/07 职场文书
大学生心理健康活动总结
2015/05/08 职场文书
详解Python常用的魔法方法
2021/06/03 Python
nginx之内存池的实现
2022/06/28 Servers