requests模块介绍

相对于python自带的urllib模块,requests模块提供了相对更高层的api来进行网页访问的工作。

对于requests模块,使用很简单,一般我们会用到两个函数:

requests.get(url,params=None,**kwargs) 这里的params是我们要传入的query,它的格式是dict。

requests.post(url,data=None,**kwargs) 这里的data就是我们要提交的表单data,也是直接传入dict就好。

以上两个函数分别对应http协议中的"GET"方法与"POST"方法,而除了这两者,还有如"PUT"、"DELETE"、"HEAD"等方法,在requests模块中有一个统一的函数来发起不同“方法”的http请求报文:

requests.request(method,url,**kwargs) 可以看到该函数的第一个参数method的取值就是"GET"、"POST"等。

该方法与上文提到的两个方法,返回值都是requests.Response对象,后面我们会对该对象与requests.Request对象进行介绍

较常用的关键字参数:params,data,headers,proxies,stream等。

其实上文所介绍的两个函数get和post,或是对应其他方法的函数,它们的实现就是使用request.requests函数的:

def get(url, params=None, **kwargs):

kwargs.setdefault('allow_redirects', True)

#这里可见request.get的实质

return request('get', url, params=params, **kwargs)

这里来详细介绍一下headers,proxies和stream关键字参数的用途:

headers参数就是http请求报文的头部,它的格式是一个dict,其中最为常用的headers元素就是User-Agent,模仿浏览器访问网页。

proxies参数就是代理,它的格式也是一个dict,每一个键值对是这样的形式:"协议":"ip:port"。

stream参数是相对前两者较陌生的一个参数,该参数默认为False,意味着我们会一下子把网页内容都下载,但如果主动设置为True的话,则不会立刻下载网页内容,而是等到使用requests.Response的iter_content才会迭代地把数据下载并读进内存中。

requests.Request&requests.Response

这两个对象详细对爬虫有过了解的朋友们都很熟悉了,它们是在爬虫逻辑中很关键的两个对象,简单来说: 发出Request,返回Response 。

requests.Request

我们在使用requests时一般不会直接创建Request对象,所以这里我们大致了解一下即可:

requests.Request(method=None, url=None, headers=None, data=None, params=None) 我们列出Request类构造时所需的一些常用参数,并且前文我们提到requests.get等函数的实质是requests.request函数,那么其实研究该函数的源码:

def request(method, url, **kwargs):

with sessions.Session() as session:

#可以看到在request函数内调用了session.request方法

return session.request(method=method, url=url, **kwargs)

#这个是session.request方法的定义

def request(self, method, url,

params=None, data=None, headers=None, cookies=None, files=None,

auth=None, timeout=None, allow_redirects=True, proxies=None,

hooks=None, stream=None, verify=None, cert=None, json=None):

#可以看到这里其实使用传入参数

#创建了一个requests.Request实例

req = Request(

method=method.upper(),

url=url,

headers=headers,

files=files,

data=data or {},

json=json,

params=params or {},

auth=auth,

cookies=cookies,

hooks=hooks,

)

#进一步处理,得到对应的PreparedRequest对象

prep = self.prepare_request(req)

proxies = proxies or {}

settings = self.merge_environment_settings(

prep.url, proxies, stream, verify, cert

)

# Send the request.

send_kwargs = {

'timeout': timeout,

'allow_redirects': allow_redirects,

}

send_kwargs.update(settings)

#这里是真正的send Request,并返回一个Response对象

resp = self.send(prep, **send_kwargs)

return resp

由以上代码可知,其实requests.request方法的实质就是创建一个Request实例,在对其进行一定预处理后将其send,然后得到Response。

requests.Response

我们之前的requests.get、requests.post或是requests.request函数的返回对象就是一个requests.Response实例。对于Response类,我们主要介绍几个常用属性与方法:

Response.content 以bytes的形式得到返回Response的内容,其实也就是未解码的html文件

