杰瑞科技汇

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

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

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

目录

  1. 准备工作:安装 requests
  2. 核心概念:requests 的基本用法
    • 发送 GET 请求
    • 解析响应内容
    • 处理 URL 参数
    • 处理 Headers
    • 处理 Cookies
  3. 实战案例:爬取豆瓣电影 Top 250
    • 分析目标网页
    • 编写爬虫代码
    • 保存数据到文件
  4. 进阶技巧
    • 发送 POST 请求
    • 使用会话对象 (Session)
    • 处理动态加载网页 (与 Selenium 结合)
    • 设置代理
  5. 爬虫的“道”与“术”:重要提醒与最佳实践
    • robots.txt 协议
    • User-Agent (伪装浏览器)
    • 请求频率控制 (礼貌性爬虫)
    • 异常处理
    • 法律与道德

准备工作:安装 requests

如果你还没有安装 requests,可以通过 pip 来安装,打开你的终端或命令行工具,运行以下命令:

pip install requests

核心概念:requests 的基本用法

发送 GET 请求

GET 请求是最常见的请求方式,通常用于从服务器获取数据,使用 requests.get() 方法。

import requests
# 目标网址
url = 'https://www.httpbin.org/get' # 一个用于测试 HTTP 请求的网站
# 发送 GET 请求
response = requests.get(url)
# 检查请求是否成功 (状态码为 200)
print(f"状态码: {response.status_code}") 

服务器返回的响应对象 response 包含了丰富的信息。

  • response.text: 以字符串形式返回响应内容,自动解码。
  • response.content: 以字节形式返回响应内容,适合处理非文本内容(如图片、视频)。
  • response.json(): 如果响应内容是 JSON 格式,这个方法会将其解析为 Python 字典。
# 获取响应文本
html_content = response.text
print(f"响应文本 (前100个字符): {html_content[:100]}")
# 获取响应内容 (字节)
content_bytes = response.content
print(f"响应内容 (前100个字节): {content_bytes[:100]}")
# 如果响应是JSON格式
# response = requests.get('https://api.github.com/events')
# data = response.json()
# print(data[0]['actor']['login'])

处理 URL 参数

很多时候,我们需要在 URL 后面附加查询参数(?key1=value1&key2=value2),手动拼接 URL 既麻烦又容易出错。requests 提供了 params 参数来自动处理。

requests爬虫如何高效抓取数据?-图2
(图片来源网络,侵删)
# 目标URL,不带参数
base_url = 'https://www.httpbin.org/get'
# 参数字典
params = {
    'name': '张三',
    'age': 25
}
# 发送带参数的GET请求
response = requests.get(base_url, params=params)
# requests会自动将参数编码并拼接到URL上
print(f"最终请求的URL: {response.url}")

处理 Headers

有些网站会检查请求的 Headers,特别是 User-Agent,来判断请求是否来自浏览器,为了模拟真实浏览器,我们需要自定义 Headers

# 自定义Headers
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'
}
url = 'https://www.httpbin.org/get'
response = requests.get(url, headers=headers)
print(f"自定义Headers后的响应: {response.json()['headers']['User-Agent']}")

处理 Cookies

requests 会自动处理一些简单的 Cookie,如果需要手动设置或获取 Cookie,可以使用 cookies 参数。

# 设置Cookies
cookies_dict = {'my_cookie': 'hello'}
url = 'https://www.httpbin.org/cookies'
response = requests.get(url, cookies=cookies_dict)
print(response.json()) # 会输出 {'cookies': {'my_cookie': 'hello'}}
# 获取响应中的Cookies
response = requests.get('https://www.httpbin.org/cookies/set/test_cookie/12345')
print(response.cookies.get_dict()) # 会输出 {'test_cookie': '12345'}

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

这是一个非常经典的入门案例,可以帮助你理解爬虫的基本流程。

分析目标网页

  1. 打开豆瓣电影 Top 250 页面:https://movie.douban.com/top250
  2. 按下 F12 打开开发者工具,选择 "网络" (Network) 选项卡。
  3. 刷新页面,你会看到一个名为 ?start=0&filter= 的请求,这就是我们需要的。
  4. 点击这个请求,查看 "响应" (Response) 标签页,你会发现,每部电影的标题、评分、一句话简介等信息都在 HTML 源码中,以 <div class="item"> 为单位清晰排列。

编写爬虫代码

我们的目标是提取每部电影的排名、标题、评分和一句话简介。

