Requests 是一个用于发送 HTTP 请求的简单易用的 Python 库。它能够处理多种 HTTP 请求方法,如 GET、POST、PUT、DELETE 等,并简化了 HTTP 请求流程。对于想要进行网络爬虫或 API 调用的开发者来说,Requests 是一个非常有用的工具。在今天的博客中,我将介绍 Requests 的基本用法,并提供一个合理的爬虫实例。
一.安装 Requests
在使用 Requests 库之前,您需要安装它。可以通过 pip 命令来安装:
pip install requests
在国内安装的速度很慢,所以我们可以修改为国内镜像源安装比如说清华大学镜像源:
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
你也可以选择其他镜像源,如阿里云、华为云等,替换 -i
参数后的 URL。
二.基本用法
Requests 提供了简单的接口来处理 HTTP 请求和响应。我们将从最基本的 GET 请求和 POST 请求开始。
1.GET 请求
GET 请求用于从服务器获取数据。可以通过 ' requests.get() ' 方法来实现。以下是一个简单的例子,通过get请求豆瓣影评:
import requests
# 发送GET请求
response = requests.get('https://movie.douban.com/review/best/')
print(response.status_code) # 输出状态码
print(response.text) # 输出响应内容
当然由于豆瓣有简单的反爬虫设置,所以我们这样直接发送请求很容易就会被网站限制,不要轻易尝试。
2.POST 请求
POST 请求用于向服务器发送数据,通常用于提交表单或上传文件,可以通过 `requests.post()` 方法来实现。
import requests
data = {'title': 'foo', 'body': 'bar', 'userId': 1}
response = requests.post('https://jsonplaceholder.typicode.com/posts', json=data)
print(response.status_code)
print(response.json()) # 输出响应的 JSON 数据
三.处理响应
Requests 库提供了多种方法来处理 HTTP 响应:
response.text
:以字符串形式获取响应内容。
response.json()
:以 JSON 格式解析响应内容。
response.content
:以二进制形式获取响应内容。
response.status_code
:获取 HTTP 状态码。
response.headers
:获取响应头信息。
四.处理简单的反爬
添加请求头
通过设置请求头将requests库的请求伪装成浏览器请求:
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
'Referer': 'https://www.example.com',
'Content-Type': 'application/json'
}
response = requests.get('https://api.example.com/data', headers=headers)
在许多情况下,自定义请求头是必需的。大多数网站至少都会有简单的爬虫检测,虽然这样只能应付最简单的反爬策略,但是也是最常用的伪装方法了。
五.爬虫实例
下面是一个简单的爬虫实例,使用 Requests 库从豆瓣网爬取影评的标题和简介:
import re
import requests
# 定义要爬取的URL
url = 'https://movie.douban.com/review/best/'
# 设置请求头部,以模拟浏览器访问
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/127.0.0.0 Safari/537.36"
}
# 发送HTTP GET请求以获取网页内容
response = requests.get(url, headers=headers)
# 提取响应的HTML内容
con = response.text
# 初始化存储数据的容器
title_datas = []
synopsis_datas = []
# 使用正则表达式提取评论标题
titles = re.findall('<h2><a href="https://movie.douban.com/review/.*?">(.*?)</a></h2>', con)
for title in titles:
title_datas.append(title) # 将标题添加到标题列表中
# 使用正则表达式提取评论内容
datas = re.findall('''<div id=".*?" class=".*?" data-rid=".*?">
<div class="short-content">.*?
(.*?)\n
\(<a href="javascript:;" id=".*?" class="unfold" title="展开">展开</a>\)
</div>
</div>''', con, re.S)
# 清理提取的评论内容
for data in datas:
# 移除HTML标签
clean_data = re.sub(r'<p .*?>.*?</p>', '', data)
# 将多个空白字符替换为单个空格,并去除前后的空白
clean_data = re.sub(r'\s+', ' ', clean_data).strip()
synopsis_datas.append(clean_data) # 将清理后的评论内容添加到列表中
# 将标题和评论内容配对存储到字典中
items = {}
for i in range(len(title_datas)):
items[title_datas[i]] = synopsis_datas[i]
# 打印结果
print(items)
导入库:
import re
:用于处理正则表达式。
import requests
:用于发送HTTP请求并获取网页内容。定义URL和请求头:
url
:目标网页的地址。
headers
:模拟浏览器请求的头部信息,防止被网站屏蔽。发送请求并获取网页内容:
requests.get(url, headers=headers)
:发送GET请求获取网页数据。
response.text
:获取响应的HTML文本内容。初始化数据存储容器:
title_datas
:存储提取的评论标题。
synopsis_datas
:存储提取的评论内容。提取评论标题:
re.findall
:使用正则表达式提取标题。将标题添加到
title_datas
列表中。提取评论内容:
re.findall
:使用正则表达式提取评论内容。
re.sub
:移除HTML标签并清理多余空白。配对标题和评论内容:
使用
for
循环将标题和内容配对,并存储在items
字典中。打印结果:
输出字典
items
,显示标题和评论内容的配对结果。
当然这里的实例写的并不是很好,只能给大家提供一个参考,大家爬取数据还是要基于网页分析,编写代码。
六.结论
注意事项:
- 遵守 robots.txt:在爬取任何网站之前,检查其
robots.txt
文件,确保你的爬虫行为符合网站的爬虫协议。- 频率控制:不要过于频繁地访问目标网站,以免对服务器造成负担。可以通过
time.sleep()
控制请求频率。- 异常处理:在编写爬虫时,考虑到网络请求可能会失败,建议添加异常处理机制来保证程序的健壮性。
Requests 是一个功能强大且易于使用的库,适用于各种 HTTP 请求操作。通过灵活设置请求头和使用不同的请求方法,我们可以轻松实现复杂的网络请求任务。使用 Requests 库进行网络请求和数据抓取是一个强大且简单的方式。掌握其基础用法后,可以更高效地进行 API 调用和网页数据抓取。