Response.text 文本形式的Response内容,也就是解码了的html文件,且如Response.encoding属性为None的话,那么会以chardet去猜测bytes内容的编码方式。当然我们也可以在access这个属性前人为指定一种编码方式。

Response.encoding 指定以何种方式来解码,Response内容的编码完全基于HTTP报头,遵循RFC2616文件。

Response.url 即Response的url

Response.status_code 相应的状态码,如成功的话该值就是200

Response.request 得到对应于这个Response的Request对象,其实是(PreparedRequest),通过这个request对象我们可以得到当时访问时的url、method、headers等属性。

Response.iter_content(chunk_size=1),该函数返回一个generator,其中的chunk_size决定我们每次下载并读进内存中多少个字节,一般使用方法为for item in Response.iter_content(256)这样的for循环遍历即可。

BeautifulSoup

BeautifulSoup是一个可以从HTML或XML文件中提取数据的Python库,通常我们使用requests得到html文件(Response.text),然后我们再使用BeautifulSoup来处理。从而提取到我们需要的信息。

如何使用BeautifulSoup

from bs4 import BeautifulSoup

#其中html是返回的网页文本,也就是response.text

#而lxml是BeautifulSoup使用的文档解析器,需要我们

#已经预先pip install好lxml这个模块,或者我们也可

#使用python自带的html.parser,不过它的速度较慢些

#而soup就是一个BeautifulSoup对象,它承载了一个

#由html文档内部各个元素所形成的树形结构。

soup=BeautifulSoup(html,"lxml")

#以下就是几个最简单基本的使用

#直接以属性引用的方式得到html文档中的第一个a标签

print(soup.a)

#进一步得到html文档中第一个a标签的中的字符串部分(如果存在的话)

print(soup.a.string)

#拿到html文档中第一个a标签的href属性的值

print(soup.a["href"])

以上大致介绍了BeautifulSoup的简单实用,接下来我们进行更详细地分析:

BeautifulSoup将HTML文档转换成一个复杂的树形结构,该树形结构中的每个节点都是Python对象,所有对象可分为4种: Tag、NavigableString、BeautifulSoup、Comment。

Tag对象对应的就是html文档中的标签,它有很多属性与方法,这里先介绍它最重要的两个属性:1.tag.name返回的就是该tag标签的名字(比如tag对应a标签,那么tag.name返回的就是"a")。2.tag.attrs以字典的形式返回该标签所有的属性,如{"herf":"www.baidu.com"}。而我们想拿到属性值就可以用tag.attrs["href"],不过上文也看到了,这里其实可以直接简写为tag["href"]。

NavigableString对象它其实就是我们使用soup.a.string时真正返回的对象,它是对python自带的string对象进行了一个包装,我们可以就把它当作string使用,不需要在意其它。

BeautifulSoup对象它对应我们文档的全部内容,也就是上文的soup对象,大部分时间我们可以把它当作tag对象一样来使用 方法 ,不过它没有attrs属性,并且它的name属性的值只为:["document"]。

Comment对象它对应html文档中的注释标签:,该标签很特别的是它不会被浏览器显示,只是一个对程序员注释的作用。该对象在实际应用中很少使用,这里不作更进一步的介绍。

接下来我们要来对tag对象以及BeautifulSoup对象在使用 method 上进行更进一步的介绍:

而所谓的method使用,我们着眼的就是在得到的BeautifulSoup对象的树形结构中对所需要的信息进行搜索的工作。

这样的搜索工作根据对 节点本身信息 和 节点之间在树形结构中的关系 的应用不同而 分为两种 。

第一种,由节点本身信息对节点进行搜索:

所谓tag.a其实就是tag.find("a"),该方法的具体函数头如下

find(name,attrs,recursive,string,**kwargs)

name就是标签名,它的值是一个“过滤器”。

attrs就是该name对应标签的属性,同样值也是一个“过滤器”。

