2020/03/29 03-urllib3和requests库使用

知道了,get,post,json请求返回来是什么样子,现在能用的方法就是get和post两种,对什么发起请求,返回的类型不知道,别人发的是http请求,但是返回来是application/json,是用json返回的。

https有些地方会出现问题,但是目前来看已经不是问题了
2020/03/29 03-urllib3和requests库使用
以前12306就是自建的CA,提示会不安全
2020/03/29 03-urllib3和requests库使用
**其实计算机系统有一些内置的证书颁发者,所以有些网站的CA才是可信的,全球的根证书认证者已经在我们的体系中,如果是这些,就是直接可信任,根证书的子机构,也信。
但是当时12306是自己给自己颁发的 **
2020/03/29 03-urllib3和requests库使用
现在就不是已经有人给它颁发了2020/03/29 03-urllib3和requests库使用
现在访问12306看看,现在首页被下载回来了
2020/03/29 03-urllib3和requests库使用
上下文在ssl里就等于create_unverified_context,不用校验的上下文
2020/03/29 03-urllib3和requests库使用
自己颁发的证书也会这样,就是你自己颁发的证书浏览器不认识,要么建立根证书,安装到当前计算机操作系统里,这样浏览器打开查到证书存在了,就信任了

访问是s,访问的时候就需要验证证书,看它这个证书颁发的机构是否可信的
2020/03/29 03-urllib3和requests库使用
2020/03/29 03-urllib3和requests库使用
这么访问就没有问题
2020/03/29 03-urllib3和requests库使用
百度证书是信任机构颁发的
2020/03/29 03-urllib3和requests库使用
ssl协议是要用证书来加密的,以前12306是自己签发的证书,我们的计算机是不信任的
2020/03/29 03-urllib3和requests库使用
会抛出这样的异常

2020/03/29 03-urllib3和requests库使用
可以导入ssl模块,调用不校验的上下文

2020/03/29 03-urllib3和requests库使用

2020/03/29 03-urllib3和requests库使用
2020/03/29 03-urllib3和requests库使用

常用的urllib3库

urllib3不是官方库,也就是不是标准库,这个库是由第三方机构编写的,在安装一些爬虫工具的时候也会安装,这个库确实写的不错

2020/03/29 03-urllib3和requests库使用2020/03/29 03-urllib3和requests库使用
这样打开,去看httpbin下robots文件,看看里面的状态,数据

2020/03/29 03-urllib3和requests库使用
增强的东西,
1.thread safety 要是多线程,线程安全的。
2,connection pooling增加了连接池、链接复用
3。client-side SSL/TLS verification 支持ssl校验
4.file uploads with multipart encoding 使用多编码方式文件上传
5.helper for retrying requests and dealing with HTTP redirects 跳转的时候可以管
6.support for gzip and deflate encoding 支持加密压缩算法
7.proxy support for HTTP and SOCKS. http和socket都可以代理
8. 100% test coverage.
1,2,3是比较安全的

2020/03/29 03-urllib3和requests库使用
安装
2020/03/29 03-urllib3和requests库使用
看一下这个池

2020/03/29 03-urllib3和requests库使用
可以限定池的大小,header建立连接的时候要给一个header,里面的useragent要换
2020/03/29 03-urllib3和requests库使用
PoolManager是从requestmethods继承下来的2020/03/29 03-urllib3和requests库使用
建立一个容器,容器里,要把池的大小给它,最近使用的容器recentlyusercontainer
2020/03/29 03-urllib3和requests库使用
clear是把池子都清除
2020/03/29 03-urllib3和requests库使用
最重要的是enter和exit,enter是把自己返回去,
2020/03/29 03-urllib3和requests库使用
这样写的时候,就可以这么写,把自己的池管理器返回来
2020/03/29 03-urllib3和requests库使用
在退出的时候把自己清理干净了,返回了一个false

2020/03/29 03-urllib3和requests库使用
in-flight是正在用的时候,这里不会影响正在用的链接,但是在用完之后将不再重复利用,池子里全部清理掉
2020/03/29 03-urllib3和requests库使用
用完之后可以发起请求

2020/03/29 03-urllib3和requests库使用
发起请求,给方法,给url,header
2020/03/29 03-urllib3和requests库使用
用get方法,访问url,,愿意的话把headers定义一下,发起请求,最后返回是response
2020/03/29 03-urllib3和requests库使用
访问豆瓣有一个警告,没有校验https request,增加一个这样的请求,暂时先不管
2020/03/29 03-urllib3和requests库使用
这个类就是response下的httpresponse
2020/03/29 03-urllib3和requests库使用
好像封装了没什么太大变化,到这里看一下

2020/03/29 03-urllib3和requests库使用
它是直接自己重新构建了
2020/03/29 03-urllib3和requests库使用定位下是在urllib3 2020/03/29 03-urllib3和requests库使用
这就是response最后拿到的状态,里有,拿到headers
2020/03/29 03-urllib3和requests库使用
body构建的时候如果是这两个信息就把body值给它
2020/03/29 03-urllib3和requests库使用
用data的方式可以把body信息return回来
2020/03/29 03-urllib3和requests库使用
2020/03/29 03-urllib3和requests库使用
现在就拿到了这些内容

