Home » Python » Python爬虫: Requests库详解

Python爬虫: Requests库详解

·

引言

在互联网时代,数据获取已成为各行各业的重要需求。Python凭借其简洁的语法和丰富的生态系统,成为了网络爬虫开发的首选语言。在众多Python爬虫工具中,Requests库以其简单易用的特点,被誉为”HTTP for Humans”,是每个爬虫开发者的必备工具。本文将详细介绍这个强大的HTTP请求库,帮助初学者快速掌握网络爬虫的基础技能。

Requests库简介

功能特点

Requests库是Python生态系统中最受欢迎的HTTP客户端库,它的主要优点包括:

  1. 简洁的API设计:告别繁琐的urllib3操作,一行代码即可完成HTTP请求
  2. 自动化的常用操作
    • Cookie管理
    • 会话持久化
    • 自动解码
    • 重定向处理
  3. 完善的异常处理:提供清晰的异常体系
  4. 强大的功能扩展:支持自定义身份验证、代理设置等

工作原理

Requests库基于urllib3实现,其工作流程如下:

  1. 接收用户请求参数
  2. 构建标准的HTTP请求
  3. 发送请求到服务器
  4. 接收服务器响应
  5. 处理响应数据
  6. 返回Response对象

安装方法

打开命令行终端,输入以下命令即可安装Requests库:

pip install requests

安装完成后,可以通过以下代码验证安装是否成功:

import requests
print(requests.__version__)

Requests库的基本使用

1. 发送GET请求

GET请求是最常用的HTTP请求方法,用于从服务器获取数据。以下是几个常用的GET请求示例:

import requests

# 发送简单的GET请求
response = requests.get('https://api.github.com')
print(response.status_code)  # 输出状态码,200表示请求成功

这段代码展示了最基本的GET请求。requests.get()方法向指定URL发送请求,返回一个Response对象。通过检查status_code属性,我们可以知道请求是否成功。

带参数的GET请求示例:

# 使用params参数传递查询参数
params = {
    'q': 'python',
    'sort': 'stars',
    'order': 'desc'
}
response = requests.get('https://api.github.com/search/repositories', params=params)
print(response.url)  # 查看实际请求的URL

这个例子展示了如何添加URL参数。params参数接受一个字典,Requests会自动将其转换为URL查询字符串。这种方式比手动拼接URL更安全且更容易维护。

2. 自定义请求头

在爬虫开发中,自定义请求头是一个重要的技巧,可以帮助我们模拟浏览器行为:

# 设置自定义请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8'
}

response = requests.get('https://www.python.org', headers=headers)
print('请求成功' if response.status_code == 200 else '请求失败')

这段代码展示了如何设置请求头。通过设置User-Agent,我们可以让服务器认为请求来自真实的浏览器,这对于一些反爬虫网站很有用。

3. 发送POST请求

POST请求通常用于向服务器提交数据,以下是几个常见的POST请求示例:

# 发送表单数据
login_data = {
    'username': 'test_user',
    'password': 'test_password'
}
response = requests.post('https://httpbin.org/post', data=login_data)
print(response.json())  # 打印服务器返回的JSON数据

# 发送JSON数据
json_data = {
    'name': 'Python爬虫',
    'description': '使用Requests库发送POST请求'
}
response = requests.post('https://httpbin.org/post', json=json_data)
print(response.json())

这个例子展示了两种常见的POST请求场景:

  • 使用data参数发送表单数据
  • 使用json参数发送JSON数据

Requests会自动设置适当的Content-Type请求头。

4. 处理响应内容

Requests提供了多种方式来处理服务器的响应:

response = requests.get('https://api.github.com')

# 1. 获取文本内容
print(response.text)  # 返回Unicode字符串

# 2. 获取二进制内容
print(response.content)  # 返回字节串,适用于下载图片等二进制文件

# 3. 获取JSON内容
print(response.json())  # 自动将JSON响应解码为Python对象

# 4. 获取响应头
for key, value in response.headers.items():
    print(f'{key}: {value}')

# 5. 获取响应状态码
print(response.status_code)

# 6. 获取编码信息
print(response.encoding)

这段代码展示了如何处理不同类型的响应内容。根据需要,我们可以选择合适的方法来获取数据。

5. 文件上传和下载