recursive是一个bool值,默认为True。它的意思是搜索当前tag的所有子孙节点,如果为False,则只搜索当前tag的直接子节点

string就是该name对应的string值,也是一个“过滤器”。

**kwargs一般使用不用理会。

当然上面的tag.a或是tag.find("a")都只能得到tag下的第一个a标签,

这太局限了,如果我们想要的是后面的第三个a标签呢?于是就有了

tag.find_all("a")方法,返回一个列表,来得到所有的a标签,简写为tag("a")。

find_all(name,attrs,recursive,string,**kwargs)

参数的意义和find函数一样

下面我们来讲解一下这个所谓的“过滤器”到底是什么东西

具体的代码实现有点繁琐,总之我们可以把它理解为一种

对象,我们允许这个对象有多种值。

(1)字符串值 最简单的就是传入字符串值,如之前的tag.a

(2)正则表达式值 即re.compile(r"\d+")这样的形式

(3)列表值 如name=["a","div"],则find只会返回其中的后者,

find_all会返回一个列表,包含tag下的所有a和div标签。

(4)True 意思不做过滤,对于find是返回tag下符合要求的标签的第一个,对于find_all是返回所有。比如name=True,那么就不对name

过滤,对其他attrs或string继续筛选过滤。

第二种,根据节点所在树形结构中的关系对其它节点进行搜索:

直接子节点:

tag.childern和tag.contents是tag对象的两个属性,注意不是对应标签的属性!!!它们返回当前tag节点在树形结构中的直接子节点。

tag.childern返回一个生成器

tag.contents返回一个列表

子孙节点:

tag.descendants返回一个生成器,对它进行遍历可以得到当前tag节点的所有子孙节点的循环遍历结果。

直接父节点:

tag.parent获取当前tag的直接父节点

所以父节点:

tag.parents返回一个生成器,可以获取当前tag的所有父辈节点

next的兄弟节点:

tag.next_sibling和tag.next_siblings,返回值类型不用赘述。

previous的兄弟节点:

tag.previous_sibling和tag.previous_siblings,同样返回类型不用赘述。

以上大概就是BeautifulSoup在搜索信息时所需的知识,其它如两种方式结合的tag.find_parent(name,attrs,recursive,string,**kwargs)等方法,之后可以慢慢了解。

此文转载文,著作权归作者所有,如有侵权联系小编删除!

