爬虫入门学习(一)GET与POST请求
- 1. GET和POST请求
- 1.1GET和POST的简单理解
- 1.2 二者的区别
- 2. 请求头
- 2.1 请求头的概念
- 3 响应状态码
- 4 响应头
- 5 使用urllib实现请求
- 6 使用requests库实现请求
1. GET和POST请求
1.1GET和POST的简单理解
GET和POST都是向服务器请求网页内容。不过这两者的区别还是挺大的。
GET:把请求信息放在URL中,如在百度中搜索"Datawhale",那么https://www.baidu.com/s?wd=Datawhale,我们会发现提交的搜索词在URL中。
POST:把请求信息放在一个表单里,包含在请求体中,而不是放在URL中进行提交。
1.2 二者的区别
- GET请求的参数包含在URL中,数据可以在URL中看到,而POST的请求是通过表单的形式传输,包含在请求体中,不在URL中。
- GET请求提交的数据最多只有1024字节,而POST没有限制。
- 如果涉及到密码、隐私、大文件,我们通常使用POST的方式。
2. 请求头
2.1 请求头的概念
简单的说就是我们访问网页提交给服务器的信息,换句话说也就是服务器要给我们信息所要使用的附加信息。通常比较重要的信息是Cookie、Referer、User-Agent等。
- Acccept
请求报头域,用于指定客户端可以接受哪些类型的信息。 - Accept-Language
指定客户端可以接受的语言类型。 - Accept-Encoding
指定客户端可接受的内容编码。 - Host
用于指定请求资源主机的IP和端口号,其内容为请求URL的原始服务器或网关的位置。从HTTP 1.1版本开始,请求必须包含此内容。 - Cookie
同Cookies。是网站为了辨别用户进行会话跟踪二存储在用户本地的数据。它的主要作用是维持当前访问会话。 - Referer
用来标识这个请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理,如做来源统计、防盗链处理等。 - User-Agent
简称UA,它是一个特殊的字符串头,帮助服务器识别客户使用的操作系统及版本、浏览器及版本等信息。在伪装浏览器时需要加上此信息,否则会被识别禁止访问。 - Content-Type
也叫互联网媒体类型(Internet Media Type)或者MIME类型。在HTTP协议消息头中,它用来表示具体请求中的媒体类型信息。如:text/html代表HTML格式,image/gif代表GIF图片。
3 响应状态码
响应状态码代表服务器的相应状态。200代表服务器正常响应,给我们正常提供服务,403代表服务器拒绝了我们的请求,不给我们访问。所以分析相应状态码,保证状态码是200,我们才能进行下一步处理。否则直接忽略。下面列出常见的一些相应状态码。
状态码 | 说明 | 详情 |
200 | 成功 | 服务器成功返回了信息 |
301 | 永久移动 | 请求的网页已永久移动到新的位置,即永久重定向 |
302 | 临时移动 | 请求的网页暂时跳转到其他网页,即暂时重定向 |
305 | 使用代理 | 请求者应该使用代理访问该网页 |
307 | 临时重定向 | 请求的资源临时虫其他位置响应 |
400 | 错误请求 | 服务器无法解析该请求 |
401 | 未授权 | 请求没有进行身份验证或验证未通过 |
403 | 禁止访问 | 服务器拒绝此请求 |
404 | 未找到 | 服务器找不到请求的网页 |
405 | 方法禁用 | 服务器禁用了请求中指定的方法 |
408 | 请求超时 | 服务器请求超时 |
4 响应头
响应头包含了服务器对请求的应答信息。如Content-Type、Server、Set-Cookie等。
- Date
标识响应产生的时间。 - Last-Modified
指定资源的最后修改时间 - Content-Encoding
指定响应内容的编码 - Server
包含服务器的信息,比如名称、版本号等。 - Content-Type
文档类型,指定返回的数据类型是什么。 - Set-Cookie
设置Cookie。响应头中的Set-Cookie告诉浏览器需要将此内容放在Cookies中,下次请求携带Cookies请求。 - Expires
指定响应的过期时间,可以使代理服务器或浏览器将加载的内容更新到缓存中。如果再次访问时,就可以直接从缓存中加载,降低服务器负载,缩短加载时间。
5 使用urllib实现请求
因为考虑到请求工具中,requests库比urllib库更加Pythonic,个人更加推荐requests库。
关于urllib库的更多用法请参照官方教程 这里仅仅列出利用urllib实现GET和POST请求的示例。
# -*- coding: utf-8 -*-
"""
Created on Sun Apr 7 16:04:09 2019
@author: Jock
"""
import urllib.request
# 构建GET请求
f = urllib.request.urlopen("https://www.baidu.com")
print(f.read().decode('utf-8'))
# 构建POST请求
req = urllib.request.Request(url='http://httpbin.org/post',\
data=b'Datawhale') # 构建请求对象
with urllib.request.urlopen(req) as f:
print(f.read().decode('utf-8'))
6 使用requests库实现请求
在所有的请求库中requests,非常的强大和优雅,非常推荐使用requests库,而不是其他的请求库。requests库的官文文档有中文版本,非常友好,所以具体用法请参照官网文档 这里放出基于requests实现GET和POST请求的示例
# -*- coding: utf-8 -*-
"""
Created on Sun Apr 7 16:04:09 2019
@author: Jock
"""
import requests
# 构建GET请求
r = requests.get('https://www.baidu.com')
print(r.text[:500])
# 构建POST请求
r = requests.post('http://httpbin.org/post', data={'key':'value'})
print(r.text)