Requests库的基本使用

为什么要学习requests模块,而不是urllib
- requests的底层实现就是urllib
- requests在python2 和 python3 中通用, 方法完全一样
- requests简单易用
- requests能够自动帮助我们解压(gzip压缩的等)响应内容

requests模块发送简单的get请求并获取响应

# 需求: 通过requests向百度首页发送请求,获取百度首页的数据.
import requests
# 向目标url发送get请求
r = requests.get("http://www.baidu.com")
# 打印响应内容 r -> response 指的是响应
print(r.content)

requests的常用属性:

r.text            响应体 str类型
 r.content         响应体 bytes类型
 r.status_code     响应的状态码
 r.request.headers 响应所对应的请求头信息   
 r.headers         响应头信息
 r.request.cookies 响应头对应的请求的cookie
 r.cookies         响应的cookie

获取网页源码的通用方式:

  1. r.content.decode()
  2. r.content.decode(“GBK”)
  3. r.text

以上三种方法从前往后尝试,可以解决所有的网页解码问题.

小练习:
我们来把百度上的图片保存到本地

思考:
- 以什么方式打开文件
- 保存什么格式的内容

分析:
- 图片的url: https://www.baidu.com/img/bd_logo1.png
- 利用requests模块发送请求获取响应
- 以2进制写入的方式打开文件,并将response响应的二进制内容写入

import requests
# 图片的url
url = 'https://www.baidu.com/img/bd_logo1.png' 

# 响应本身就是一个图片,并且是二进制类型
response = requests.get(url) 

# print(response.content)

# 以二进制+写入的方式打开文件
with open('baidu.png', 'wb') as f: 
# 写入response.content bytes二进制类型
    f.write(response.content)

发送带header的请求
首先我们写一个获取百度首页的代码

import requests

url = 'https://www.baidu.com'

response = requests.get(url)

print(response.content)

# 打印响应对应请求的请求头信息
print(response.request.headers)

我们可以在浏览器中右键->获取源代码来对比一下百度首页的源代码和我们获取的源代码有什么不同
为什么请求需要带上header?
目的: 模拟浏览器,欺骗服务器,获取和浏览器一致的内容
header的形式:字典

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

用法

requests.get(url, headers=headers)

完整的代码

import requests

url = 'https://www.baidu.com'

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

# 在请求头中带上User-Agent,模拟浏览器发送请求
response = requests.get(url, headers=headers) 

# print(response.content)

# 打印请求头信息
print(response.request.headers)

发送带参数的请求
例1: http://www.webkaka.com/tutorial/server/2015/021013/

例2:https://www.baidu.com/s?wd=python&a=c
例1中没有请求参数!例2中?后边的就是请求参数
请求参数的形式:字典

kw = {'wd':'长城'}

请求参数的用法

requests.get(url,params=kw)

关于参数的注意点
在url地址中, 很多参数是没有用的,比如百度搜索的url地址,其中参数只有一个字段有用,其他的都可以删除 如何确定那些请求参数有用或者没用:挨个尝试! 对应的,在后续的爬虫中,越到很多参数的url地址,都可以尝试删除参数

两种方式:发送带参数的请求

  1. https://www.baidu.com/s?wd=python发起请求可以使用requests.get(url, params=kw)的方式
# 方式一:利用params参数发送带参数的请求
import requests

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
# 这是目标url
# url = 'https://www.baidu.com/s?wd=python' 

# 最后有没有问号结果都一样
url = 'https://www.baidu.com/s?' 

# 请求参数是一个字典 即wd=python
kw = {'wd': 'python'} 

# 带上请求参数发起请求,获取响应

response = requests.get(url, headers=headers, params=kw) 

# 当有多个请求参数时,requests接收的params参数为多个键值对的字典,比如 '?wd=python&a=c'-->{'wd': 'python', 'a': 'c'}

print(response.content)

也可以直接对https://www.baidu.com/s?wd=python完整的url直接发送请求,不使用params参数

# 方式二:直接发送带参数的url的请求
import requests

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

url = 'https://www.baidu.com/s?wd=python'

# kw = {'wd': 'python'}

# url中包含了请求参数,所以此时无需params
response = requests.get(url, headers=headers)

小练习(手动滑稽)
实现任意贴吧的爬虫,保存网页到本地