Requests也支持文件的上传和下载操作:

# 上传文件
files = {
    'file': ('test.txt', open('test.txt', 'rb'), 'text/plain')
}
response = requests.post('https://httpbin.org/post', files=files)

# 下载文件
response = requests.get('https://example.com/image.jpg', stream=True)
if response.status_code == 200:
    with open('image.jpg', 'wb') as f:
        for chunk in response.iter_content(1024):
            f.write(chunk)

这个例子展示了:

  • 如何上传文件:使用files参数
  • 如何下载大文件:使用stream=Trueiter_content()方法进行分块下载

实际案例:获取热门GitHub仓库信息

下面是一个完整的实例,展示如何使用Requests库获取GitHub上Python相关的热门仓库信息:

import requests
import time
from datetime import datetime

def get_trending_repos(language='python', since='daily'):
    """
    获取GitHub趋势仓库信息
    
    参数:
    language: 编程语言
    since: 时间范围(daily/weekly/monthly)
    """
    # 构建请求URL和头信息
    url = f'https://api.github.com/search/repositories'
    headers = {
        'User-Agent': 'Python-Requests-Tutorial',
        'Accept': 'application/vnd.github.v3+json'
    }
    
    # 构建查询参数
    query = f'language:{language} '
    params = {
        'q': query,
        'sort': 'stars',
        'order': 'desc',
        'per_page': 10
    }
    
    try:
        # 发送请求
        response = requests.get(url, headers=headers, params=params)
        response.raise_for_status()  # 检查请求是否成功
        
        # 解析响应数据
        repos = response.json()['items']
        
        # 格式化输出
        print(f"====== GitHub {language} 热门仓库 ======\n")
        
        for repo in repos:
            print(f"仓库名称:{repo['full_name']}")
            print(f"描述:{repo['description']}")
            print(f"Star数:{repo['stargazers_count']}")
            print(f"Fork数:{repo['forks_count']}")
            print(f"最后更新:{datetime.strptime(repo['updated_at'], '%Y-%m-%dT%H:%M:%SZ').strftime('%Y-%m-%d %H:%M:%S')}")
            print("-" * 50 + "\n")
            
        return True
            
    except requests.exceptions.RequestException as e:
        print(f"请求失败:{e}")
        return False
        
    except KeyError as e:
        print(f"数据解析失败:{e}")
        return False

# 使用示例
if __name__ == '__main__':
    get_trending_repos()
    
    # 添加延时,避免请求过于频繁
    time.sleep(1)

这个实例展示了一个完整的爬虫程序,包含了以下要点:

  1. 合理的函数结构设计
  2. 完善的异常处理
  3. 请求头的设置
  4. 参数的构建和传递
  5. 响应数据的解析和格式化
  6. 适当的延时处理

注意事项和最佳实践

  1. 请求频率控制
    • 使用time.sleep()添加适当的延时
    • 考虑使用随机延时避免固定模式
    • 遵守网站的robots.txt规定
  2. 异常处理
try:
    response = requests.get(url, timeout=5)
    response.raise_for_status()
except requests.exceptions.Timeout:
    print("请求超时")
except requests.exceptions.HTTPError as e:
    print(f"HTTP错误:{e}")
except requests.exceptions.RequestException as e:
    print(f"请求异常:{e}")
  1. 会话管理
with requests.Session() as session:
    session.headers.update({'User-Agent': 'Custom User Agent'})
    response = session.get(url)

相关资源

总结

Requests库是Python爬虫开发中最基础且最重要的工具之一。通过本文的学习,读者应该已经掌握了:

  1. Requests库的基本用法
  2. 如何发送各种类型的HTTP请求
  3. 如何处理响应数据
  4. 异常处理的最佳实践
  5. 实际爬虫案例的开发方法

在使用过程中,请始终记住:

  • 遵守网站的使用条款和robots.txt规范
  • 控制请求频率,避免对目标网站造成压力
  • 合理使用异常处理和超时机制
  • 注意数据的合法性和使用规范

通过不断的实践和探索,相信你会发现Requests库还有更多强大的功能等待发掘。让我们在遵守规范的前提下,充分利用这个强大的工具,创造更多有价值的应用。

关注我们,每天推荐一款实用的Python爬虫工具