当前位置:首页>python>Python的requests库:零基础也能轻松抓取网页数据

Python的requests库:零基础也能轻松抓取网页数据

  • 2026-09-08 06:33:00
Python的requests库:零基础也能轻松抓取网页数据

"数据就是新时代的石油,而requests就是你手中的钻头。"


一、开篇:为什么你需要学会requests?

想象一下这样的场景:

  • 你想批量下载某招聘网站的岗位信息做薪资分析,但手动复制粘贴太慢了
  • 你需要每天定时获取某财经网站的最新数据,但总不能一直守着电脑刷新
  • 你想做一份竞品分析报告,需要抓取对手的产品价格、用户评价

这些场景,用Python的requests库,几行代码就能搞定。

requests库被誉为"Python中最优雅的HTTP库",它让网络请求变得像写英文句子一样简单自然。今天这篇文章,我将从零开始,带你彻底掌握这个神器。


二、环境准备:一分钟搞定安装

1. 安装requests

pip install requests

就这么简单,一行命令搞定。

2. 验证安装

import requestsprint(requests.__version__)

如果能正常输出版本号(如 2.31.0),恭喜你,安装成功!


三、核心用法:从"Hello World"到实战

1. 最基础的GET请求

import requests# 发送GET请求,获取网页内容url = "https://httpbin.org/get"response = requests.get(url)# 查看状态码print(f"状态码: {response.status_code}")  # 200表示成功# 查看响应内容(文本形式)print(response.text[:500])  # 只打印前500个字符

输出示例:

状态码: 200{  "args": {},  "headers": {    "Accept": "*/*",    "Accept-Encoding": "gzip, deflate",    "Host": "httpbin.org",    ...  }}

小贴士:status_code 为200表示请求成功,404表示页面不存在,500表示服务器内部错误。


2. 带参数的GET请求

很多时候,URL后面会带查询参数。比如搜索某关键词:

import requests# 方式1:直接在URL中拼接(不推荐,容易出错)# url = "https://httpbin.org/get?keyword=python&page=1"# 方式2:使用params参数(推荐,更优雅)params = {    "keyword": "python",    "page": 1,    "limit": 10}response = requests.get("https://httpbin.org/get", params=params)print(response.url)  # 自动拼接后的完整URLprint(response.json()["args"])  # 查看服务器接收到的参数

输出:

ounter(lineounter(linehttps://httpbin.org/get?keyword=python&page=1&limit=10{'keyword': 'python', 'page': '1', 'limit': '10'}

小贴士:response.json() 会自动将JSON格式的响应内容转换为Python字典,超级方便!


3. POST请求:向服务器提交数据

GET是"要"数据,POST是"给"数据。比如登录、提交表单:

import requests# 模拟登录(以httpbin为例)login_data = {    "username": "your_username",    "password": "your_password"}response = requests.post("https://httpbin.org/post", data=login_data)print(response.json()["form"])  # 查看提交的数据

data vs json 的区别:

参数
使用场景
请求头Content-Type
data
表单提交
application/x-www-form-urlencoded
json
API接口(RESTful)
application/json
# 提交JSON数据(更现代的做法)import requestspayload = {"name": "张三", "age": 25}response = requests.post("https://httpbin.org/post", json=payload)print(response.json()["json"])

4. 设置请求头:伪装成浏览器

很多网站会检测请求来源,如果是脚本访问可能会拒绝。这时候需要设置User-Agent:

import requestsheaders = {    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",    "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8"}response = requests.get("https://httpbin.org/headers", headers=headers)print(response.json()["headers"])

关键提示:User-Agent 是告诉服务器"我是谁",设置成浏览器标识可以绕过大部分反爬检测。


5. 处理中文乱码:编码问题一网打尽

抓取中文网页时,最头疼的就是乱码问题。requests已经帮我们考虑到了:

import requestsresponse = requests.get("https://www.baidu.com")# 方式1:自动推断编码(通常够用)print(response.encoding)  # 查看推断的编码print(response.text[:100])# 方式2:手动指定编码(如果自动推断不准)response.encoding = "utf-8"  # 或 "gbk", "gb2312" 等print(response.text[:100])

常见编码对照表:

网站类型
常见编码
国内主流网站
UTF-8
部分老旧网站
GBK / GB2312
国际网站
UTF-8

6. 超时设置与异常处理

网络请求可能会卡住,设置超时很重要:

import requestsfrom requests.exceptions import Timeout, ConnectionErrortry:    # 设置3秒超时    response = requests.get("https://httpbin.org/delay/5", timeout=3)    print(response.status_code)except Timeout:    print("请求超时了!请检查网络或增大超时时间")except ConnectionError:    print("网络连接失败!请检查网络设置")except Exception as e:    print(f"其他错误: {e}")

小贴士:timeout 参数可以是一个元组 (连接超时, 读取超时),比如 timeout=(3, 27) 表示连接最多等3秒,读取最多等27秒。


7. 使用Session保持会话

登录后需要保持会话状态?用Session:

import requests# 创建一个Session对象session = requests.Session()# 设置全局请求头(后续所有请求都会带上)session.headers.update({    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"})# 登录(Session会自动保存Cookie)login_data = {"username": "test", "password": "123456"}session.post("https://httpbin.org/post", data=login_data)# 后续请求自动携带Cookieresponse = session.get("https://httpbin.org/cookies")print(response.text)

Session的优势:自动管理Cookie、可以设置全局参数、连接复用提升性能。


四、实战案例:抓取真实数据

案例1:抓取天气信息

import requests# 使用免费的天气API(以和风天气为例,需注册获取key)url = "https://devapi.qweather.com/v7/weather/now"params = {    "location": "101010100",  # 北京城市编码    "key": "your_api_key"    # 替换为你的API Key}response = requests.get(url, params=params)weather = response.json()print(f"当前温度: {weather['now']['temp']}C")print(f"天气状况: {weather['now']['text']}")print(f"风向: {weather['now']['windDir']}")

案例2:批量下载图片

import requestsimport os# 图片URL列表image_urls = [    "https://picsum.photos/200/300?random=1",    "https://picsum.photos/200/300?random=2",    "https://picsum.photos/200/300?random=3"]os.makedirs("images", exist_ok=True)for i, url in enumerate(image_urls):    response = requests.get(url, timeout=10)    if response.status_code == 200:        with open(f"images/img_{i+1}.jpg", "wb") as f:            f.write(response.content)        print(f"图片 {i+1} 下载成功")    else:        print(f"图片 {i+1} 下载失败")

小贴士:下载二进制文件(图片、视频等)用 response.content,文本用 response.text。


五、进阶技巧:让你更专业

1. 代理设置

proxies = {    "http": "http://127.0.0.1:8080",    "https": "http://127.0.0.1:8080"}response = requests.get("https://httpbin.org/ip", proxies=proxies)print(response.text)

2. SSL证书验证

import requests# 忽略SSL证书验证(不推荐用于生产环境)response = requests.get("https://self-signed.badssl.com/", verify=False)# 使用自定义证书response = requests.get("https://example.com", verify="/path/to/cert.pem")

3. 流式下载大文件

import requestsurl = "https://example.com/large_file.zip"response = requests.get(url, stream=True)with open("large_file.zip", "wb") as f:    for chunk in response.iter_content(chunk_size=8192):        if chunk:            f.write(chunk)

小贴士:stream=True 不会一次性加载到内存,适合下载大文件。


六、常见问题速查表

问题
解决方案
中文乱码
response.encoding = "utf-8"
请求被拒绝
设置 User-Agent 请求头
需要登录
使用 Session 保持Cookie
请求超时
设置 timeout 参数
返回JSON
用 response.json() 解析
下载文件
用 response.content 获取二进制

七、写在最后

通过这篇文章,你已经掌握了requests库的核心用法:

  • GET/POST请求发送
  • 参数传递与请求头设置
  • 编码处理与异常捕获
  • Session会话管理
  • 实战案例:天气API、图片下载

但是,requests只负责"把数据拿回来",拿到HTML之后如何从中提取有用的信息呢?

这就需要我们的"黄金搭档"——BeautifulSoup(bs4)登场了!

在下一篇文章中,我将手把手教你用bs4解析HTML,从杂乱的网页源码中精准提取你想要的数据。requests负责"抓取",bs4负责"解析",两者配合,天下无敌!


最新文章

随机文章