> 文档中心 > Python爬虫之requests库

Python爬虫之requests库

目录

JSON

什么是JSON

JSON的特点

JSON 键/值对语法

JSON格式在Python应用

HTTP协议

HTTP协议对资源的操作

http请求头

http响应头

HTTP状态码

requests库

requests介绍和安装

requests库

requests库的应用例子

总结


JSON

什么是JSON

JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式,通常是以键值对的方式呈现,其简洁和清晰的层次结构使得JSON成为理想的数据交换语言。它以 '{' 开始,以 '}' 结束,每个key 和 value 中使用冒号分隔,每个 key/value 对之间使用逗号分隔,如下图所示:

JSON的特点

  • JSON 是轻量级的文本数据交换格式

  • JSON 具有自我描述性,更易理解

  • JSON 采用完全独立于语言的文本格式:JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前常见的动态编程语言(PHP,JSP,.NET)都支持JSON。

     JSON 是存储和交换文本信息的一种语法,它与XML具有相同的特性,是一种数据存储格式,却比 XML 更小、更快、 更易于人编写和阅读、更易于生成和解析。

JSON 键/值对语法

JSON键/值对由键和值组成,键必须是字符串,值可以是字符串(string)、数值(number) 、对象(object)、数组(array)、true、false、 null,如下图:

JSON格式在Python应用

在python中我们提供两个模块处理json格式,分别为json和pickle;他们提供了四个方法让我们在python对数据进行序列化和反序列化,这四个方法如下表:

方法 描述
json.loads() 是将json格式的字符串(str)转换为字典类型(dict)的数据
json.dumps() 是将字典类型(dict)的数据转换成json格式的字符串
json.load() 用于读取json格式的文件,将文件中的数据转换为字典类型(dict)
json.dump() 要用于存入json格式的文件,将字典类型转换为json形式的字符串

       到这里也许有人会问,我们讲的是Python爬虫技术,为什么要聊json格式,因为爬虫的时候,我们经常会遇到json格式的数据,所以它是一个基础。

HTTP协议

HTTP(Hypertext Transfer Protocol):即超文本传输协议,是一个基于”请求于响应“模式的、无状态的应用层协议。URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源。

HTTP协议对资源的操作

方法 描述 Requests库对应方法
GET 请求获取URL位置的资源 requests.get()
HEAD 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息 requests.head()
POST 请求向URL位置的资源后附加新的数据 requests.post()
PUT 请求向URL位置存储一个资源,覆盖原URL位置的资源 requests.put()
PATCH 请求局部更新URL位置的资源,即改变该处资源的部分内容 requests.patch()
DELETE 请求删除URL位置存储的资源 requests.delete()

http请求头

属性 描述
Accept 告诉服务器,客户端支持的数据类型
Accept-Encoding 告诉服务器,客户机支持的数据压缩格式
Accept-Language 告诉服务器,客户机的语言环境
Connection 客户机通过这个头告诉服务器,请求完后是关闭还是保持链接
Content-Length 表示请求消息正文的长度
Content-Type 客户机通过这个头告诉服务器,客户端向服务器发送的数据类型
Cookie 客户机通过这个头告诉服务器,可以向服务器带数据
Host 客户机通过这个头告诉服务器,想访问的主机名
Origin 说明请求从哪里发起的,包括,且仅仅包括协议和域名,并没有包含涉及到用户隐私的URL路径和请求内容。可以防止CSRF的攻击。origin只用于Post请求
Referer 告知服务器请求的原始资源的URI,包括:协议+域名+查询参数(注意,不包含锚点信息)。其用于所有类型的请求。 因为原始的URI中的查询参数可能包含ID或密码等敏感信息,如果写入referer,则可能导致信息泄露
User-Agent 客户机通过这个头告诉服务器,客户机的软件环境
Accept-Charset 告诉服务器,客户端采用的编码
Date 客户机通过这个头告诉服务器,客户机当前请求时间
If-Modified-Since 客户机通过这个头告诉服务器,资源的缓存时间

http响应头

属性 描述
Connection 服务器通过这个头,响应完是保持链接还是关闭链接
Content-Encoding 服务器通过这个头,告诉浏览器数据采用的压缩格式
Content-Type 服务器通过这个头,回送数据的类型
Date 告诉客户机,返回响应的时间
Server 服务器通过这个头,告诉浏览器服务器的类型
Transfer-Encoding HTTP协议头字段Transfer_Encoding,分块传输编码,一般出现在http的响应头中。该头字段存在与HTTP协议的1.1版本中,提供一种数据传输机制。通常http协议在传输数据时是整体一起发送的,数据体的长度由Content-Length字段指定,方便判断消息结束。服务器通过这个头,告诉浏览器数据的传送格式
vary Vary 字段用于列出一个响应字段列表,告诉缓存服务器遇到同一个 URL 对应着不同版本文档的情况时,如何缓存和筛选合适的版本
Location 这个头配合302状态码使用,告诉用户端找谁
Content-Length 服务器通过这个头,告诉浏览器回送数据的长度
Content-Language 服务器通过这个头,告诉服务器的语言环境
Last-Modified 服务器通过这个头,告诉浏览器当前资源的缓存时间
Refresh 服务器通过这个头,告诉浏览器隔多长时间刷新一次
Content-Disposition 服务器通过这个头,告诉浏览器以下载的方式打开数据

