前言你有没有想过,当我们在某个网站上登陆时,网站是如何通过验证的,我们都提交给了网站哪些信息,浏览器都发起了哪些请求?

下图是某个网站的登陆界面,接下来就让我们通过命令行模拟浏览器实现登陆操作,看看一个简单的登陆操作,具体是如何实现的。首先,我们先来明确登陆该网站的所有步骤:

Created with Raphaël 2.1.2登陆页面获取验证码验证码是否正确提交账密信息登陆是否成功获取子网站退出登陆yesnoyesno

载入需要的工具包import requests

import time

from io import BytesIO

from PIL import Image

import re

from lxml import etree

初始化信息这里我们定义了发起http请求需要用的请求头、cookie、发起验证需要用到的表单数据、以及需要请求的URL。你也可以不使用请求头,但这样会使我们发出去的请求带有明显的python-requests字样,使服务器一眼就能识别我们是爬虫程序。为了更加完美的模拟浏览器,我们不妨多写几行代码。

当然,考虑到隐私方面的问题,有些数据已经被我隐去了。# http请求头

header = {

"accept":"*/*",

"accept-encoding":"gzip, deflate",

"accept-language":"zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",

"cache-control":"no-cache",

"connection":"keep-alive",

"host":"dxxxxxxxxxx.cn",

"pragma":"no-cache",

"referer":"http://xxxxxxxxxx.cn/login.htm",

"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0"

}

# 登陆时需要提交的验证信息

data = {

"username":"wangxxxxxxxxxx.cn",

"keyp":"xxxxxxxxxxxxxxxxxxxxxxxxx",

"submitBtn":"登录"

}

# 初始化cookie信息

cookie = requests.cookies.RequestsCookieJar()

cookie.set("u", "5", domain="xxxxxxxxxx.cn", path="/")

# 网络地址

capt_url = "http://xxxxxxxxxx.cn/servlet/ImageServlet"

login_url = "http://xxxxxxxxxx.cn/login.htm?m=login"

subsite_url = "http://xxxxxxxxxx.cn/favorite.htm"

logout_url = "http://xxxxxxxxxx.cn/login.htm?m=cancel"

建立一个http会话首先,我们需要建立一个http请求的会话session,使我们请求验证码的请求和提交登陆信息的请求处于同一个session中,否则即使获得了验证码也无法通过验证。

这里我们直接将初始cookie信息传递给会话session,在http会话的过程中,该session会自动的通过HTTP header更新cookie信息,所以之后就不需要我们手动更新cookie了。s = requests.Session()

s.headers = header

s.cookies = cookie

获取验证码该网站在获取验证码的时候,需要我们提供一个Java long类型的时间戳。当然我们也可以在python中直接调用Java的currentTimeMillis方法,不过这里我们就直接用python的time函数做了一下简单的处理。d = int(time.time() * 1000)

capt_raw = s.get(capt_url, params = {"d":d})

查看验证码这里我们从网站获取的capt_raw响应对象是以raw的数据形式存储的,而且存储的是整张图片的信息,而不是二进制的图像像素数据,所以不能直接用Image.frombytes转换为Image对象。查看Image.frombytes方法的帮助文档:

Note that this function decodes pixel data only, not entire images.

If you have an entire image in a string, wrap it in a :py:class:~io.BytesIO

object, and use :py:func:~PIL.Image.open to load it.

得到解决方案:先将raw数据写入IO流,再通过Image.open方法打开。不能一行代码搞定,还是有点气的。而且Image.open方法有一个参数flag,只能传递“r”(从文件中读取),就不能换个参数,跳过读取文件这一步,直接从内存中读入数据吗?# 将二进制的图片写入IO流

f = BytesIO()

f.write(capt_raw.content)

# 查看验证码

capt = Image.open(f)

capt.show()

# 关闭IO流

f.close()我们获得的验证码展示出来之后大致是下图这个样子,一眼就能识别图中的字符。这里我们需要记住验证码中的字符,接下来登陆操作的过程中会使用到。当然我们也可以通过机器学习自动化识别图中的字符,对于这种难度的验证码,识别率达到90%以上还是很轻松的,关于这点请看这里。

登陆操作接下来我们就要进行登陆操作了,执行以下代码,程序会停在输入验证码:,等待我们输入刚才得到的验证码,然后将接收到的输入作为表单的一部分提交给服务器。data["verifyCode"] = input("输入验证码:")

login_result_html = s.post(login_url, data = data, allow_redirects=True)

查看是否登陆成功无论身份验证证是否成功,网站都会返回给我们一个页面login_result_html,我们怎么知道自己是否登陆成功了呢?这里我们使用xpath语句查询返还的页面,看看自己的账户名是否在返回值列表中出现了!

由于返还的页面比较简单,所以我这里写的xpath语句也比较随便,要让代码更加稳健,xpath应该更具有唯一性才行。不论如何,能得到我们想要的数据就好。doc = etree.HTML(login_result_html.text)

doc.xpath("//li/a//*/text()")

登陆子网站接下来我们将尝试获取子网站(只有通过登陆才能查看)的信息,怎样验证我们成功获取了子网站页面呢?

首先,我在子网站收藏了几份数据(如下图),名称myCollection**都是我自己取的。获取子网站,通过正则匹配看看我们收藏的数据是否都在输出列表中!当然这里也可以对收藏的数据进行进一步的操作,我这里就不详述了。subsite_html = s.get(subsite_url)

re.compile("myCollection\\d+").findall(subsite_html.text)

