python网络爬虫方向的第三方库_爬虫必备!传说中最pythonic的第三方库“requests”源码阅读...

requests库基本上是玩爬虫的兄弟伙们所接触的第一课,也是公认的python最好上手的http请求库。此库基于标准库urllib(最开始是urllib2)重新造轮子,用起来非常安逸。而且,这也是传说中最pythonic的代码,毕竟作者是公认的python界前三位的大神之一,本文将先从初始版本(0.2.0版本)开始阅读源码,尽量理解作者设计思路

eac4b74543a982268296e72fe553f3064b90ebb8.jpeg?token=f0c7bb3d1042a41bc102561ae7c81859

01拉取版本源码

写这个是因为有些同学可能不是用的git,或是刚刚接触git,不知道如何拿到tag版本的源码,这里说一下哈,两种方法

6f061d950a7b0208b777971c0d08b8d4552cc8ee.jpeg?token=0dcc8fec7ee78574478798b83a4d5854

02初始版本的结构目录

c995d143ad4bd1136ab09edc347eee084afb0532.jpeg?token=f8374163419b052a6b7de0101802bae9

03readme文件

截取了一部分原readme,总的来说,就是大神当时觉得已存在的python语言的http库都极其难用,所以想重新造轮子,并在此文件中体现了自己对于库设计的理念以及如何非常容易上手这个项目的使用(介绍了如何进行http/https请求的例子)对于一个项目来说,readme是所有人想了解你项目的第一步,大神的readme确实非常“嚣张”,但确实够吸引人,也确实好用,不然怎么叫大神呢(所以如果自己的项目,一定要认真对待readme文件,readme让别人感兴趣,别人才可能研究并使用你的项目)看下大神的叫嚣……

5243fbf2b2119313b34855d81ce946d090238da3.jpeg?token=1fcb56caff77f4b239080ec152c6023b

04history文件

只传达出了一个意思,requests正式版本由0.2.0开始,时间为2011-02-14

3b87e950352ac65c6646636c8b23f81692138a42.jpeg?token=2859c627d89847a8ef1c6ddcd08259a7

05core文件

通过分析,可以看得出来,核心代码文件为core.py,行数不多,只有400行左右的样子,我们从get方法的调用过程来看(get是最最最基础的)

get源码

9825bc315c6034a87962305ca5c203530b237647.jpeg?token=861cf37da0168585f295cd14eeaeaa23

首先实例化,生成一个Request对象,然后将初始化方法的属性重新设置,只有一个例外,就是auth_detect_autu方法说白了,因为有些网站需要用户名和密码的认证,才能访问,所以这里就是为了调用urllib2中用来处理这种情况的handler,下面我们来看一下代码(以下这几个函数/类需要放在一起看)

94cad1c8a786c9170d25f7f6a6ec3ac83ac75737.jpeg?token=fcc85eee0089735182cec46706d81ea6

4.最后一步,调用send方法

Request类

先看下send方法的源码

ca1349540923dd5436df1a6ba1d8f9d99d824859.jpeg?token=3d90ebdb23391ddacebfeeb187807643

self._checks(),先检验url是否有问题,很简单,不说了if (not self.sent) or anyway :我是这样理解的,假设说我们用Request实例对象去请求相同的请求,那么第一次成功的话,就会将self.sent设置为True,那么接下来的重复请求就不会发起了,除非将anyway设置为True,那么才会再此发起相同的请求,反正第一次请求是绝对会正常执行的urllib.urlencode(self.params) 就是将请求参数编码_Request(("%s?%s" % (self.url, params)), method=self.method)是将域名 + 请求拼接完整,这样服务器才知道客户端的请求内容_get_opener(代码在下面)就是找让哪些handler来处理相关的url请求,这里作者考虑的是如果需要基础验证,则创建一个HTTPBasicAuthHandler的实例,并让opener使用这个handler ,否则就用urllib2.urlopen函数即可。(urlopen其实是opener的一个实例,内部也还是调用了build_opener函数去拿到handlers,在urllib2的原生代码,想要理解,还需要看下urllib2的源码,其实注释的比较清晰了)接下来就比较简单了,将_Request实例对象发送给服务器,如果是没有鉴权,那就相当于resp = urllib2.urlopen(urllib2.Reuqest())了最后的最后则是通过属性接收响应结果

3812b31bb051f81940fbbb97b46500ea2c73e76e.jpeg?token=1434d55b11ac26582426b48fda94f3fc

__setattr__方法

这个__setattr__就是对url请求方法做了一个限制,只支持类属性_METHODS中存在的请求方法

29381f30e924b8996ca6d38400d75792087bf6c9.jpeg?token=d68f759632303790594d35c6440082d1

本文<完>!

我是一名奋战在编程界的pythoner,工作中既要和数据打交道,也要和erp系统,web网站保持友好的沟通……时不时的会分享一些提高效率的编程小技巧,在实际应用中遇到的问题以及解决方案,或者源码的阅读等等,欢迎大家一起来讨论!如果觉得写得还不错,欢迎关注点赞,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值