python爬虫之urllib库(三)
python爬虫之urllib库(三)
urllib库
访问网页都是通过HTTP协议进行的,而HTTP协议是一种无状态的协议,即记不住来者何人。举个栗子,天猫上买东西,需要先登录天猫账号进入主页,再去选择商品。HTTP的无状态性表现在,登录账号以后进入主页,再进入商品页面的时候,你又必须重新登录。这就是HTTP协议的无状态性,你通过HTTP发送请求,服务器接收的当前请求,处理后让你进入主页,当你选择商品要进入商品页面的时候,服务器就又不认识你是谁了,只会问:来者何人?来,登录表单再发你,填吧。那现在根本不是我说的这种情况,现在我打开天猫,登录一次到shopping完成,都没有再次login,这说明了存在某种东西在帮助HTTP记着来者的身份,某种东西就是Cookie+Session或者Token!
Session
当客户端向服务器发送登录HTTP请求时,服务器会使用Session把用户信息临时保存在服务器端,保存的同时会生成一个身份标识,即SessionID。服务器把SessionID发给客户端,告诉客户端:“这段时间这就是你来我这儿的门卡”,客户端保存着它的门卡,后面每一次请求都带着“门卡”访问服务器,服务器也通过“门卡”记住了客户端。用户注销了网站登录,那Session自然也会销毁了。
Cookie
当客户端向服务器发送登录HTTP请求时,服务器会在HTTP响应头headers中设置Set-Cookie首部信息,服务器的意思就是告诉客户端:“你按照一定规范把你用户信息保存在你那吧,以后再来我这儿带给我看你存的东西就成了”,客户端接收HTTP响应以后,看到服务器在响应中的Set-Cookie信息,明白了服务器的意思,以文本形式保存了用户信息等,在以后的每一次请求中,客户端发送的HTTP请求都会在headers中添加Cookie首部信息,告诉服务器我是带着我的用户信息来的,那自然服务器就记住了客户端。
Cookie+Session
前面提到了Session中会产生一个SessionID来作为身份验证,Session会把用户信息保存在服务器;Cookie是把用户信息保存在客户端,以Cookie保存的用户信息作为身份验证。Cookie+Session就是Cookie在客户端保存的不再是用户信息那么大的数据了,只保存SessionID,以后Cookie就带着SessionID去访问服务器就OK。从客户端和服务端来说是减轻了客户端的压力。
Token
当客户端向服务器发送登录HTTP请求,服务器会把用户信息生成一个Token,并且使用加密算法为Token生成一个签名,然后把带签名的Token信息发送给客户端保存起来。客户端后面的请求都会在HTTP请求headers中加上Token信息,服务器接收到以后先解密Token的签名,然后就记住了客户端。
Cookiejar
为爬虫添加Cookie是为了使爬取网站内多个网页内容时,可以保持登录状态持续爬取。python2中使用Cookielib库添加Cookie,而python3使用Cookiejar处理。
不使用Cookie的情况
import urllib.request
import urllib.parse url = 'https://www.yaozh.com/login'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36'
}
data = {
'username': 'snow_1',
'pwd': 'bushizhendemima'
}
post_data = urllib.parse.urlencode(data).encode('utf-8') req = urllib.request.Request(url, data=post_data,headers=headers)
rep = urllib.request.urlopen(req).read()
with open('1.html', 'wb') as f:
f.write(rep) url_next = 'https://www.yaozh.com/' req_next = urllib.request.Request(url, data=post_data,headers=headers)
rep_next = urllib.request.urlopen(req_next).read()
with open('2.html', 'wb') as f:
f.write(rep_next)
使用Cookie的情况
import urllib.request
import urllib.parse
import http.cookiejar url = 'https://www.yaozh.com/login'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36'
}
data = {
'username': 'snow_1',
'pwd': 'bushizhendemima'
}
post_data = urllib.parse.urlencode(data).encode('utf-8') req = urllib.request.Request(url, data=post_data,headers=headers)
cookie = http.cookiejar.CookieJar() # 实例CookieJar对象
processor = urllib.request.HTTPCookieProcessor(cookie) # 创建cookie处理器
opener = urllib.request.build_opener(processor) # 构建opener对象
urllib.request.install_opener(opener) # 安装openner为全局 rep = opener.open(req).read()
with open('1.html', 'wb') as f:
f.write(rep) url_next = 'https://www.yaozh.com/' rep_next = urllib.request.urlopen(url_next).read()
with open('2.html', 'wb') as f:
f.write(rep_next)
使用Cookie就不需要在多次请求都添加数据,即Request类的data属性。
python爬虫之urllib库(三)的更多相关文章
- python爬虫之urllib库(一)
python爬虫之urllib库(一) urllib库 urllib库是python提供的一种用于操作URL的模块,python2中是urllib和urllib2两个库文件,python3中整合在了u ...
- python爬虫之urllib库(二)
python爬虫之urllib库(二) urllib库 超时设置 网页长时间无法响应的,系统会判断网页超时,无法打开网页.对于爬虫而言,我们作为网页的访问者,不能一直等着服务器给我们返回错误信息,耗费 ...
- python 爬虫之 urllib库
文章更新于:2020-03-02 注:代码来自老师授课用样例. 一.初识 urllib 库 在 python2.x 版本,urllib 与urllib2 是两个库,在 python3.x 版本,二者合 ...
- python爬虫之urllib库介绍
一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...
- Python 爬虫之urllib库的使用
urllib库 urllib库是Python中一个最基本的网络请求库.可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据. urlopen函数: 在Python3的urlli ...
- Python爬虫入门 Urllib库的基本使用
1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它是一段HTML代码,加 JS.CSS ...
- python爬虫入门urllib库的使用
urllib库的使用,非常简单. import urllib2 response = urllib2.urlopen("http://www.baidu.com") print r ...
- python爬虫之urllib库
请求库 urllib urllib主要分为几个部分 urllib.request 发送请求urllib.error 处理请求过程中出现的异常urllib.parse 处理urlurllib.robot ...
- Python爬虫系列-Urllib库详解
Urllib库详解 Python内置的Http请求库: * urllib.request 请求模块 * urllib.error 异常处理模块 * urllib.parse url解析模块 * url ...
随机推荐
- linux c MQTT客户端实现
linux c MQTT客户端实现 摘自:https://www.jianshu.com/p/d309de966379 一.前言:mqtt协议是轻量级的消息订阅和发布(publish/subscrib ...
- 使用Intellij中的Spring Initializr来快速构建Spring Boot/Cloud工程
在之前的所有Spring Boot和Spring Cloud相关博文中,都会涉及Spring Boot工程的创建.而创建的方式多种多样,我们可以通过Maven来手工构建或是通过脚手架等方式快速搭建,也 ...
- C#调用COM组件遇到的问题及解决办法
1.无法嵌入互操作类型"xxx",请改用适用的接口. 解决办法: - 将所引用的程序集的[嵌入互操作类型]属性设置为[False]. 2.System.Runtime.Intero ...
- Primer 三四五章
序言 看了看表,再看了看书,2个小时就没啦(又到了吃中饭的时间,O(∩_∩)O哈哈~).一个上午感觉啥也没干呢,不过还是从书上看到了一些东西,对于这些基础的知识,还是有些东西没有记得很深,所以还是花了 ...
- 【转载】Maven+druid+MyBatis+Spring+Oracle+Dubbo开发环境搭建
原地址:http://blog.csdn.net/wp1603710463/article/details/48247817#t16 Maven+druid+MyBatis+spring+Oracle ...
- query.validate.js使用说明+中文API
转自:http://www.cnblogs.com/hejunrex/archive/2011/11/17/2252193.html 看到一篇好的文章不容易,记录下来以防丢失! 官网地址:http:/ ...
- 大佬福利之在你眼中 Web 3.0 是什么?(转)
web 3.0 Web 3.0一词包含多层含义,用来概括互联网发展过程中某一阶段可能出现的各种不同的方向和特征.Web 3.0 充满了争议和分歧,它到底应该什么样?具体的标志点又是什么? Web 2. ...
- javascript总结29 :递归与回调函数
1 递归函数 -递归的实质就是函数自己调用自己. -递归注意点:递归必须有跳出条件,否则是死循环. var i = 1; fn(); function fn(){alert("从前有座山,山 ...
- sqlplus 简单的几个查询语句
sqlplus 是用来和oracle进行交互的工具,可以在电脑端使用,也可以在服务器使用 常用命令 show 显示SQL Plus中的信息 connect 先无条件断 ...
- 一篇文章让你快速入门 学懂Shell脚本
Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合. Shell可以直接使用在win/Unix/Linux上面 ...