退出登陆退出登录其实也很简单,只要请求一次logout_url网址就可以了。此时我们再去请求子网站就不能获得收藏的信息了,而是被跳转到登陆页面。最后,不要忘记关闭hui’hsession。s.get(logout_url)

s.close()

结语至此,我们“使用python模拟浏览器实现登陆”的任务总算结束了,登陆验证程序更加复杂的网站也是可以的,不过就是更加细腻的网络流量分析和更加精心的模拟浏览器罢了。

python 模拟浏览器播放视频_使用python模拟浏览器实现登陆相关推荐

  1. python做审计底稿视频_最新Python教学视频,每天自学俩小时,让你offer拿到手软...

    2020最新Python零基础到精通资料教材,干货分享,新基础Python教材,看这里,这里有你想要的所有资源哦,最强笔记,教你怎么入门提升!让你对自己更加有信心,重点是资料都是免费的,免费!!! 如 ...

  2. 基于python的音频播放器_基于python实现音乐播放器代码实例

    基于python实现音乐播放器代码实例,一首,函数,按钮,布局,音乐 基于python实现音乐播放器代码实例 易采站长站,站长之家为您整理了基于python实现音乐播放器代码实例的相关内容. 核心播放 ...

  3. python实现批量下载视频_利用Python实现批量下载腾讯视频!

    原标题:利用Python实现批量下载腾讯视频! 导语 利用Python下载腾讯非VIP视频,也就是可以免费观看的视频.做这个的起因是最近在看一个叫"请吃红小豆吧"的动漫,一共三分钟 ...

  4. python手机安装教程视频_《python安装教程有没有?最好是视频的》 python搭建环境视频教程...

    学习python有什么好的视频教程 自python需要花点时间跟心思,而且要整套的教程去学习,这样你自己识思维上才不乱. 链接: https://pan.baidu.com/s/1TXjBVcnaC3 ...

  5. python编写spark程序 视频_【Python版pyspark】Spark大数据基础入门视频课程

    [注意:本课程只包含pyspark系列课程的基础入门部分] Python版本的pyspark是学习Python的人的福音,为广大的Python开发人员提供了一个使用Python调用Spark接口处理大 ...

  6. python以原帧率播放视频_用Python做FFmpeg批处理之:指定帧率放慢/加快视频。

    前言 我最近要训练视频插帧模型,需要240fps的原视频,网上唯一找到的这样的数据集只有Adobe240fps(DeepVideoDeblurring/DeepVideoDeblurring_Data ...

  7. python 爬取加密视频_使用Python抓取m3u8加密视频 续:获得index.m3u8 地址

    之前写<使用Python抓取m3u8加密视频>笔记的原因,是自己有几个视频想保存,但对于m3u8, .ts 文件拼接不熟悉,就尝试写个脚本练手. 今天看了回复,有同学想知道如何从视频网站上 ...

  8. python调用默认播放器_用Python批量下载MOOC资源

    简介 这是我编写的一个Python脚本,用来批量下载一门MOOC的资源,包括视频.PDF和课程目录. 你是否也曾上MOOC学习过?有没有和我一样遇到这些情况:在线看MOOC视频消耗流量好多,或者浏览器 ...

  9. python下载歌曲教程视频_实现python批量下载网易云音乐的免费音乐

    python视频教程栏目介绍实现下载免费音乐 运行效果 代码# -*- coding:utf-8 -*- import requests, hashlib, sys, click, re, base6 ...

最新文章

  1. 4.4.4 Factory方法
  2. GoCD 19.2.0 发布,ThoughtWorks 的持续集成引擎
  3. AI硬件碎片化难题,英特尔想用“一个API”解决,还推出新的编程语言DPC++
  4. 堆栈向下增长和向上增长的理解
  5. 每天,每周,每月,每年程序员该做的事情
  6. macbook配置java环境变量_Mac系统配置JDK环境变量
  7. 一段比较好的加1操作。能够防止简单的++造成的溢出。
  8. 折线 没有显示_动画折线图,你还可以试试这个图表
  9. SSM错误:Exception in thread “main“ java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletReque
  10. BZOJ1768 : [Ceoi2009]logs
  11. axure 8 表格合并_Excel表格制作出库过磅单,详细步骤讲解,一起来制作吧
  12. PHP架构师必备技术视频合集
  13. (八十三)第三方类库不支持64位处理器的解决方法
  14. 经典的图像分割方法总结
  15. proxyconnect tcp: dial tcp: lookup proxy.example.com on 8.8.8.8:53: no such host
  16. 天呐!350道Java面试真题分享
  17. Linux安装卸载 Mysql完整步骤
  18. python 字节流分段_如何在Python中编写简单代码,并且速度超越Spark?
  19. 点清铸造厂车间除臭剂处理废气和废水恶臭
  20. 键盘大小写切换时小写shift和大写caps Lock按键问题

热门文章

  1. QNX neutrino 实时操作系统的原理
  2. Gale-Shapley---婚姻匹配算法算法
  3. Python爬虫新手入门教学(十六):爬取好看视频小视频
  4. 成功破解校园网锐捷客户端,实现笔记本无线网卡wifi
  5. 【redis篇】超详细的redis安装教程,学不会你找我
  6. 国产CAD想说爱你,并不容易。
  7. 对电话号码判断合理性
  8. python入门之数据库操作
  9. 数据结构 ->顺序表的输入 输出 查找 删除 销毁 快速排序
  10. VS2017更改背景图片