浏览器访问WEB服务器的过程

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

  什么是cookie

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

  为什么需要cookie

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

  比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的,那么我们可以利用Urllib2库保存我们登录的Cookie,然后再抓取其他页面就达到目的了。

  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个数及大小限制是有差异的)。

  urllib与urllib2库的区别

1、为什么它们总是成对出现

  urllib与urllib2都做与url请求相关的操作,但它们提供不同的功能.

  urllib2.urlopen()可以接受一个Request对象或一个url(可以在request对象中设置data,headers等),以实现高级的url请求,但无urlencode功能。  urllib.urlopen()只能接受一个url,所以只能实现简单的url请求,但urllib有urlencode功能。

  urllib.urlencode功能是什么呢?它可以把字典变成url需要的字符串!

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # __author__:kzg
  4. # 要获取数据的url及referer
  5. tUrl = 'http://product.weather.com.cn/alarm/webdata/1012305-20170820132000-0902.html'
  6. reFer = 'http://www.weather.com.cn/alarm/newalarmcontent.shtml?file=1012305-20170820132000-0902.html'
  7. import urllib2
  8. import urllib
  9. # 定义一个request实例
  10. r = urllib2.Request(url=tUrl)
  11. # 给request添加头信息
  12. r.add_header('Referer',reFer)
  13. r.add_header('User-Agent':'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36')
  14. # 给request添加post数据(此时的请求为post,而不再是get)
  15. r.add_data(urllib.urlencode({'name':'kong','age':15}))
  16. # 打印reauest实例中的header和data
  17. print(r.headers)
  18. print(r.data)
  19. 结果:
  20. {'Referer': 'http://www.weather.com.cn/alarm/newalarmcontent.shtml?file=1012305-20170820132000-0902.html', 'User-agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'}
  21. age=15&name=kong

   

2、opener

  urllib2.urlopen: 是opener的一个特殊实例,也是默认的opener,传入的参数较少,仅仅有url,data,timeout,headers等。

  通过阅读源码我们知道,urllib2.urlopen(url)其实也是调用opener.open(url)来请求url,但是默认的opener并不支持cookie.我们可以使用HTTPCookieProcessor来创建一个支持cookie的opener,它需要传入一个cookie容器。

3、cookielib

  cookielib模块的主要作用是:提供一个对象来存储cookie,然后带入urllib2中去访问网站。我们可以利用它的cookiejar类的对象来捕获cookie,并在后续连接请求时自动重新发送,来实现模拟登陆功能。

  该模块主要的对象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。

  它们的关系:CookieJar —-派生—->FileCookieJar —-派生—–>MozillaCookieJar和LWPCookieJar

  实例讲解

  1、自动获取cookie(CookieJar)

  1. #!/usr/bin/env python
  2. # _*_ coding:utf-8 _*_
  3. import urllib
  4. import urllib2
  5. import cookielib
  6.  
  7. loginUrl='http://www.renren.com/PLogin.do'
  8.  
  9. # 创建cookie容器
  10. cj = cookielib.CookieJar()
  11. # 创建支持cookie的opener
  12. handler = urllib2.HTTPCookieProcessor(cj)
  13. opener = urllib2.build_opener(handler)
    urllib2.install_opener(opener)
  14. # 使用此opener来请求url
  15. response = opener.open(loginUrl)
  16. # 查看获取到的cookie
  17. for each in cj:
  18. print each.name,each.value

  2、在自动获取cookie的同时写入到文件中(MozillaCookieJar)

  1. #!/usr/bin/env python
  2. # _*_ coding:utf-8 _*_
  3. import urllib
  4. import urllib2
  5. import cookielib
  6.  
  7. loginUrl='http://www.renren.com/PLogin.do'
  8.  
  9. # 创建cookie容器
  10. cj = cookielib.MozillaCookieJar('cookie.txt')
  11. # 创建支持cookie的opener
  12. handler = urllib2.HTTPCookieProcessor(cj)
  13. opener = urllib2.build_opener(handler)
  14. # 使用此opener请求url
  15. response = opener.open(loginUrl)
  16. #查看获取到的cookie
  17. for each in cj:
  18. print each.name,each.value
    #保存
  19. cj.save(ignore_expires=True,ignore_discard=True)

  此例与上例的不同之处在于使用了MozillaCookieJar,它既有自动获取cookie的功能,又具有与文件的交互。

