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

python自动登陆网页原理

有些网站设置了权限,只有在登录了之后才能爬取网站的内容,如何模拟登录,目前的方法主要是利用浏览器cookie模拟登录。浏览器访问服务器的过程在用户访问网页时,不论是通过URL输入域名或I

有些网站设置了权限,只有在登录了之后才能爬取网站的内容,如何模拟登录,目前的方法主要是利用浏览器COOKIE模拟登录。 

浏览器访问服务器的过程


在用户访问网页时,不论是通过URL输入域名或IP,还是点击链接,浏览器向WEB服务器发出了一个HTTP请求(Http Request),WEB服务器接收到客户端浏览器的请求之后,响应客户端的请求,发回相应的响应信息(Http Response),浏览器解析引擎,排版引擎分析返回的内容,呈现给用户。WEB应用程序在于服务器交互的过程中,HTTP请求和响应时发送的都是一个消息结构。 

\



Http消息


当浏览器向服务器发送请求的时候,发出http请求消息报文,服务器返回数据时,发出http响应消息报文,这两种类型的消息都是由一个起始行,消息头,一个指示消息头结束的空行和可选的消息体组成。http请求消息中,起始行包括请求方法,请求的资源, HTTP协议的版本号,消息头包含各种属性,消息体包含数据,GET请求并没有消息主体,因此在消息头后的空白行中没有其他数据。Http响应消息中,起始行包括HTTP协议版本,http状态码和状态,消息头包含各种属性,消息体包含服务器返回的数据内容。 
\

如下图从fiddler抓取的http请求和http响应,GET请求内容为空,故消息头之后的空行和消息体都为空。 
\

服务器发送的响应消息如下,浏览器正常接收到服务器发回的http报文 \
\

从上可以看到,COOKIE在http请求和http响应的头信息中,COOKIE是消息头的一种很重要的属性。 

什么是COOKIE?

   当用户通过浏览器首次访问一个域名时,访问的WEB服务器会给客户端发送数据,以保持WEB服务器与客户端之间的状态保持,这些数据就是COOKIE,它是 Internet 站点创建的 ,为了辨别用户身份而储存在用户本地终端上的数据,COOKIE中的信息一般都是经过加密的,COOKIE存在缓存中或者硬盘中,在硬盘中的是一些小文本文件,当你访问该网站时,就会读取对应网站的COOKIE信息,COOKIE有效地提升了我们的上网体验。一般而言,一旦将 COOKIE 保存在计算机上,则只有创建该 COOKIE 的网站才能读取它。 
\

为什么需要COOKIE


Http协议是一个无状态的面向连接的协议,Http协议是基于tcp/ip协议层之上的协议,当客户端与服务器建立连接之后,它们之间的TCP连接一直都是保持的,至于保持的时间是多久,是通过服务器端来设置的,当客户端再一次访问该服务器时,会继续使用上一次建立的连接,但是,由于Http协议是无状态的,WEB服务器并不知道这两个请求是否同一个客户端,这两次请求之间是独立的。 为了解决这个问题, Web程序引入了COOKIE机制来维护状态.COOKIE可以记录用户的登录状态,通常web服务器会在用户登录成功后下发一个签名来标记session的有效性,这样免去了用户多次认证和登录网站。记录用户的访问状态。 

COOKIE的种类


会话COOKIE(Session COOKIE):这个类型的COOKIE只在会话期间内有效,保存在浏览器的缓存之中,用户访问网站时,会话COOKIE被创建,当关闭浏览器的时候,它会被浏览器删除。 持久COOKIE(Persistent COOKIE): 这个类型的COOKIE长期在用户会话中生效。当你设置COOKIE的属性Max-Age为1个月的话,那么在这个月里每个相关URL的http请求中都会带有这个COOKIE。所以它可以记录很多用户初始化或自定义化的信息,比如什么时候第一次登录及弱登录态等。 Secure COOKIE:安全COOKIE是在https访问下的COOKIE形态,以确保COOKIE在从客户端传递到Server的过程中始终加密的。 HttpOnly COOKIE :这个类型的COOKIE只能在http(https)请求上传递,对客户端脚本语言无效,从而有效避免了跨站攻击。 第三方COOKIE: 第一方COOKIE是当前访问的域名或子域名下的生成的COOKIE。 第三方COOKIE:第三方COOKIE是第三方域名创建的COOKIE。 

