杰瑞科技汇

Python爬虫requests如何高效抓取数据?

requests 是 Python 中最流行、最易用的 HTTP 库,它极大地简化了发送 HTTP 请求和处理响应的过程,相比于 Python 内置的 urllib 库,requests 的 API 更加直观和人性化。

Python爬虫requests如何高效抓取数据?-图1
(图片来源网络,侵删)

目录

  1. requests 简介
  2. 安装 requests
  3. requests 基础用法
    • 发送 GET 请求
    • 解析响应内容
    • 处理 URL 参数
    • 设置请求头
  4. 爬虫核心流程
  5. 实战案例:爬取豆瓣 Top 250 电影
  6. 进阶技巧
    • 处理动态网页(结合 Selenium
    • 数据存储(CSV, JSON)
    • 避免被封禁(设置 User-Agent, 代理 IP, 延时)

requests 简介

requests 库的主要功能是模拟浏览器向服务器发送 HTTP 请求,并获取服务器的响应,它支持多种请求方法,如 GET、POST、PUT、DELETE 等,并能轻松处理 cookies、session、文件上传等。

核心优势:

  • 简洁易用:API 设计非常直观,几行代码就能完成复杂的 HTTP 请求。
  • 功能强大:支持自动解码响应内容、处理流式请求、文件上传、会话管理等。
  • 社区活跃:文档完善,遇到问题很容易找到解决方案。

安装 requests

在使用之前,你需要先安装它,打开你的终端或命令行工具,运行以下命令:

pip install requests

requests 基础用法

1 发送 GET 请求

GET 请求是最常见的请求方式,通常用于从服务器获取数据。

Python爬虫requests如何高效抓取数据?-图2
(图片来源网络,侵删)
import requests
# 目标 URL
url = 'https://www.httpbin.org/get' # 一个用于测试 HTTP 请求的网站
try:
    # 发送 GET 请求
    response = requests.get(url)
    # 检查请求是否成功 (状态码为 200)
    response.raise_for_status() # 如果状态码不是 200,会抛出异常
    # 打印响应内容
    print("请求成功!")
    print("状态码:", response.status_code)
    print("响应头:", response.headers)
    print("响应内容 (文本):", response.text)
except requests.exceptions.RequestException as e:
    print(f"请求发生错误: {e}")

2 解析响应内容

requests 的响应对象 response 提供了多种方式来获取内容:

  • response.text:以字符串形式返回响应内容。requests 会根据 HTTP 头部信息自动解码。
  • response.content:以字节形式返回响应内容,适合处理图片、音频等二进制文件。
  • response.json():如果响应内容是 JSON 格式,这个方法会直接将其解析为 Python 的字典或列表。这是最常用、最方便的方式。

示例:

import requests
import json # json 库用于手动对比
url = 'https://www.httpbin.org/json'
response = requests.get(url)
# 使用 .json() 方法
data = response.json()
print("使用 .json() 解析:")
print(data['slideshow']['author'])
# 对比手动解析
# manual_data = json.loads(response.text)
# print("\n手动解析:")
# print(manual_data['slideshow']['author'])

3 处理 URL 参数

当你需要向 URL 传递查询参数时(?key1=value1&key2=value2),可以直接使用 params 参数,requests 会帮你自动构建 URL。

import requests
# 目标基础 URL
base_url = 'https://www.httpbin.org/get'
# 要传递的参数
params = {
    'name': '张三',
    'age': 25,
    'city': '北京'
}
# 发送带参数的 GET 请求
response = requests.get(base_url, params=params)
# 打印最终的 URL
print("最终请求的 URL:", response.url)
# 打印响应内容
print("响应内容:", response.json()['args'])

4 设置请求头

有些网站会检查请求头,如果发现请求头中没有 User-Agent(浏览器标识),可能会拒绝访问,设置一个常见的 User-Agent 是爬虫的基本操作。

Python爬虫requests如何高效抓取数据?-图3
(图片来源网络,侵删)
import requests
url = 'https://www.httpbin.org/get'
# 设置请求头
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-Language': 'zh-CN,zh;q=0.9,en;q=0.8'
}
response = requests.get(url, headers=headers)
print("响应头中的 User-Agent:", response.json()['headers']['User-Agent'])

爬虫核心流程

一个简单的爬虫通常遵循以下步骤:

  1. 确定目标:明确要爬取哪个网站、哪些页面、哪些信息。
  2. 分析网页:使用浏览器开发者工具(F12)查看目标网页的结构,找到数据所在的 HTML 标签。
  3. 发送请求:使用 requests 库向目标 URL 发送 HTTP 请求。
  4. 获取响应:获取服务器返回的 HTML 内容(通常是 response.text)。
  5. 解析数据:使用解析库(如 BeautifulSouplxml)从 HTML 中提取所需信息。
  6. 存储数据:将提取的数据保存到文件(如 CSV、JSON)或数据库中。
  7. 遍历与循环:如果需要爬取多个页面,则构造下一页的 URL,重复步骤 3-6。