关于最后save方法的两个参数在此说明一下:

官方解释如下:

  ignore_discard: save even cookies set to be discarded. 
  ignore_expires: save even cookies that have expired.The file is overwritten if it already exists

3、从文件中加载cookie

  1. #!/usr/bin/env python
  2. # _*_ coding:utf-8 _*_
  3. import urllib
  4. import urllib2
  5. import cookielib
  6.  
  7. loginUrl='http://www.renren.com/PLogin.do'
  8. # 创建cookie容器
  9. cj = cookielib.MozillaCookieJar()
  10. cj.load('cookie.txt',ignore_discard=True,ignore_expires=True)
  11. # 创建支持cookie的opener
  12. handler = urllib2.HTTPCookieProcessor(cj)
  13. opener = urllib2.build_opener(handler)
  14. # 使用此opener来请求url
  15. response = opener.open(loginUrl)

  

4、模拟登陆网站(以人人网为例)

准备:要登陆人人网需要哪些信息呢?

  1、登陆地址url

  2、登陆用户名属性

  3、登陆密码属性

如图所示:

要实现的事情:

  使用cookie自动登陆网站,并获取我的主页资料信息。

首先来个截图,预先看看我的主页资料信息的HTML结构吧。

示例代码:

  1. #!/usr/bin/env python
  2. # _*_ coding:utf-8 _*_
  3. import urllib
  4. import urllib2
  5. import cookielib
  6.  
  7. class renren_login(object):
  8. def __init__(self):
  9. self.name = ''
  10. self.pwd = ''
  11. # 设置存储cookie的容器
  12. self.cj = cookielib.CookieJar()
  13. # 使opener支持cookie
  14. self.handler = urllib2.HTTPCookieProcessor(self.cj)
  15. # 创建一个支持cookie的opener
  16. self.opener = urllib2.build_opener(self.handler)
  17. urllib2.install_opener(self.opener)
  18.  
  19. def set_user_pwd(self,username,password):
  20. self.name = username
  21. self.pwd = password
  22.  
  23. def login(self,url):
  24. # 将字典对象编码带到url中
  25. post_data = urllib.urlencode({'email':self.name,'password':self.pwd})
  26. # 简单的反爬
  27. head = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'}
  28. # 将提交信息封装成request对象
  29. req = urllib2.Request(url,data=post_data,headers=head)
  30. # 对request对象发出请求
  31. response = self.opener.open(req)
  32. # 判断url是否跳转
  33. if response.url != url:
  34. return True
  35. else:
  36. return False
  37. exit(1)
  38.  
  39. def get_response(self,url):
  40. # 读取请求到的内容
  41. response = self.opener.open(url).read()
  42. return response
  43.  
  44. if __name__ == '__main__':
  45. #设置网站的登陆信息
  46. LoginUrl = 'http://www.renren.com/PLogin.do'
  47. username = '15201417639'
  48. password = 'kongzhagen.com'
  49. #初始化类
  50. cls = renren_login()
  51. #设置用户名及密码
  52. cls.set_user_pwd(username,password)
  53. #登陆网站:返回主站的地址 http://www.renren.com/913043576,登陆成功
  54. if cls.login(LoginUrl):
  55. # 我的主页资料信息
  56. url='http://follow.renren.com/list/913043576/pub/v7'
  57. ret = cls.get_response(url)
  58. print ret.decode('utf-8')

  

OK,完工啦,把返回的结果ret与上面的主页资料信息的HTML比比看吧。

额,还不成功,我的用户名和密码都改啦,换成你自己的试试!!

  