COOKIE的构成


COOKIE是http消息头中的一种属性,包括:COOKIE名字(Name)COOKIE的值(Value),COOKIE的过期时间(Expires / Max-Age),COOKIE作用路径(Path),COOKIE所在域名(Domain),使用COOKIE进行安全连接(Secure)。 前两个参数是COOKIE应用的必要条件,另外,还包括COOKIE大小(Size,不同浏览器对COOKIE个数及大小限制是有差异的)。 

python模拟登录


设置一个COOKIE处理对象,它负责 将COOKIE添加到http请求中,并能从http响应中得到COOKIE , 向网站登录页面发送一个请求Request, 包括登录url,POST请求的数据,Http header 利用urllib2.urlopen发送请求,接收WEB服务器的Response。 首先我们查看登陆页面源码 
\

当我们使用urllib处理url的时候,实际上是通过urllib2.OpenerDirector实例进行工作,他会自己调用资源进行各种操作如通过协议、打开url、处理COOKIE等。而urlopen方法使用的是默认的opener来处理问题,基本的urlopen()函数不支持验证、COOKIE或其他的HTTP高级功能。要支持这些功能,必须使用build_opener()函数来创建自己的自定义Opener对象。 
COOKIElib模块定义了自动处理HTTP COOKIEs的类,用来访问那些需要COOKIE数据的网站,COOKIElib模块包括COOKIEJar,FileCOOKIEJar,COOKIEPolicy,DefaultCOOKIEPolicy,COOKIE及FileCOOKIEJar的子类MozillaCOOKIEJar和LWPCOOKIEJar,COOKIEJar对象可以管理HTTP COOKIEs,将COOKIE添加到http请求中,并能从http响应中得到COOKIE,FileCOOKIEJar对象主要是从文件中读取COOKIE或创建COOKIE,其中,MozillaCOOKIEJar是为了创建与Mozilla浏览器COOKIEs.txt兼容的FileCOOKIEJar实例,LWPCOOKIEJar是为了创建与libwww-perl的Set-COOKIE3文件格式兼容的FileCOOKIEJar实例,用LWPCOOKIEJar保存的COOKIE文件易于人类阅读。默认的是FileCOOKIEJar没有save函数,而MozillaCOOKIEJar或LWPCOOKIEJar都已经实现了。 所以可以用MozillaCOOKIEJar或LWPCOOKIEJar,去自动实现COOKIE的save。

示例:

#! /usr/bin/env python#coding:utf-8
 
import sys
import re
import urllib2
import urllib
import requests
import COOKIElib
 
## 这段代码是用于解决中文报错的问题  
reload(sys)  
sys.setdefaultencoding("utf8")  
#####################################################
#登录人人
loginurl = 'http://www.renren.com/PLogin.do'
logindomain = 'renren.com'
 
class Login(object):
     
    def __init__(self):
        self.name = ''
        self.passwprd = ''
        self.domain = ''
 
        self.cj = COOKIElib.LWPCOOKIEJar()            
        self.opener = urllib2.build_opener(urllib2.HTTPCOOKIEProcessor(self.cj)) 
        urllib2.install_opener(self.opener)    
     
    def setLoginInfo(self,username,password,domain):
        '''设置用户登录信息'''
        self.name = username
        self.pwd = password
        self.domain = domain
 
    def login(self):
        '''登录网站'''
        loginparams = {'domain':self.domain,'email':self.name, 'password':self.pwd}
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36'}
        req = urllib2.Request(loginurl, urllib.urlencode(loginparams),headers=headers)  
        response = urllib2.urlopen(req)
        self.operate = self.opener.open(req)
        thePage = response.read()        
         
if __name__ == '__main__':   
    userlogin = Login()
    username = 'username'
    password = 'password'
    domain = logindomain
    userlogin.setLoginInfo(username,password,domain)
    userlogin.login()




推荐阅读
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
author-avatar
强毛
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有