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赋值操作方法分享
Mar 23 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
Apr 11 Python
python logging日志模块的详解
Oct 29 Python
OpenCV-Python实现轮廓检测实例分析
Jan 05 Python
对numpy中布尔型数组的处理方法详解
Apr 17 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
Jul 07 Python
基于Python2、Python3中reload()的不同用法介绍
Aug 12 Python
python实现小世界网络生成
Nov 21 Python
Django后端发送小程序微信模板消息示例(服务通知)
Dec 17 Python
PyCharm下载和安装详细步骤
Dec 17 Python
Python编程编写完善的命令行工具
Sep 15 Python
Python读写yaml文件
Mar 20 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
Windows中安装Apache2和PHP4权威指南
2006/11/18 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
2007/03/10 Javascript
javascript Base类 包含基本的方法
2009/07/22 Javascript
javascript 在网页中的运用(asp.net)
2009/11/23 Javascript
js ondocumentready onmouseover onclick onmouseout 样式
2010/07/22 Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
2010/11/28 Javascript
整理8个很棒的 jQuery 倒计时插件和教程
2011/12/12 Javascript
js获得地址栏?问号后参数的方法
2013/08/08 Javascript
在父页面调用子页面的JS方法
2013/09/29 Javascript
Windows8下搭建Node.js开发环境教程
2014/09/03 Javascript
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
谈一谈bootstrap响应式布局
2016/05/23 Javascript
vue多级多选菜单组件开发
2020/09/08 Javascript
jQuery弹出窗口打开链接的实现代码
2016/12/24 Javascript
vue2.0父子组件间通信的实现方法
2017/04/19 Javascript
axios发送post请求springMVC接收不到参数的解决方法
2018/03/05 Javascript
vue2.0 下拉框默认标题设置方法
2018/08/22 Javascript
[03:20]2015国际邀请赛全明星表演赛
2015/08/08 DOTA
python单元测试unittest实例详解
2015/05/11 Python
Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法
2015/05/16 Python
python写日志封装类实例
2015/06/28 Python
python中获得当前目录和上级目录的实现方法
2017/10/12 Python
Python实现上下班抢个顺风单脚本
2018/02/07 Python
深入浅析Python2.x和3.x版本的主要区别
2018/11/30 Python
Python实现自动签到脚本的示例代码
2020/08/19 Python
用python写一个带有gui界面的密码生成器
2020/11/06 Python
伦敦平价潮流珠宝首饰品牌:Astrid & Miyu
2016/10/10 全球购物
意大利制造的男鞋和女鞋:SCAROSSO
2018/03/07 全球购物
伦敦的高级牛仔布专家:Trilogy
2018/08/06 全球购物
网络教育毕业生自我鉴定
2013/10/10 职场文书
小区门卫岗位职责
2013/12/31 职场文书
安全宣传标语
2014/06/10 职场文书
2014年小学生迎国庆65周年演讲稿
2014/09/27 职场文书
郭明义观后感
2015/06/08 职场文书
思想品德课教学反思
2016/02/24 职场文书