运用cookie登陆人人网爬取数据的更多相关文章

  1. scrapy实战--登陆人人网爬取个人信息

    今天把scrapy的文档研究了一下,感觉有点手痒,就写点东西留点念想吧,也做为备忘录.随意写写,看到的朋友觉得不好,不要喷我哈. 创建scrapy工程 cd C:\Spider_dev\app\scr ...

  2. python模拟浏览器爬取数据

    爬虫新手大坑:爬取数据的时候一定要设置header伪装成浏览器!!!! 在爬取某财经网站数据时由于没有设置Header信息,直接被封掉了ip 后来设置了Accept.Connection.User-A ...

  3. 模拟登陆并爬取Github

    因为崔前辈给出的代码运行有误,略作修改和简化了. 书上例题,不做介绍. import requests from lxml import etree class Login(object): def ...

  4. 如何提升scrapy爬取数据的效率

    在配置文件中修改相关参数: 增加并发 默认的scrapy开启的并发线程为32个,可以适当的进行增加,再配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100. ...

  5. 爬虫必知必会(6)_提升scrapy框架爬取数据的效率之配置篇

    如何提升scrapy爬取数据的效率:只需要将如下五个步骤配置在配置文件中即可 增加并发:默认scrapy开启的并发线程为32个,可以适当进行增加.在settings配置文件中修改CONCURRENT_ ...

  6. Python使用Scrapy框架爬取数据存入CSV文件(Python爬虫实战4)

    1. Scrapy框架 Scrapy是python下实现爬虫功能的框架,能够将数据解析.数据处理.数据存储合为一体功能的爬虫框架. 2. Scrapy安装 1. 安装依赖包 yum install g ...

  7. 借助Chrome和插件爬取数据

    工具 Chrome浏览器 TamperMonkey ReRes Chrome浏览器 chrome浏览器是目前最受欢迎的浏览器,没有之一,它兼容大部分的w3c标准和ecma标准,对于前端工程师在开发过程 ...

  8. web scraper——简单的爬取数据【二】

    web scraper——安装[一] 在上文中我们已经安装好了web scraper现在我们来进行简单的爬取,就来爬取百度的实时热点吧. http://top.baidu.com/buzz?b=1&a ...

  9. 关于js渲染网页时爬取数据的思路和全过程(附源码)

    于js渲染网页时爬取数据的思路 首先可以先去用requests库访问url来测试一下能不能拿到数据,如果能拿到那么就是一个普通的网页,如果出现403类的错误代码可以在requests.get()方法里 ...

随机推荐

  1. linux常用命令6:关机重启命令

    关机重启命令 1.shutdown命令 shutdown [选项] 时间 选项: -c 取消前一个关机命令 -h 关机 -r 重启 2.其他关机命令 halt poweroff init  0 3.其 ...

  2. IndexOf() LastIndexOf() Contains() StartsWith() EndsWith()方法比较

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  3. 一个Android Socket的例子

    1.开篇简介 Socket本质上就是Java封装了传输层上的TCP协议(注:UDP用的是DatagramSocket类).要实现Socket的传输,需要构建客户端和服务器端.另外,传输的数据可以是字符 ...

  4. Android动态Java代码调整window大小

    Android调整window大小 举一个例子,设置当前的APP所需要的屏幕高度为设备高度的一半: Window window = getActivity().getWindow(); WindowM ...

  5. Js验证userAgent是否来自手机端

    function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&] ...

  6. bzoj4034 (树链剖分+线段树)

    Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...

  7. NSData和NSString 、 NSFileManager

    1 NSData和NSMutableData的基本使用 1.1 问题 NSData类是IOS提供的用于以二进制的形式操作文件数据的类,NSData有两个常用的属性length和bytes,length ...

  8. js实现元素添加样式

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. ubuntu基本配置

    新系统装好后的操作: 1.resource updata:服务器镜像地址选择 2.删除不必要软件: 2.1:libreoffice sudo apt-get remove libreoffice-co ...

  10. Codeforces Round #366 (Div. 2) B 猜

    B. Spider Man time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...