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())
碎碎念
流程三步走:
- 打开登录页,获取
cookie
和验证信息(正则匹配的lt
、execution
和_eventId
)。 - 模拟点击登录按钮,这一步需要构造登录表单完整数据,而且要加上
User-Agent
。 - 验证通过之后,就可以打开各种页面了~
最后几行使用了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并解析返回数据的主要内容,如果未能解决你的问题,请参考以下文章
Python模拟登录上海西南某高校校园网 (jaccount)
用python模拟登录(解析cookie + 解析html + 表单提交 + 验证码识别 + excel读写 + 发送邮件)
Python爬虫初探 - selenium+beautifulsoup4+chromedriver爬取需要登录的网页信息