目录
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 requests
headers = {
'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 requests
import bs4
import re
from bs4 import BeautifulSoup
initUrl ='https://www.maoyan.com/films?yearId=17&showType=3&offset='
depth = 1
headers = {
'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 = 0
for 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库的知识点,主要应用在爬虫和测试网页上。希望这些知识能够帮助到你,祝你阅读愉快~