requests爬虫如何高效抓取数据?-图3
(图片来源网络,侵删)
import requests
import time
def scrape_douban_top250():
    """
    爬取豆瓣电影Top250
    """
    # 1. 定义URL和Headers
    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 = []
    for start in range(0, 250, 25):  # 每页25条,共10页
        # 2. 构造带参数的URL
        params = {'start': start, 'filter': ''}
        print(f"正在爬取第 {start//25 + 1} 页...")
        try:
            # 3. 发送请求
            response = requests.get(url, headers=headers, params=params, timeout=10)
            # 4. 检查请求是否成功
            response.raise_for_status() # 如果状态码不是200,则抛出异常
            # 5. 解析HTML (这里使用简单的字符串查找,实际项目推荐使用BeautifulSoup)
            # 在真实项目中,强烈建议使用BeautifulSoup或lxml来解析HTML
            html = response.text
            # 简单提取信息 (注意:这种方法脆弱,网页结构一变就失效)
            # 使用BeautifulSoup会更健壮,这里为了演示简化了
            movie_items = html.find_all('div', class_='item')
            for item in movie_items:
                rank = item.find('em', class_='').text
                title = item.find('span', class_='title').text
                rating = item.find('span', class_='rating_num').text
                quote = item.find('span', class_='inq')
                quote_text = quote.text if quote else '无'
                movie_info = {
                    '排名': rank,
                    '标题': title,
                    '评分': rating,
                    '一句话简介': quote_text
                }
                all_movies.append(movie_info)
            # 6. 礼貌性爬虫:设置延时,避免对服务器造成过大压力
            time.sleep(2) # 每次请求后等待2秒
        except requests.exceptions.RequestException as e:
            print(f"请求失败: {e}")
            break
    return all_movies
if __name__ == '__main__':
    movies = scrape_douban_top250()
    # 7. 保存数据
    with open('douban_top250.txt', 'w', encoding='utf-8') as f:
        for movie in movies:
            f.write(f"排名: {movie['排名']}\n")
            f.write(f"标题: {movie['标题']}\n")
            f.write(f"评分: {movie['评分']}\n")
            f.write(f"简介: {movie['一句话简介']}\n")
            f.write("-" * 30 + "\n")
    print("爬取完成,结果已保存到 douban_top250.txt")

重要提示:上面的代码中,HTML解析部分使用了 find_all,这需要 BeautifulSoup 库,如果你没有安装,请先安装它:pip install beautifulsoup4,或者,为了专注于 requests,你可以先理解发送请求和获取响应的部分,HTML解析可以先跳过或使用更复杂的字符串操作。


进阶技巧

发送 POST 请求

POST 请求通常用于提交表单数据,使用 requests.post() 方法,并通过 datajson 参数传递数据。

url = 'https://www.httpbin.org/post'
data = {
    'username': 'test_user',
    'password': '123456'
}
response = requests.post(url, data=data)
print(response.json()) # 会返回你提交的数据

使用会话对象 (Session)

Session 对象可以在多个请求之间保持某些参数,cookies,当你需要登录一个网站并保持登录状态时,Session 非常有用。

# 创建一个Session对象
session = requests.Session()
# 第一次请求,可能获得cookie
session.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
# 第二次请求,会带上第一次获得的cookie
response = session.get('http://httpbin.org/cookies')
print(response.json()) # 会输出 {'cookies': {'sessioncookie': '123456789'}}

处理动态加载网页

是通过 JavaScript 动态加载的,requests 只能获取到初始的 HTML,无法执行 JS,这时需要使用 SeleniumPlaywright 等工具来模拟浏览器行为,获取完整的渲染后的页面。

设置代理

为了防止 IP 被封,可以使用代理服务器。

proxies = {
    'http': 'http://your_proxy_address:port',
    'https': 'https://your_proxy_address:port',
}
response = requests.get('http://example.com', proxies=proxies)

爬虫的“道”与“术”:重要提醒与最佳实践

编写爬虫不仅仅是技术活,更是一门艺术,需要遵守规则和道德。

robots.txt 协议

在爬取一个网站之前,请务必检查其根目录下的 robots.txt 文件(https://www.example.com/robots.txt),这个文件规定了哪些页面可以爬取,哪些不可以,遵守 robots.txt 是爬虫的基本礼貌。

User-Agent (伪装浏览器)

始终设置一个常见的 User-Agent,让服务器知道你是一个“正常的”浏览器访问者,而不是一个恶意脚本。

请求频率控制 (礼貌性爬虫)

不要在短时间内向同一个服务器发送大量请求,这会给对方服务器带来巨大压力,甚至可能导致你的 IP 被封禁,在两次请求之间加入一个合理的延时(如 time.sleep(1)time.sleep(5))。

异常处理

网络环境复杂多变,可能会遇到各种错误(如连接超时、DNS解析失败、服务器错误等),使用 try...except 块来捕获这些异常,让你的爬虫更加健壮。

try:
    response = requests.get(url, timeout=5)
    response.raise_for_status() # 检查HTTP错误
except requests.exceptions.RequestException as e:
    print(f"发生错误: {e}")

法律与道德

切勿爬取和传播个人隐私信息、国家机密或受版权保护的内容。 爬取数据前,请确认该数据的版权和使用权,你的行为不应违反任何法律法规,爬虫的目的是为了学习和获取公开信息,而不是进行恶意攻击或数据窃取。

希望这份详细的指南能帮助你掌握 requests 爬虫的核心技术!祝你学习愉快!

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