Python 模拟登录某SDN并解析返回数据

Posted 一口仨馍

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 模拟登录某SDN并解析返回数据相关的知识,希望对你有一定的参考价值。

#!/usr/bin/python
# -*- coding: UTF-8 -*- 

# CSDN 一口仨馍 Python3.5
from urllib import request, parse
from http import cookiejar
from bs4 import BeautifulSoup
import re

CODE_MODE = 'UTF-8'
# 某SDN登陆页
LOGIN_URL = 'https://passport.*sdn.net'
# 某SDN个人主页
PERSON_HOME_URL = 'http://my.*sdn.net/my/my*sdn'
LOGIN_FILE_NAME = 'login.html'
PERSON_HOME_FILE_NAME = 'personHome.html'


def writeFile(contentStr, fileName):
    with open(fileName, 'w', encoding=CODE_MODE) as file:
        file.write(contentStr)


def getValueByName(name):
    return re.compile(r'name="'+name+'" value="(.*?)"').search(loginResponseStr).group(1)


def openWeb(opener, url, postData=):
    # 将postData转成bytes形式
    post_data = parse.urlencode(postData).encode(encoding=CODE_MODE)
    # 打开url,并读取url对应返回数据
    response = opener.open(url, data=post_data).read().decode(CODE_MODE)
    print(response)
    return response
# 构造Cookie
cookieProc = request.HTTPCookieProcessor(cookiejar.CookieJar())
opener = request.build_opener(cookieProc)
# 读取登陆页信息,并返回Cookie
loginResponseStr = openWeb(opener, LOGIN_URL)
# 响应数据保存在本地
writeFile(loginResponseStr, LOGIN_FILE_NAME)
# 正则获取某SDN返回的验证信息
ltValue = getValueByName('lt')
executionValeu = getValueByName('execution')
_eventIdValue = getValueByName('_eventId')
# 构造post参数
postData = 
    'username': '******',
    'password': '******',
    'lt': ltValue,
    'execution': executionValeu,
    '_eventId': _eventIdValue,

# 构造请求Header
opener.addheaders = [
    # 发起最初请求页面
    ('Origin', LOGIN_URL),
    # 浏览器标识
    ('User-Agent',
     'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'),
]
# 真正模拟登陆(带参数)
openWeb(opener, LOGIN_URL, postData)
# 打开个人主页
homeResponseStr = openWeb(opener, PERSON_HOME_URL)
# 响应数据保存在本地
writeFile(homeResponseStr, PERSON_HOME_FILE_NAME)
# 使用html5lib库解析
soup = BeautifulSoup(homeResponseStr, "html5lib")
nickName = soup.find('div', class_='phrf_name').contents[0].contents[0].string
# nickName = soup.select("[class~=phrf_name]")[0].contents[0].contents[0].string
print(nickName)
print(soup.prettify())

碎碎念

流程三步走:

  1. 打开登录页,获取cookie和验证信息(正则匹配的ltexecution_eventId)。
  2. 模拟点击登录按钮,这一步需要构造登录表单完整数据,而且要加上User-Agent
  3. 验证通过之后,就可以打开各种页面了~

最后几行使用了BeautifulSoup来解析数据,这里以获取昵称为例。目标代码段如下:

<div class="phrf_name"><span><a href="/******" target=_blank>一口仨馍</a></span</div>

BeautifulSoup提供了类似jQuery的语言来解析HTML文档,android里有个JSoup,不晓得这俩谁先谁后,但是感觉这俩从名称到功能,真的是非常相似。如果恰好你了解jQuery或者JSoup,应该相对容易理解一些。不过不会也没关系,反正也挺简单。更多BeautifulSoup语法:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/

写在末尾

最近总是能听见Python俩字,抱着试试看的心态,学了几天Python。感觉Python真的好简洁,几十行代码居然能做那么多事。对我这种懒人,真的是太方便了!But,毕竟Python新手上路,文中有些不准确甚至错误的观点还请老司机多多包涵,指点迷津~

以上是关于Python 模拟登录某SDN并解析返回数据的主要内容,如果未能解决你的问题,请参考以下文章

Yapi平台之Mock服务

Python模拟登录上海西南某高校校园网 (jaccount)

软件定义网络基础---SDN数据平面

软件定义网络基础---SDN数据平面

用python模拟登录(解析cookie + 解析html + 表单提交 + 验证码识别 + excel读写 + 发送邮件)

Python爬虫初探 - selenium+beautifulsoup4+chromedriver爬取需要登录的网页信息