2020/03/29 03-urllib3和requests库使用
这个库不需要下功夫研究,还有个增强版的库,requests,爬虫往往用这个库,这个库才是在开发中真正想要用的东西,从它来采集数据
2020/03/29 03-urllib3和requests库使用
定义了这么多东西

2020/03/29 03-urllib3和requests库使用
2020/03/29 03-urllib3和requests库使用
实际上想要用的requests类都在这里
2020/03/29 03-urllib3和requests库使用
用起来更加方便,把cookie都提取出来了

2020/03/29 03-urllib3和requests库使用
这是个演变过程,封装再封装,urllib-》urllib2-》urllib3-》requests

这些参数都是可以用的,每个属性传什么值都说的很清楚了
2020/03/29 03-urllib3和requests库使用
后面是可变关键字参数,header字典头信息,返回的依然是response
2020/03/29 03-urllib3和requests库使用
reponse已经告诉你有什么是那你需要关注的了

2020/03/29 03-urllib3和requests库使用
有这两个就可以用with
2020/03/29 03-urllib3和requests库使用
close调用的是这个方法。看到链接说明底层包装的还是socket链接
2020/03/29 03-urllib3和requests库使用
2020/03/29 03-urllib3和requests库使用
看下content和text是什么
2020/03/29 03-urllib3和requests库使用
最后相当于把值给你扔出来了

2020/03/29 03-urllib3和requests库使用
text文本有文本的用处,in unicode,要给你转
2020/03/29 03-urllib3和requests库使用
这里的content是局部变量,最后string用编码来转
2020/03/29 03-urllib3和requests库使用
content是二进制的方式,一行就过去了,这是bytes的
2020/03/29 03-urllib3和requests库使用
text就是爬过来的页面
2020/03/29 03-urllib3和requests库使用
这里没指定

2020/03/29 03-urllib3和requests库使用
号称是utf-8编码

2020/03/29 03-urllib3和requests库使用
需要指定编码,这是显示的100个字符
2020/03/29 03-urllib3和requests库使用
如果要保存一定要看一下是什么
2020/03/29 03-urllib3和requests库使用
text是个属性,本质上是个函数
2020/03/29 03-urllib3和requests库使用
这里内部用的encoding
2020/03/29 03-urllib3和requests库使用
上面的self就是response对象本身

2020/03/29 03-urllib3和requests库使用
如果编码不对需要切换它的编码,要看清编码,甚至可以强行改变编码
2020/03/29 03-urllib3和requests库使用
有些网站可能不带编码这时候默认是ISO8859这是拉丁

2020/03/29 03-urllib3和requests库使用
所以这两个编码需要一致
2020/03/29 03-urllib3和requests库使用
看一下session,可以用一个session的对象来解决访问的问题。

构建一个列表,可以用for循环起来,可以先创建一个session
2020/03/29 03-urllib3和requests库使用
看一下这个session是干嘛的,return一个上下文的管理器,下面Session是个类,所以session是Session类的实例,注意首字母区别
2020/03/29 03-urllib3和requests库使用
这就是session类的实例2020/03/29 03-urllib3和requests库使用
返回的是会话实例2020/03/29 03-urllib3和requests库使用
用这个session
2020/03/29 03-urllib3和requests库使用
看一下里面有什么东西
2020/03/29 03-urllib3和requests库使用
看到enter和exit,我们就可以继续使用with语法

2020/03/29 03-urllib3和requests库使用
使用了session,至少连续发送两次请求,看看headers有没有差异,因为搜索引擎最喜欢做set-cookie,这里有一个就是response里可以调用request,这个request就是Request对象
2020/03/29 03-urllib3和requests库使用
这里就有headers
2020/03/29 03-urllib3和requests库使用
属性里也有headers

2020/03/29 03-urllib3和requests库使用
res.headers这是回来的headers,看这两个区别,一个是请求头,一个是响应头,好像没什么大区别
2020/03/29 03-urllib3和requests库使用
跟百度建立会话后,下一次再请求的时候已经setcookie了,也就是下一次访问的时候cookie要带上,但是这里第二次请求的时候没有带上cookie,没带上是因为没有用session
2020/03/29 03-urllib3和requests库使用
这两个是普通请求,相当于访问完关闭浏览器再进行访问,相当于两次链接没有任何联系,服务器是用sessionid来认识你的
2020/03/29 03-urllib3和requests库使用
现在发起get请求,这个session相当于上面方法的快捷方法,这里就看到cookie了,因为上次set-cookie了
2020/03/29 03-urllib3和requests库使用
这个session对象把这些值保下来,伪装成浏览器
2020/03/29 03-urllib3和requests库使用
普通方法相当于开了两次浏览器,用session就会把session和cookie保存下来,会在下一次请求的时候带上
2020/03/29 03-urllib3和requests库使用
我们要做的是在这里找到你要的数据,就需要dom树或者css选择器这样的东西,写正则表达式很累。
jquery不借助选择找到节点,不能把click事件绑定上去

2020/03/29 03-urllib3和requests库使用

一种是用re,css,还有就是xpath,三种方法偶都可以
2020/03/29 03-urllib3和requests库使用
开发中如果不用框架,大部分都是用requests来实现的,往往就是用session,set-cookie,保证连续性抓取,欺骗网站免登陆