前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用python模拟浏览器实现登陆

使用python模拟浏览器实现登陆

作者头像
py3study
发布2020-01-06 16:54:58
1.7K0
发布2020-01-06 16:54:58
举报
文章被收录于专栏:python3

前言

  • 你有没有想过,当我们在某个网站上登陆时,网站是如何通过验证的,我们都提交给了网站哪些信息,浏览器都发起了哪些请求?
  • 下图是某个网站的登陆界面,接下来就让我们通过命令行模拟浏览器实现登陆操作,看看一个简单的登陆操作,具体是如何实现的。
登陆页面
登陆页面
  • 首先,我们先来明确登陆该网站的所有步骤:

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

载入需要的工具包

代码语言:javascript
复制
import requests
import time
from io import BytesIO
from PIL import Image

import re
from lxml import etree

初始化信息

  • 这里我们定义了发起http请求需要用的请求头、cookie、发起验证需要用到的表单数据、以及需要请求的URL。你也可以不使用请求头,但这样会使我们发出去的请求带有明显的python-requests字样,使服务器一眼就能识别我们是爬虫程序。为了更加完美的模拟浏览器,我们不妨多写几行代码。
  • 当然,考虑到隐私方面的问题,有些数据已经被我隐去了。
代码语言:javascript
复制
# 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了。
代码语言:javascript
复制
s = requests.Session()
s.headers = header
s.cookies = cookie

获取验证码

  • 该网站在获取验证码的时候,需要我们提供一个Java long类型的时间戳。当然我们也可以在python中直接调用Java的currentTimeMillis方法,不过这里我们就直接用python的time函数做了一下简单的处理。
代码语言:javascript
复制
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”(从文件中读取),就不能换个参数,跳过读取文件这一步,直接从内存中读入数据吗?
代码语言:javascript
复制
# 将二进制的图片写入IO流
f = BytesIO()
f.write(capt_raw.content)

# 查看验证码
capt = Image.open(f)
capt.show()

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

登陆操作

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

查看是否登陆成功

  • 无论身份验证证是否成功,网站都会返回给我们一个页面login_result_html,我们怎么知道自己是否登陆成功了呢?这里我们使用xpath语句查询返还的页面,看看自己的账户名是否在返回值列表中出现了!
  • 由于返还的页面比较简单,所以我这里写的xpath语句也比较随便,要让代码更加稳健,xpath应该更具有唯一性才行。不论如何,能得到我们想要的数据就好。
代码语言:javascript
复制
doc = etree.HTML(login_result_html.text)
doc.xpath("//li/a//*/text()")
登陆结果
登陆结果

登陆子网站

  • 接下来我们将尝试获取子网站(只有通过登陆才能查看)的信息,怎样验证我们成功获取了子网站页面呢?
  • 首先,我在子网站收藏了几份数据(如下图),名称myCollection**都是我自己取的。
我收藏的数据
我收藏的数据
  • 获取子网站,通过正则匹配看看我们收藏的数据是否都在输出列表中!当然这里也可以对收藏的数据进行进一步的操作,我这里就不详述了。
代码语言:javascript
复制
subsite_html = s.get(subsite_url)
re.compile("myCollection\\d+").findall(subsite_html.text)
获取子网站信息
获取子网站信息

退出登陆

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

结语

  • 至此,我们“使用python模拟浏览器实现登陆”的任务总算结束了,登陆验证程序更加复杂的网站也是可以的,不过就是更加细腻的网络流量分析和更加精心的模拟浏览器罢了。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/09/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 载入需要的工具包
  • 初始化信息
  • 建立一个http会话
  • 获取验证码
  • 查看验证码
  • 登陆操作
  • 查看是否登陆成功
  • 登陆子网站
  • 退出登陆
  • 结语
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档