有些网站设置了权限,只有在登录了之后才能爬取网站的内容,如何模拟登录,目前的方法主要是利用浏览器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。 
[python] view plain copy
  1. #! /usr/bin/env python
  2. #coding:utf-8
  3. import sys
  4. import re
  5. import urllib2
  6. import urllib
  7. import requests
  8. import cookielib
  9. ## 这段代码是用于解决中文报错的问题
  10. reload(sys)
  11. sys.setdefaultencoding("utf8")
  12. #####################################################
  13. #登录人人
  14. loginurl = 'http://www.renren.com/PLogin.do'
  15. logindomain = 'renren.com'
  16. class Login(object):
  17. def __init__(self):
  18. self.name = ''
  19. self.passwprd = ''
  20. self.domain = ''
  21. self.cj = cookielib.LWPCookieJar()
  22. self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj))
  23. urllib2.install_opener(self.opener)
  24. def setLoginInfo(self,username,password,domain):
  25. '''''设置用户登录信息'''
  26. self.name = username
  27. self.pwd = password
  28. self.domain = domain
  29. def login(self):
  30. '''''登录网站'''
  31. loginparams = {'domain':self.domain,'email':self.name, 'password':self.pwd}
  32. headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36'}
  33. req = urllib2.Request(loginurl, urllib.urlencode(loginparams),headers=headers)
  34. response = urllib2.urlopen(req)
  35. self.operate = self.opener.open(req)
  36. thePage = response.read()
  37. if __name__ == '__main__':
  38. userlogin = Login()
  39. username = 'username'
  40. password = 'password'
  41. domain = logindomain
  42. userlogin.setLoginInfo(username,password,domain)
  43. userlogin.login()

转载于:https://www.cnblogs.com/abc8023/p/8669786.html

《转载》python爬虫实践之模拟登录相关推荐

  1. Python 爬虫实战5 模拟登录淘宝并获取所有订单

    经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 本篇内容 python模拟登录淘宝网页 获取登录用户的所有订单详情 ...

  2. python爬虫实现豆瓣模拟登录

    这是豆瓣登录界面URL https://www.douban.com/accounts/login 用pychrm编写爬虫代码 import requests url = 'https://www.d ...

  3. python爬虫(四)——模拟登录丁香园

    实战 实战小项目:模拟登录丁香园,抓取论坛页面人员基本信息与回复帖子.丁香园论坛:http://www.dxy.cn/bbs/thread/626626#626626 思路 首先把登陆方式由扫码切换为 ...

  4. python爬虫4.1模拟登录古诗词网并通过Cookie处理获取个人信息

    1.前言 好久没有写过笔记了....本来这节内容是模拟登录人人网,但是人人网现在无法注册了...就换了家网站.这个代码是可以模拟登录古诗词网,进入登录成功后跳转的页面后,再进入个人收藏界面,获取个人收 ...

  5. Python爬虫实战:模拟登录淘宝网站

    前言 在完成爬虫任务的时候,我们总是会遇到用户账号登陆的问题,如果自己手动登陆的话,那么工作量就很大了,如何解决登陆问题呢? 今天老师带领大家使用selenium完成淘宝账号登陆 本篇文章知识点: s ...

  6. python爬虫学习之模拟登录淘宝

    使用教程 下载chrome浏览器 查看chrome浏览器的版本号,对应版本号的chromedriver驱动 pip安装下列包 pip install selenium 登录微博,并通过微博绑定淘宝账号 ...

  7. 【Python爬虫】:模拟登录QQ空间

    观察了下QQ空间实在是太好登录了!只需要首先点击账号密码登录,然后输入你的账号和密码就可以了! 其中需要注意的是; 1.进行第一次点击的时候,点击"账号密码"的时候,需要首先切换到 ...

  8. Python爬虫实践-网易云音乐

    1.前言 最近,网易的音乐很多听不到了,刚好也看到很多教程,跟进学习了一下,也集大全了吧,本来想优化一下的,但是发现问题还是有点复杂,最后另辟捷径,提供了简单的方法啊! 本文主要参考 python编写 ...

  9. Python 爬虫实战,模拟登陆爬取数据

    Python 爬虫实战,模拟登陆爬取数据 从0记录爬取某网站上的资源连接: 模拟登陆 爬取数据 保存到本地 结果演示: 源网站展示: 爬到的本地文件展示: 环境准备: python环境安装 略 安装r ...

  10. python爬虫初学实战——免登录爬取easyicon里的vip图标(2)

    python爬虫初学实战-免登录爬取easyicon里的vip图标(2) 实验日期:2020-08-09 tips:没看过前面(1)的可以康康,指路 -> 爬取easyicon里的png图标 成 ...

最新文章

  1. SCCM 2012 R2---安装SCCM 2012 R2
  2. fastjson将json字符串转为Map对象,拿走不谢
  3. 010_JMS消息选择器
  4. Keil编译报错:Cannot open include file: 'stdbool.h': No such file or directory问题解决
  5. 一分钟理清Mysql的锁类型——《深究Mysql锁》
  6. 《R数据可视化手册》一1.4 从Excel文件中加载数据
  7. 痞子衡嵌入式:开启NXP-MCUBootUtility工具的BEE加密功能 - image_enc
  8. 看动画轻松理解时间复杂度(一)
  9. Elasticsearch 自定义分析器Analyzer
  10. mysql取消外键限制_mysql怎么取消外键限制(约束)?
  11. linux系统管理学习笔记之八---linux文件与目录的管理及权限
  12. 什么是挂载?mount的用处在哪?
  13. Exchange 2013CU17和office 365混合部署-配置SSO(七)
  14. cad电气工程量计算机,CAD电气管线快速算量方法
  15. 无线通信设备安装工程概预算编制_安装造价工程 电气安装预算编制
  16. matlab画图plot以及自动保存图像
  17. FastDB 磁盘和无盘模式
  18. -XX:MaxDirectMemorySize直接内存无效问题
  19. 微信公众号服务器搭建
  20. 【干货】Kaggle数据挖掘比赛经验分享,陈成龙博士整理!

热门文章

  1. BT.601与BT.656
  2. 国外免费服务器 win系统,FreeSSHd一个免费的SSH服务器的Windows | MOS86
  3. 计算机科学素养大赛,第六届全国大学生计算机应用能力与信息素养大赛圆满结束...
  4. Unknown initial character set index ‘255‘ received from server.
  5. C语言:计算1*2*3*....*100,即求100!。
  6. 计算机电竞方向,关于电竞专业的就业方向
  7. 享元模式在 Java Integer 中的应用
  8. 神经网络全连接层详解
  9. c#文件分割与合并 part 1 (转自互联网)
  10. Nginx1.10编译安装