实战案例:爬取豆瓣 Top 250 电影

我们将爬取豆瓣电影 Top 250 的电影名称、评分和一句话评语。

准备工作:

  1. 安装 requestsbeautifulsoup4(一个强大的 HTML 解析库)。
    pip install requests beautifulsoup4
  2. 分析豆瓣 Top 250 的网页结构,找到电影信息所在的 div

代码实现:

import requests
from bs4 import BeautifulSoup
import time
def get_douban_top250():
    """
    爬取豆瓣电影 Top 250 的信息
    """
    # 目标 URL
    base_url = 'https://movie.douban.com/top250'
    # 设置请求头,模拟浏览器访问
    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'
    }
    # 用于存储所有电影信息
    all_movies = []
    # 循环爬取 10 页数据 (每页 25 条)
    for start in range(0, 250, 25):
        # 构造每页的 URL
        url = f'{base_url}?start={start}'
        print(f'正在爬取: {url}')
        try:
            # 发送 GET 请求
            response = requests.get(url, headers=headers)
            response.raise_for_status() # 检查请求是否成功
            # 使用 BeautifulSoup 解析 HTML
            soup = BeautifulSoup(response.text, 'html.parser')
            # 找到所有包含电影信息的 <div> 标签 (class="item")
            movie_list = soup.find_all('div', class_='item')
            for movie in movie_list:
                # 提取电影名称
                title = movie.find('span', class_='title').text
                # 提取评分
                rating = movie.find('span', class_='rating_num').text
                # 提取一句话评语 (处理可能不存在的情况)
                quote = movie.find('span', class_='inq')
                quote_text = quote.text if quote else '无'
                # 将电影信息添加到列表
                all_movies.append({
                    'title': title,
                    'rating': rating,
                    'quote': quote_text
                })
            # 礼貌性延时,避免请求过于频繁
            time.sleep(1)
        except requests.exceptions.RequestException as e:
            print(f'请求失败: {e}')
            break
    return all_movies
if __name__ == '__main__':
    movies = get_douban_top250()
    # 打印结果
    for movie in movies:
        print(f"电影: {movie['title']}, 评分: {movie['rating']}, 评语: {movie['quote']}")
    # 你可以将 movies 列表保存到文件或数据库中
    print(f"\n总共爬取了 {len(movies)} 部电影。")

进阶技巧

1 处理动态网页

有些网站(如淘宝、微博)的内容是通过 JavaScript 动态加载的,requests 只能获取到初始的 HTML,看不到动态加载的内容,这时需要使用 SeleniumPlaywright 等工具来模拟浏览器行为,等待 JS 渲染完成后再获取 HTML。

2 数据存储

将爬取的数据保存下来是爬虫的最终目的。

  • 保存为 CSV: 使用 Python 内置的 csv 模块。

    import csv
    with open('movies.csv', 'w', newline='', encoding='utf-8-sig') as f:
        writer = csv.DictWriter(f, fieldnames=['title', 'rating', 'quote'])
        writer.writeheader()
        writer.writerows(movies)
  • 保存为 JSON: 使用 json 模块。

    import json
    with open('movies.json', 'w', encoding='utf-8') as f:
        json.dump(movies, f, ensure_ascii=False, indent=4)

3 避免被封禁

大规模爬取网站时,如果不加控制,很容易被服务器识别并封禁 IP,以下是一些反反爬策略:

  1. 设置 User-Agent:如前所述,伪装成浏览器。
  2. 使用代理 IP:通过代理服务器发送请求,隐藏真实 IP,可以购买代理 IP 服务或使用免费代理(免费代理通常不稳定)。
    proxies = {
        'http': 'http://your_proxy_ip:port',
        'https': 'https://your_proxy_ip:port',
    }
    response = requests.get(url, proxies=proxies)
  3. 控制访问频率:在两次请求之间加入随机延时。
    import random
    time.sleep(random.uniform(1, 3)) # 随机延时 1 到 3 秒
  4. 使用 SessionSession 对象可以在多次请求之间保持 cookies,适用于需要登录的网站。
    s = requests.Session()
    s.get('https://www.example.com/login', headers=headers) # 模拟登录
    response = s.get('https://www.example.com/profile', headers=headers) # 访问需要登录的页面

requests 是 Python 爬虫的基石,它让发送 HTTP 请求变得异常简单,结合 BeautifulSoup 进行 HTML 解析,你可以高效地完成绝大多数静态网站的爬取任务。

编写爬虫时,请务必遵守网站的 robots.txt 协议,并控制好爬取频率,做一个有礼貌的爬虫开发者。

分享:
扫描分享到社交APP
上一篇
下一篇