之前帮公司爬取过内部的一个问题单网站,要求将每个问题单的下的附件下载下来。一开始的时候我就遇到一个破解登陆验证的大坑......      (╬ ̄皿 ̄)=○

由于在公司使用的都是内网,代码和网站的描述也都属于公司的信息安全资产范围,具体细节不方便透露,就简要描述一下需求和问题吧。

在访问网站前需要先进行一个登陆,浏览器使用的是chrome,一开始我的想法是通过chromrdriver模拟登陆,但是用户名和密码输入框都是使用的浏览器自带的弹窗,chromedriver无法获取到输入和点击位置。放弃这个想法后我就想着模拟一个请求头去发送请求破解的方式,但是直接F12后还是没法从头信息中获取到登陆验证的方式。。。。由于之前压根没接触过爬虫,对前端知识和网络协议也不太了解,当场直接自闭了!!!

皇天不负有心人,最后通过Fiddler抓包,终于获取到了登陆验证的方式。网站是通过ntml方式来验证登陆的。废话不多说直接上代码(网址和账号密码信息请自行修改)

 # -*- coding:utf-8 -*-
# author: cdc
# date: 2019/1/20 import ntlm3
import urllib.request def login(url,username,password):
passman = urllib.request.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None,url,username,password)
auth_NTLM = ntlm3.HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(passman)
opener = urllib.request.build_opener(auth_NTLM)
urllib.request.install_opener(opener)
response = urllib.request.urlopen(url)
return response if __name__ == "__main__":
url = r'http://dts.huawei.com'
username = 'cwx589809'
password = 'cdc19951216tr,!'
res = login(url,username,password)
print(res)

但是还是无法破解登陆问题,获取的返回信息状态还是400。是的,忙活了半天我再一次自闭了!!!

再一次在发送登陆请求的时候用Fiddler去抓包,发现auth_header值中有字段'negotiate',而我又对比了下python-ntml3中的源码,返现python-ntml3库中AbstractNtlmAuthHandler类的http_error_authentication_required方法中并没有对这个值进行判断。

源码:

将这一行的代码改成:

if auth_header_value is not None and (
'ntlm' in auth_header_value.lower() or 'negotiate' in auth_header_value.lower()):

此外,网页返回的信息都是string类型的,而源码中统一处理的都是bytes对象,因此还需对源码的两处进行一个解码的操作

源码:

将这两处改为:

# line_num:58
auth = 'NTLM %s' % bytes.decode(ntlm.create_NTLM_NEGOTIATE_MESSAGE(user, type1_flags)) # line_num:108
auth = 'NTLM %s' % bytes.decode(ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge, UserName, DomainName, pw, NegotiateFlags))

小结一下:

首先这个只是针对我们公司内部开发的网站的一个问题,其他网站的auth_header或许只有'ntml'或者其他的值,这个需要大家自己根据实际的需求去修改;

其次或许还有其他的更好的破解此类登陆的方式,也希望大家一起学习分享(鄙人刚入门小白一个)。

PS:Fiddler真尼玛好用,抓包神器名不虚传!

完结撒花,掰掰!

Python学习—爬虫篇之破解ntml登陆问题的更多相关文章

  1. Python学习——爬虫篇

    requests 使用requests进行爬取                 下面是我编写的第一个爬虫的脚本                   import requests # 导入reques ...

  2. Python学习第一篇

    好久没有来博客园了,今天开始写自己学习Python和Hadoop的学习笔记吧.今天写第一篇,Python学习,其他的环境部署都不说了,可以参考其他的博客. 今天根据MachineLearning里面的 ...

  3. [Python学习]错误篇二:切换当前工作目录时出错——FileNotFoundError: [WinError 3] 系统找不到指定的路径

    REFERENCE:<Head First Python> ID:我的第二篇[Python学习] BIRTHDAY:2019.7.13 EXPERIENCE_SHARING:解决切换当前工 ...

  4. [Python学习]错误篇一

    REFERENCE:<Head First Python> ID:我的第一篇[Python学习] BIRTHDAY:2019.7.6 EXPERIENCE_SHARING:两个程序错误类型 ...

  5. Python学习—基础篇之文件操作

    文件操作 文件操作也是编程中需要熟练掌握的技能,尤其是在后台接口编写和数据分析过程中,对各种类型的文件进行操作,获取文件信息或者对信息进行存储是十分重要的.本篇博客中将主要对常见的文本格式文件和Exc ...

  6. Python学习 - 入门篇2(更新中)

    前言 学习渠道:慕课网:Python进阶 记录原因:我只是想边上课边做笔记而已,呵呵哒 食用提示:教程环境基于Python 2.x,有些内容在Python 3.x中已经改变 函数式编程 定义:一种抽象 ...

  7. Python学习 - 入门篇1

    前言 学习渠道:慕课网:Python入门 记录原因:人总归要向记忆低头[微笑再见.gif] 记录目标:形成简洁的知识点查阅手册 变量和数据类型 变量 赋值 在Python中,可以把任意数据类型赋值给变 ...

  8. Python学习——BeautifulSoup篇

    BeautifulSoup     Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beau ...

  9. Python学习 —— 爬虫入门 - 爬取Pixiv每日排行中的图片

    更新于 2019-01-30 16:30:55 我另外写了一个面向 pixiv 的库:pixiver 支持通过作品 ID 获取相关信息.下载等,支持通过日期浏览各种排行榜(包括R-18),支持通过 p ...

随机推荐

  1. 一款我常用到的手机app

    我从初中开始接触电子书,后来渐渐养成了看电子书的习惯.在阅读电子书的过程中自然要接触到各种各样的阅读类的手机app,比如书旗.qq阅读.百度阅读器等等.个人感觉掌阅使用起来好一些. 首先,它的界面很简 ...

  2. webpack的知识内容

    webpack的构建工具: 浏览器的兼容性? 转换ES6语法: 转化JSX: css

  3. Linux第一节课学习笔记

    我的目标是考过RHCE 开源软件有使用.复制.传播.收费.修改及创建衍生品自由,其中后二者只有开源软件才有,前四者开闭源共有.

  4. 使用parted对大于2T的磁盘进行分区

    使用parted对磁盘进行分区 版本信息 版本 修改日期 修改人 修改内容 备注 V0.1 2018/09/06   初始化版本 讨论稿                                 ...

  5. pxe+Kickstart自动装机补充知识点

    1.vmlinuzvmlinuz是可引导的.压缩的内核.“vm”代表“Virtual Memory”.Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制.Linux能够使用硬盘 ...

  6. hadoop完全分步式搭建

    实验环境介绍 4台机器,规划如下: 计算机名 IP地址 角色 master 192.168.138.200 NameNode,SecondaryNameNode,ResourceManager sla ...

  7. Batch Close process

    @echo offecho.rem Kill all chrome drivertaskkill /im chromedriver.exe /f pause

  8. zip()函数,max()和min(),built-in function,import模块,read(),readlines(),write(),writelines(),with..as..文件处理方式

    zip()函数:将可迭代对象作为参数,将对象中的对应元素打包成一个个元组. #map()普通的输出例子 print(list(zip(('a','n','c'),(1,2,3)))) print(li ...

  9. koa2+log4js+sequelize搭建的nodejs服务

    主要参考http://www.jianshu.com/p/6b816c609669这篇文章 npm安装使用国内taobao镜像,速度更快些 npm --registry https://registr ...

  10. cookie and sesssion

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...