手把手讲清楚 requests 库的核心用法、多页遍历策略、代理配置与异常处理,适合有 Python 基础的初学者。

目录

  1. 爬虫是什么,能做什么
  2. 发送第一个 GET 请求
  3. 多页遍历的两种写法
  4. 为什么需要 User-Agent
  5. 使用代理隐藏 IP
  6. 超时与异常处理
  7. 处理 HTTPS 与 JSON 响应
  8. 代理匿名度等级

①爬虫是什么,能做什么

网络爬虫(Web Crawler)本质上是一段自动发送 HTTP 请求、接收响应并保存内容的程序。浏览器打开网页时做的事,爬虫用代码重演一遍。常见场景:批量下载图片、采集价格数据、监控页面变动、构建搜索索引等。

Python 的 requests 库是最常用的 HTTP 客户端,安装方式:pip install requests。更复杂的场景(渲染 JS)需要 Selenium 或 Playwright,本文聚焦静态页面。

②发送第一个 GET 请求

最简单的爬虫只需几行:构造 URL、带上 Headers、发送请求、保存响应内容。

import requests

def main():
    url = "http://example.com/list/page-1/"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                      "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120"
    }
    resp = requests.get(url=url, headers=headers)

    with open("page.html", "wb") as f:
        f.write(resp.content)  # content 是原始字节,text 是解码后字符串

if __name__ == "__main__":
    main()

**resp.content vs resp.text:**content 返回 bytes,适合保存 HTML/图片等;text 返回字符串(自动按响应编码解码),适合直接处理文本。

③多页遍历的两种写法

网站内容往往分页,URL 规律通常是某个数字递增。利用 Python 字符串格式化可以批量生成 URL。

写法 A:先生成列表,再遍历

url_tpl = "http://example.com/list/page-{}-0/"
url_list = [url_tpl.format(i) for i in range(1, 15)]  # 生成第1-14页

for idx, url in enumerate(url_list):
    resp = requests.get(url=url, headers=headers)
    with open(f"page_{idx}.html", "wb") as f:
        f.write(resp.content)

写法 B:直接在循环中构造 URL

for i in range(1, 15):
    url = url_tpl.format(i)
    resp = requests.get(url=url, headers=headers)
    with open(f"page_{i}.html", "wb") as f:
        f.write(resp.content)

两种写法功能等价。写法 A 适合需要预处理 URL 列表(如去重、洗牌)的场景;写法 B 更简洁,适合顺序爬取。实际项目中还应加入 time.sleep(1) 控制频率,避免对服务器造成压力。

④为什么必须设置 User-Agent

服务器通过请求头中的 User-Agent 字段判断访问者是浏览器还是爬虫。不设置时,requests 默认发送 python-requests/x.x.x,很容易被识别并拦截(返回 403 或空内容)。

将 UA 设置为常见浏览器字符串,是最基础的反反爬措施。进阶做法是维护一个 UA 列表,每次请求随机选取,进一步降低被识别概率。

⑤使用代理隐藏真实 IP

高频爬取同一网站时,源 IP 可能被封禁。代理服务器作为中间人,让请求看起来来自不同地址。

# HTTP 代理
proxies = {"http": "http://代理IP:端口", "https": "http://代理IP:端口"}

# SOCKS5 代理(需安装 pip install requests[socks])
proxies = {"http": "socks5://代理IP:端口", "https": "socks5://代理IP:端口"}

resp = requests.get(url, headers=headers, proxies=proxies, timeout=5)

免费代理(如快代理 kuaidaili.com/free)稳定性差、速度慢,仅供学习测试。生产环境建议购买付费代理池,或自建代理池定期验证可用性。

⑥超时与异常处理

网络请求天然不可靠,必须设置超时并捕获异常,否则程序可能无限等待或崩溃退出。

import requests

def fetch(url, headers, proxies=None):
    try:
        resp = requests.get(
            url=url,
            headers=headers,
            proxies=proxies,
            timeout=5          # 连接+读取超时,单位秒
        )
        if resp.status_code == 200:
            return resp.content
        else:
            print(f"请求失败,状态码:{resp.status_code}")
    except requests.exceptions.Timeout:
        print("请求超时,跳过")
    except requests.exceptions.ProxyError:
        print("代理不可用")
    except Exception as e:
        print(f"未知错误:{e}")
    return None

timeout 可以传元组 (connect_timeout, read_timeout),例如 timeout=(3, 10) 表示连接超时 3 秒、读取超时 10 秒,更加精细。

⑦处理 HTTPS 与 JSON 响应

requests 对 HTTPS 的处理与 HTTP 完全一致,直接使用 https:// 地址即可。若遇到 SSL 证书错误(自签名证书),可临时关闭验证(不推荐用于生产):

resp = requests.get(url, headers=headers, verify=False)  # 关闭 SSL 验证

当接口返回 JSON 格式数据时,无需手动解析:

resp = requests.get(api_url, headers=headers)
data = resp.json()  # 自动解析为 Python dict/list
print(data["items"])

⑧代理匿名度等级

代理并非铁板一块,服务器获取到的信息量因代理类型而异:

类型服务器是否知道你用了代理服务器获取的 IP适用场景
透明代理知道 高风险真实 IP不适合反爬
匿名代理知道 中等代理 IP(知道你用了代理)一般场景
混淆代理知道 中等伪造的假 IP干扰追踪
高匿代理不知道 推荐代理 IP(无法发现代理)高频爬取

购买代理时优先选择高匿代理(Elite Proxy)。同时配合随机 User-Agent、控制请求频率、处理 Cookie,可以显著提升爬虫的存活率。


✓小结

核心库必须携带反封 IP稳定性
requestsUser-Agent代理池超时 + 异常

一个可用的爬虫,最低限度需要:正确的请求头、合理的超时设置、异常捕获三件套。在此基础上叠加代理、Cookie 管理、频率控制,才能应对各种反爬场景。后续文章将进一步介绍 Cookie 登录、BeautifulSoup/lxml 解析、以及 Scrapy 框架的使用。

更多推荐