2020/03/29 03-urllib3和requests库使用
知道了,get,post,json请求返回来是什么样子,现在能用的方法就是get和post两种,对什么发起请求,返回的类型不知道,别人发的是http请求,但是返回来是application/json,是用json返回的。
https有些地方会出现问题,但是目前来看已经不是问题了
以前12306就是自建的CA,提示会不安全
**其实计算机系统有一些内置的证书颁发者,所以有些网站的CA才是可信的,全球的根证书认证者已经在我们的体系中,如果是这些,就是直接可信任,根证书的子机构,也信。
但是当时12306是自己给自己颁发的 **
现在就不是已经有人给它颁发了
现在访问12306看看,现在首页被下载回来了
上下文在ssl里就等于create_unverified_context,不用校验的上下文
自己颁发的证书也会这样,就是你自己颁发的证书浏览器不认识,要么建立根证书,安装到当前计算机操作系统里,这样浏览器打开查到证书存在了,就信任了
访问是s,访问的时候就需要验证证书,看它这个证书颁发的机构是否可信的
这么访问就没有问题
百度证书是信任机构颁发的
ssl协议是要用证书来加密的,以前12306是自己签发的证书,我们的计算机是不信任的
会抛出这样的异常
可以导入ssl模块,调用不校验的上下文
常用的urllib3库
urllib3不是官方库,也就是不是标准库,这个库是由第三方机构编写的,在安装一些爬虫工具的时候也会安装,这个库确实写的不错
这样打开,去看httpbin下robots文件,看看里面的状态,数据
增强的东西,
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是比较安全的
安装
看一下这个池
可以限定池的大小,header建立连接的时候要给一个header,里面的useragent要换
PoolManager是从requestmethods继承下来的
建立一个容器,容器里,要把池的大小给它,最近使用的容器recentlyusercontainer
clear是把池子都清除
最重要的是enter和exit,enter是把自己返回去,
这样写的时候,就可以这么写,把自己的池管理器返回来
在退出的时候把自己清理干净了,返回了一个false
in-flight是正在用的时候,这里不会影响正在用的链接,但是在用完之后将不再重复利用,池子里全部清理掉
用完之后可以发起请求
发起请求,给方法,给url,header
用get方法,访问url,,愿意的话把headers定义一下,发起请求,最后返回是response
访问豆瓣有一个警告,没有校验https request,增加一个这样的请求,暂时先不管
这个类就是response下的httpresponse
好像封装了没什么太大变化,到这里看一下
它是直接自己重新构建了定位下是在urllib3
这就是response最后拿到的状态,里有,拿到headers
body构建的时候如果是这两个信息就把body值给它
用data的方式可以把body信息return回来
现在就拿到了这些内容
这个库不需要下功夫研究,还有个增强版的库,requests,爬虫往往用这个库,这个库才是在开发中真正想要用的东西,从它来采集数据
定义了这么多东西
实际上想要用的requests类都在这里
用起来更加方便,把cookie都提取出来了
这是个演变过程,封装再封装,urllib-》urllib2-》urllib3-》requests
这些参数都是可以用的,每个属性传什么值都说的很清楚了
后面是可变关键字参数,header字典头信息,返回的依然是response
reponse已经告诉你有什么是那你需要关注的了
有这两个就可以用with
close调用的是这个方法。看到链接说明底层包装的还是socket链接
看下content和text是什么
最后相当于把值给你扔出来了
text文本有文本的用处,in unicode,要给你转
这里的content是局部变量,最后string用编码来转
content是二进制的方式,一行就过去了,这是bytes的
text就是爬过来的页面
这里没指定
号称是utf-8编码
需要指定编码,这是显示的100个字符
如果要保存一定要看一下是什么
text是个属性,本质上是个函数
这里内部用的encoding
上面的self就是response对象本身
如果编码不对需要切换它的编码,要看清编码,甚至可以强行改变编码
有些网站可能不带编码这时候默认是ISO8859这是拉丁
所以这两个编码需要一致
看一下session,可以用一个session的对象来解决访问的问题。
构建一个列表,可以用for循环起来,可以先创建一个session
看一下这个session是干嘛的,return一个上下文的管理器,下面Session是个类,所以session是Session类的实例,注意首字母区别
这就是session类的实例
返回的是会话实例
用这个session
看一下里面有什么东西
看到enter和exit,我们就可以继续使用with语法
使用了session,至少连续发送两次请求,看看headers有没有差异,因为搜索引擎最喜欢做set-cookie,这里有一个就是response里可以调用request,这个request就是Request对象
这里就有headers
属性里也有headers
res.headers这是回来的headers,看这两个区别,一个是请求头,一个是响应头,好像没什么大区别
跟百度建立会话后,下一次再请求的时候已经setcookie了,也就是下一次访问的时候cookie要带上,但是这里第二次请求的时候没有带上cookie,没带上是因为没有用session
这两个是普通请求,相当于访问完关闭浏览器再进行访问,相当于两次链接没有任何联系,服务器是用sessionid来认识你的
现在发起get请求,这个session相当于上面方法的快捷方法,这里就看到cookie了,因为上次set-cookie了
这个session对象把这些值保下来,伪装成浏览器
普通方法相当于开了两次浏览器,用session就会把session和cookie保存下来,会在下一次请求的时候带上
我们要做的是在这里找到你要的数据,就需要dom树或者css选择器这样的东西,写正则表达式很累。
jquery不借助选择找到节点,不能把click事件绑定上去
一种是用re,css,还有就是xpath,三种方法偶都可以
开发中如果不用框架,大部分都是用requests来实现的,往往就是用session,set-cookie,保证连续性抓取,欺骗网站免登陆