python requests soup_带你了解python爬虫requests模块BeautifulSoup使用方式!相关推荐

  1. 年薪百万的阿里P9 Python专家快速带你入门Python

    年薪百万的阿里P9 Python专家快速带你入门Python 本文的目的是尽可能地用简洁的语言介绍 Python 编程语言,以帮助初学者能够快速入门Python.下面,让我们开始吧 什么是 Pytho ...

  2. python怎么爬取电影海报_python爬虫之通过BeautifulSoup获取豆瓣最新上映电影的海报...

    0.目录 1.分析页面 2.初步代码 3.完整代码 4.总结 5.补充 1.分析页面 上一次我们讲了xpath获取豆瓣最新上映电影的海报,这一次会分析如何使用BeautifulSoup获取.启程:py ...

  3. python群控_带你用 Python 实现自动化群控入门篇

    点击上方"AirPython",选择"加为星标"第一时间关注 Python 技术干货! 1. 前言 群控,相信大部分人都不会陌生!印象里是一台电脑控制多台设备完 ...

  4. python群控_带你用 Python 实现自动化群控(入门篇)

    ↑关注 + 星标 ,每天学Python新技能 后台回复[大礼包]送你Python自学大礼 1. 前言 群控,相信大部分人都不会陌生!印象里是一台电脑控制多台设备完成一系列的操作,更多的人喜欢把它和 H ...

  5. 小白用python处理excel文件-Python读、写Excel文件(三种模块三种方式,小白也可学会)...

    python读写excel的方式有很多,不同的模块在读写的讲法上稍有区别: 用xlrd和xlwt进行excel读写: 用openpyxl进行excel读写: 用pandas进行excel读写: 为了方 ...

  6. python爬虫token_Python入门:模拟登录(二)或注册之requests处理带token请求

    转自http://blog.csdn.net/foryouslgme/article/details/51822209 首先说一下使用Python模拟登录或注册时,对于带token的页面怎么登录注册模 ...

  7. 域名带后缀_[Python 爬虫]获取顶级域名及对应的 WHOIS Server 及 whoisservers.txt 下载...

    使用 Python 爬虫获取顶级域名及对应的 WHOIS Server 并保存可用于 WhoisCL.exe 的文件 whois-servers.txt. 环境: Windows 10 Python ...

  8. 用几个最简单的例子带你入门 Python 爬虫

    作者 | ZackSock 来源 | 新建文件夹X(ID:ZackSock) 头图 | CSDN下载自视觉中国 前言 爬虫一直是Python的一大应用场景,差不多每门语言都可以写爬虫,但是程序员们却独 ...

  9. python爬虫requests模块

    读书使人充实,讨论使人机智,笔记使人准确-.凡有所学,皆成性格. ---- (英国)培根 文章目录 简单的代码实现 requests.text与requests.content的区别 通过对 resp ...

  10. 图解爬虫,用几个最简单的例子带你入门Python爬虫

    一.前言 爬虫一直是Python的一大应用场景,差不多每门语言都可以写爬虫,但是程序员们却独爱Python.之所以偏爱Python就是因为她简洁的语法,我们使用Python可以很简单的写出一个爬虫程序 ...

最新文章

  1. 清华特奖答辩前10出炉,两名CS学生3篇顶会一作,有人周读3000页英文论文!
  2. 数据结构-王道-树和二叉树
  3. PyQt5 技术篇-QTableWidget表格组件指定行的隐藏与显示控制实例演示,设置表格指定列的列宽方法
  4. event loop、进程和线程、任务队列
  5. 计划任务工具 cron 的配置和说明
  6. 推荐一个 Service Mesh 专栏
  7. linux 无法访问docker mysql8_Apple M1芯片不支持Docker?Docker:正在努力适配
  8. 安装linux6.10 I386系统教程,一看就懂的Centos6.10安装教程
  9. Spark源码剖析(一):如何将spark源码导入到IDEA中
  10. 去除残缺条目java_为什么说Java匿名内部类是残缺的闭包
  11. 深度学习入门读书笔记—全
  12. I.MX6 ifconfig: SIOCSIFHWADDR: Cannot assign requested address
  13. 开发组2007年3月开发计划
  14. Atitit 常用比较复杂的图像滤镜 attilax大总结
  15. Kafka开源转商业实践,助力车主无忧系统稳健 | 凌云时刻
  16. 百度前员工因内网发布“女优一览表”被辞退,自诉:想转鉴黄师
  17. 安卓Java开启usb热点_安卓手机通过USB共享PC的宽带网络上网
  18. 06计算机优秀毕业论文-总结和展望
  19. 漏洞复现篇——ewebeditor编辑器解析漏洞
  20. w ndows无法识别usb,surface pro3 windows无法识别USB设备

热门文章

  1. 浅谈localhost
  2. Python 自定义程序打包 --- face_recognition 篇
  3. 炉石传说 android,炉石传说安卓版
  4. macOS Monterey 12.2.1 (21D62) 正式版 ISO、IPSW、PKG 下载
  5. using runtime html4,为什么我不能在C#中引用System.Runtime.Serialization.Json
  6. 高含盐废水处理资源化——双极膜电渗析
  7. linux下安装jdk7
  8. IndexedBD的一些心得(总结)
  9. 如何修改静态 IP 地址和动态 IP 地址
  10. 深度学习、目标检测相关博客链接