HTTP状态码

常见的状态码:

  • 200 OK 表示成功

  • 303 重定向,把你重定向到其他页面

  • 304 资源并未修改,可以直接使用本地的缓存

  • 404 找不到页面(页面被删除或其他)

  • 500 服务端错误

     到现在为止,我们也没有通过requests库,而是先提json和http协议,那是因为json和http协议是requests库的基础,好了,我们废话不多说,进入主题吧~

requests库

requests介绍和安装

requests是一个基于HTTP协议来使用网络的第三库,专门用于发送HTTP请求,在编写爬虫和测试服务器响应数据时经常会用到。安装如下:

 pip install requests

requests库

Requests库有两个重要对象分别是Request(请求)Response(相应)。Request对象支持的请求方法如下:

Response对象的属性如下:

 但是我们并不是每一次请求都会成功,那么失败会有哪些异常呢?requests库异常如下:

上面基本对requests库介绍得差不多了,但是商务的时候细心的小伙伴们应该注意到url有时候会带入很多参数,我们可以像写url那样直接在后面加参数,但是有一些是不行的,那我们怎么办呢?其实requests库有这样的功能,如requests.get(url=url, xx = xx),xx是参数有如下:

requests库的应用例子

import requestsheaders = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}response = requests.get("https://www.baidu.com/", headers=headers)print(response.text)

运行结果如下:

 例二:

import requestsimport bs4import refrom bs4 import BeautifulSoupinitUrl ='https://www.maoyan.com/films?yearId=17&showType=3&offset='depth = 1headers = {    'Cookie':'_lxsdk_s=180f53c7b3d-52f-d97-449||1; uuid_n_v=v1; uuid=9D2A3600DB3D11EC8C773D1C1B49D8526608D0736D024C5ABF14DD08FF3FCF6B',    'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}sum = 0for i in range(depth):    url = initUrl + str(10*i)    r = requests.get(url, headers=headers, timeout=30)   # r.encoding = r.append_encoding    bs = BeautifulSoup(r.text, 'html.parser')    mlist = bs.find_all(name='dd')    for i in mlist:     #print(i) num = i.find(name='i', class_='integer').get_text().replace(".","") name = i.find(name='span', class_='name').get_text() tag = i.find_all(name='div',class_ = "movie-hover-title")[1].get_text().strip('\n').replace("\n","").replace(" ","").replace("类型:","")  when = i.find_all(name='div',class_ = "movie-hover-title")[3].get_text().strip('\n').replace("\n","").replace("  ","").replace("上映时间:","") actor = i.find_all(name='div',class_ = "movie-hover-title")[2].get_text().strip('\n').replace("\n","").replace(" ","").replace("主演:","") score = i.find("i",class_ = "integer").text + i.find("i",class_ = "fraction").text print("片名:" + name) print("排名:" + num) print("评分:" + score) print("演员:" + actor) print("类型:" + tag) print("上映时间:" + when) print() sum += 1 print("共爬虫{0}条数据".format(sum))

运行结果:

片名:我是真的讨厌异地恋
排名:8
评分:8.3
演员:任敏/辛云来/李孝谦
类型:爱情/青春/喜剧
上映时间:2022-04-29 18:00

片名:花束般的恋爱
排名:8
评分:8.9
演员:有村架纯/菅田将晖/细田佳央太
类型:剧情/爱情
上映时间:2022-02-22

片名:奇异博士2:疯狂多元宇宙
排名:9
评分:9.6
演员:本尼迪克特·康伯巴奇/伊丽莎白·奥尔森/迈克尔·斯图巴
类型:科幻/魔幻/惊悚
上映时间:2022-05-06

片名:长津湖之水门桥
排名:9
评分:9.6
演员:吴京/易烊千玺/朱亚文
类型:剧情/历史/战争
上映时间:2022-02-01 08:00

片名:名侦探柯南 万圣节的新娘
排名:7
评分:7.3
演员:高山南/三木真一郎/古谷彻
类型:动作/动画/悬疑
上映时间:2022-04-15

片名:可不可以你也刚好喜欢我
排名:7
评分:7.3
演员:曹佑宁/陈妤/林映唯
类型:爱情/青春
上映时间:2022-03-11 11:11

片名:神奇动物:邓布利多之谜
排名:7
评分:7.9
演员:埃迪·雷德梅恩/艾莉森·苏朵儿/裘德·洛
类型:奇幻/冒险/剧情
上映时间:2022-04-08

片名:熊出没·重返地球
排名:9
评分:9.4
演员:张秉君/张伟/谭笑
类型:动画/剧情/科幻
上映时间:2022-02-01 08:00

片名:边缘行者
排名:8
评分:8.2
演员:任贤齐/任达华/方中信
类型:犯罪/动作
上映时间:2022-04-15

片名:坏蛋联盟
排名:9
评分:9.1
演员:山姆·洛克威尔/秦昊/奥卡菲娜
类型:喜剧/动画/动作
上映时间:2022-04-29

片名:我要我们在一起
排名:8
评分:8.1
演员:屈楚萧/张婧仪/孙宁
类型:爱情/剧情
上映时间:2022-05-20 13:14

片名:奇迹·笨小孩
排名:9
评分:9.5
演员:易烊千玺/田雨/陈哈琳
类型:剧情
上映时间:2022-02-01 08:00

片名:新蝙蝠侠
排名:7
评分:7.9
演员:罗伯特·帕丁森/佐伊·克拉维兹/杰弗里·怀特
类型:动作/剧情/科幻
上映时间:2022-03-18

片名:精灵旅社4:变身大冒险
排名:9
评分:9.0
演员:布赖恩·哈尔/安迪·萨姆伯格/赛琳娜·戈麦斯
类型:喜剧/动画/奇幻/冒险
上映时间:2022-04-03 08:00

片名:邓小平小道
排名:8
评分:8.2
演员:卢奇/于慧/赵恒煊
类型:剧情/传记
上映时间:2022-04-22

片名:月球陨落
排名:8
评分:8.2
演员:哈莉·贝瑞/帕特里克·威尔森/约翰·布莱德利
类型:灾难/科幻
上映时间:2022-03-25 10:00

片名:365天:今时之欲
排名:8
评分:8.5
演员:迈克尔·莫罗内/安娜·玛丽亚·西克拉克/玛格达莱娜·朗帕斯卡
类型:剧情/爱情
上映时间:2022-04-27

片名:瞬息全宇宙
排名:8
评分:8.5
演员:杨紫琼/杰米·李·柯蒂斯/斯蒂芬妮·许
类型:喜剧/动作/奇幻
上映时间:2022-03-25

片名:新·奥特曼
排名:8
评分:8.5
演员:津田健次郎/斋藤工/长泽雅美
类型:科幻
上映时间:2022-05-13

片名:神秘海域
排名:8
评分:8.5
演员:汤姆·赫兰德/马克·沃尔伯格/索菲娅·阿里
类型:动作/冒险
上映时间:2022-03-14 09:00

片名:致我的陌生恋人
排名:8
评分:8.6
演员:弗朗索瓦·西维尔/约瑟芬·约比/本杰明·拉维赫尼
类型:喜剧/爱情
上映时间:2022-04-14 17:20

片名:这个杀手不太冷静
排名:9
评分:9.1
演员:马丽/魏翔/陈明昊
类型:喜剧
上映时间:2022-02-01 08:00

片名:喜羊羊与灰太狼之筐出未来
排名:9
评分:9.3
演员:祖晴/张琳/邓玉婷
类型:动画/喜剧
上映时间:2022-02-01 08:00

片名:四海
排名:8
评分:8.6
演员:刘昊然/刘浩存/沈腾
类型:喜剧/动作/爱情
上映时间:2022-02-01 08:00

片名:密室逃生2
排名:8
评分:8.4
演员:泰勒·拉塞尔/洛根·米勒/霍兰·罗登
类型:惊悚/动作/悬疑
上映时间:2022-04-02 18:00

片名:名侦探柯南 零的日常
排名:9
评分:9.1
演员:古谷彻/潘惠美/榎本充希子
类型:动画/悬疑
上映时间:2022-04-04

片名:误杀瞒天记
排名:9
评分:9.1
演员:阿贾耶·德乌干/塔布/施芮娅·萨兰
类型:剧情/悬疑
上映时间:2022-04-15 18:00

片名:亡命救护车
排名:8
评分:8.2
演员:杰克·吉伦哈尔/叶海亚·阿卜杜勒-迈丁/艾莎·冈萨雷斯
类型:动作/犯罪
上映时间:2022-04-22

片名:一点就到家
排名:9
评分:9.2
演员:刘昊然/彭昱畅/尹昉
类型:青春
上映时间:2022-04-30

片名:出拳吧,妈妈
排名:8
评分:8.4
演员:谭卓/田雨/田海蓉
类型:剧情
上映时间:2022-04-30

共爬虫30条数据

总结

这个文章主要讲Json,http协议和requests库的知识点,主要应用在爬虫和测试网页上。希望这些知识能够帮助到你,祝你阅读愉快~