热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:Python模拟登陆练习——imooc.com登陆

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python模拟登陆练习——imooc.com登陆相关的知识,希望对你有一定的参考价值。写下这篇文章的时候

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python模拟登陆练习——imooc.com登陆相关的知识,希望对你有一定的参考价值。


写下这篇文章的时候,是博主学习python的第三天( 也许是第四天:( ),python是博主接触的第二门解释型语言(第一门是Javascript)。

讲真在很久之前就想要用博客记录自己的学习历程了,然而就像写日记一样,写着写着就放弃了-。-

so今天决定给自己一个好的开端~

博主的学习方式是直奔目的,遇到问题百度各种博客,网站,百度找不到google找,就这样。这种学习方式是真的见效快,但显而易见,基础会比较薄弱。

因此学习python的基本语法,就直奔爬虫了!

-----------------------------------以上是一段大前言---------------------------------------------

今天博主要把三天学习spider的过程,经验分享出来,希望能给一些新手们指点一下道路,也给自己的python生涯刻一道痕迹。

博主愚以为,模拟登陆网站无非有两种方式:



  1. 一是手动收取COOKIE。

    在浏览器登陆网站并完成登录后,然后打开开发者工具,随便访问某页面,根据实际情况找一条request,把COOKIE复制下来。



  2. 二是python收取COOKIE。

    这也是本篇文章详细阐述的。见下。



现在让博主以imooc.com为例讲解一下网站的模拟登陆


 开始

博主习惯用urllib2+COOKIElib的方式写爬虫,所以代码的一开始是这样的:


#coding=utf8
import sys
reload(sys)
sys.setdefaultencoding(
utf8)
import urllib2
import urllib
import COOKIElib
#以上是套路
#
以下创建一个COOKIEjar管理COOKIE,同时创建opener并安装到urllib2中
cj = COOKIElib.COOKIEJar()
opener
= urllib2.build_opener(urllib2.HTTPCOOKIEProcessor(cj))
urllib2.install_opener(opener)
opener.addheaders
=[(user-agent,Mozilla/5.0)]

 

opener.addheaders可以以list的形式添加header,非常方便


 然后

COOKIE是一种服务器记录用户信息的小文件,尽管有时候会侵犯大家的隐私,但是在存储用户的登录信息实现自动登陆的方式还是很方便的。

它的工作流程是这样的:



  1. 首先服务器会在第一次访问网站时向浏览器返回一个response,其中会有几条set-COOKIE的信息,于是浏览器默默帮你把它记录到COOKIE中去

  2. 当你点击登陆,输入用户名、密码等必要信息后,浏览器会将你的信息连同以上COOKIEs中的某些一并post给服务器

  3. 登陆成功后浏览器又收到服务器的悄悄话——得到几条重要COOKIE并保存下来

  4. 如果此时你没关闭浏览器,在访问该网站其他页面时,浏览器会把某些COOKIE发送给服务器,这时候你发现你已经自动登录了

  5. 如果登陆时你选择了“自动登录”“7天内自动登陆”诸如此类checkbox,浏览器还会得到一些长久的COOKIE(十天半个月的)以便你明天登陆,后天登陆。。。。

了解COOKIE的工作原理后,我们访问一下主页,把COOKIE搞下来


博主是这样写的:


#先写下几条url
url_login = http://www.imooc.com/passport/user/login
url_index
= http://www.imooc.com
url_test
= http://www.imooc.com/user/setbindsns
data
= {
username:*********,
password:*******,
verify:‘‘,
remember:1,
pwencode:0,
referer:http://www.imooc.com
}
data_encoded
= urllib.urlencode(data)
#get主页获取COOKIE
req_index = urllib2.Request(url_index)
res_index
= opener.open(req_index)

我们可以打印下COOKIE看看:


print cj._COOKIEs

 


 {‘www.imooc.com‘: {‘/‘: {‘PHPSESSID‘: COOKIE(version=0, name=‘PHPSESSID‘, value=‘3q1c66hds4h054f19ciqb4rtg2‘, port=None, port_specified=False, domain=‘www.imooc.com‘, domain_specified=False, domain_initial_dot=False, path=‘/‘, path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={}, rfc2109=False)}}, ‘.imooc.com‘: {‘/‘: {‘imooc_isnew_ct‘: COOKIE(version=0, name=‘imooc_isnew_ct‘, value=‘1486280759‘, port=None, port_specified=False, domain=‘.imooc.com‘, domain_specified=True, domain_initial_dot=True, path=‘/‘, path_specified=True, secure=False, expires=1517816759, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False), ‘cvde‘: COOKIE(version=0, name=‘cvde‘, value=‘5896d8376631d-1‘, port=None, port_specified=False, domain=‘.imooc.com‘, domain_specified=True, domain_initial_dot=True, path=‘/‘, path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={}, rfc2109=False), ‘imooc_isnew‘: COOKIE(version=0, name=‘imooc_isnew‘, value=‘1‘, port=None, port_specified=False, domain=‘.imooc.com‘, domain_specified=True, domain_initial_dot=True, path=‘/‘, path_specified=True, secure=False, expires=1517816759, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False), ‘imooc_uuid‘: COOKIE(version=0, name=‘imooc_uuid‘, value=‘d6a73549-4d53-47b6-90bc-28888d3438b8‘, port=None, port_specified=False, domain=‘.imooc.com‘, domain_specified=True, domain_initial_dot=True, path=‘/‘, path_specified=True, secure=False, expires=1517816759, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False)}}}

这是什么,我不知道。Let it go.


然后

那我们带着COOKIE去登陆吧!不知道带哪一条?全带走!


req_login = urllib2.Request(url_login,data_encoded)
res_login
= opener.open(req_login)

 

我们试着把结果打印在html上:


imooc = open(e:/imooc.html,w)
imooc.write(res_login.read())
imooc.close()

 当我们打开: 技术分享

 这TM好像不是个html,通常情况下他会返回一个html,然而这串符号难住了学了3天python的小白。

注意到一条信息: “msg” : "\\u6210\\u529f"显然是unicode格式的字符串,简单转化后,他的意思是 :“成功” 

博主窃喜。既然成功了,那么有效信息一定存在于这串符号中。 

到此,正确的思路是,拿着这2条url,uid用开发者工具继续搜索相关信息。

。。

然而博主走了一条小弯路。


逆向分析大法

博主决定把登陆之后的COOKIEs复制下来,逐条测试登陆需要的COOKIE

很简单,一条一条的删,看什么时候能登陆就好了。。。

。。。。

经过筛选,博主找到2条我们需要的COOKIE:loginstate、apsid。

于是博主决定在近百条COOKIE中找一下apsid这条信息

。。。

找到了!

技术分享

 

而访问的url就是我们得到的2条之一!只是带了几个参数

实践证明这2条随便选一条get一下就得到我们需要的COOKIE了。


窃喜

我们需要3个参数:token(url已经附带)、callback、 _(下划线-。-)

经验证 ,callback参数是固定值。

好的,那我们搜索一下下划线的值。

查下COOKIE,发现它是imooc_isnew_ct的值

到这里基本已经大功告成了~

全部代码:


#coding=utf8
#
最后版本
import sys
reload(sys)
sys.setdefaultencoding(
utf8)
import urllib2
import urllib
import COOKIElib
cj
= COOKIElib.COOKIEJar()
opener
= urllib2.build_opener(urllib2.HTTPCOOKIEProcessor(cj))
urllib2.install_opener(opener)
opener.addheaders
=[(user-agent,Mozilla/5.0)]
url_login
= http://www.imooc.com/passport/user/login
url_index
= http://www.imooc.com
url_test
= http://www.imooc.com/user/setbindsns
data
= {
username:13153154784,
password:liuweidong,
verify:‘‘,
remember:1,
pwencode:0,
referer:http://www.imooc.com
}
data_encoded
= urllib.urlencode(data)
#get主页获取COOKIE
req_index = urllib2.Request(url_index)
res_index
= opener.open(req_index)
print cj._COOKIEs
print
#post登陆页面
req_login = urllib2.Request(url_login,data_encoded)
res_login
= opener.open(req_login)
print res_login.read()
res_dict
= eval(res_login.read())
url_ssologin
= res_dict[data][url][0]
print url_ssologin
import re
url_ssologin
= re.sub(r\\\\/,/,url_ssologin)
print url_ssologin
params
= {
callback:jQuery19106404770042720387_1486274878204,
_: str(cj._COOKIEs[.imooc.com][/][imooc_isnew_ct])[23:33]
}
url_ssologin
= url_ssologin+&+urllib.urlencode(params)
#sso登陆页面
req_sso = urllib2.Request(url_ssologin)
res_sso
= opener.open(req_sso)
# print res_sso.read()
#
print cj._COOKIEs[‘.imooc.com‘][‘/‘][‘loginstate‘]

req_test
= urllib2.Request(url_test)
res_test
= opener.open(req_test)
imooc
= open(c:/users/asus/desktop/imooc.html,w)
imooc.write(res_test.read())
imooc.close()

 

博主其实遇到了好多问题,走了好多弯路,感谢某dalao的无私帮助:)

第一次写博客,欢迎技术交流与指正~

 


推荐阅读
  • Question该提问来源于开源项目:react-native-device-info/react-native-device-info ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • .NetCoreWebApi生成Swagger接口文档的使用方法
    本文介绍了使用.NetCoreWebApi生成Swagger接口文档的方法,并详细说明了Swagger的定义和功能。通过使用Swagger,可以实现接口和服务的可视化,方便测试人员进行接口测试。同时,还提供了Github链接和具体的步骤,包括创建WebApi工程、引入swagger的包、配置XML文档文件和跨域处理。通过本文,读者可以了解到如何使用Swagger生成接口文档,并加深对Swagger的理解。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
author-avatar
Toby_魚5902
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有