python爬虫利器requests初级版

python爬虫利器requests初级版_第1张图片
iu

参考

requests官方文档

Python爬虫利器一之Requests库的用法

前言

在看这篇文章之前你要对HTTP有较深以及全面的了解,不了解的可以参见我的博客:

Http协议-你需要收藏了

一篇文章带你搞懂HTTP

此外,requests属于第三方库,在python标准库中有与该库相同功能的库:urllib.request,二者的区别在于requests相对urllib.request来说较为上层,urllib.request是用c来开发的。其实二者之间的关系就像c语言中的系统函数与库函数。

在一般的开发中,使用requests即可,简单好用,值得推荐

安装与导入

pip install requests
import requests

发送Http请求

r = requests.get('url')
r = requests.post('url', data = {'key':'value'}) # post方法会上传数据,因此data参数是必须的
r = requests.delete("url")
r = requests.head("url")
r = requests.options("url")

响应对象:Response

如果了解HTTP协议,你应该知道响应报文这个概念,这里的Response对象包含的就是响应报文的内容

r.text         # HTML文本
r.encoding     # 响应内容的编码,可以修改
r.status_code  # 查看响应报文的状态码
r.url          # 查看请求url
r.headers      # 查看响应报文头
r.headers['Content-Type']
r.headers.get('content-type')

二进制响应内容

对于非文本请求,例如图片,视频等,你可以以字节的方式访问请求响应内容。

Requests 会自动为你解码 gzipdeflate 传输编码的响应数据。

r.content   # 以二进制的响应输出内容,适合图片,视频

JSON响应内容

有时我们请求的是一个JSON文件,这个时候我们需要使用解析文件

r.json()  # 如果 JSON 解码失败, r.json() 就会抛出一个异常。

原始响应内容?

r = requests.get('https://github.com/timeline.json', stream=True)
r.raw         # 获取来自服务器的原始套接字响应,请你确保在初始请求中设置了 stream=True

HTTP GET

1. 基本的Get请求

r = requests.get("url")

2. 向url中添加请求参数

  • 以字典形式传入url查询参数

    payload = {'key1': 'value1', 'key2': 'value2'}
    r = requests.get("http://httpbin.org/get", params=payload)
    

    则此时的URL就变成了:

    http://httpbin.org/get?key2=value2&key1=value1
    

    注意字典里值为 None 的键都不会被添加到 URL 的查询字符串里。

    如果此处看不懂的话,不妨到任意一个网站,在搜索栏中输入关键字,查看最终的url,你就会发现区别(前提是你得懂url的结构)

  • 将列表作为值传入

    payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
    r = requests.get('http://httpbin.org/get', params=payload)
    

    此时完整的url就变成了:

    http://httpbin.org/get?key1=value1&key2=value2&key2=value3
    

3. 向GET请求中添加请求头部

headers = {'content-type': 'application/json'}
r = requests.get("http://httpbin.org/get", params=payload, headers=headers)

注意: 所有的 header 值必须是 string、bytestring 或者 unicode。


HTTP POST

基本POST请求:发送表单形式数据

注意,在POST请求中,我们是一定要有请求参数的,而Get中是不一定需要请求参数的。

payload = {'key1': 'value1', 'key2': 'value2'}
payload = (('key1', 'value1'), ('key1', 'value2'))
response = requests.post("http://httpbin.org/post", data=payload)

传送JSON形式数据

payload = {'some': 'data'}
r = requests.post(url, data=json.dumps(payload))
或 r = requests.post(url, json=payload)  #2.4.2后支持

传送文件

files = {'file': open('filename', 'rb')}
r = requests.post(url, files=files)

状态码

r.status_code    # 查看响应状态吗
r.status_code = requests.codes.ok    #查看状态码是否ok

如果请求失败(返回的状态码不是202),则可以用r.raise_for_status()来抛出异常。

r.raise_for_status()
Traceback (most recent call last):
  File "requests/models.py", line 832, in raise_for_status
    raise http_error
requests.exceptions.HTTPError: 404 Client Error
  
# 当返回状态码为200时,该函数返回为None

Cookie

1. 发送Cookie

cookies = dict(cookies_are='working')
response = requests.get(url, cookies=cookies)

2.查看响应报文中的Cookie

response.cookies['cookie_name']

重定向和请求历史

默认情况下,除了 HEAD, Requests 会自动处理所有重定向。

可以使用响应对象的 history 方法来追踪重定向。

response.history
# 禁用重定向处理
response = requests.get('http://github.com', allow_redirects=False)
# 对HEAD启用重定向
response = requests.head('http://github.com', allow_redirects=True)

超时

所有的生产代码都应该使用这一参数。如果不使用,你的程序可能会永远失去响应:

requests.get('http://github.com', timeout=0.001)

timeout 并不是整个下载响应的时间限制,而是如果服务器在 timeout 秒内没有应答,将会引发一个异常.

错误和异常

  • 遇到网络问题(如:DNS 查询失败、拒绝连接等)时,Requests 会抛出一个 ConnectionError 异常。
  • HTTP 请求返回了不成功的状态码, Response.raise_for_status() 会抛出一个 HTTPError 异常。
  • 请求超时,则抛出一个 Timeout 异常。
  • 请求超过了设定的最大重定向次数,则会抛出一个 TooManyRedirects 异常。
  • Requests显式抛出的异常都继承自 requests.exceptions.RequestException

你可能感兴趣的:(python爬虫利器requests初级版)