"数据就是新时代的石油,而requests就是你手中的钻头。"
一、开篇:为什么你需要学会requests?
想象一下这样的场景:
- 你想批量下载某招聘网站的岗位信息做薪资分析,但手动复制粘贴太慢了
- 你需要每天定时获取某财经网站的最新数据,但总不能一直守着电脑刷新
- 你想做一份竞品分析报告,需要抓取对手的产品价格、用户评价
这些场景,用Python的requests库,几行代码就能搞定。
requests库被誉为"Python中最优雅的HTTP库",它让网络请求变得像写英文句子一样简单自然。今天这篇文章,我将从零开始,带你彻底掌握这个神器。
二、环境准备:一分钟搞定安装
1. 安装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 的区别:
| | |
|---|
data | | application/x-www-form-urlencoded |
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])
常见编码对照表:
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" |
| |
| |
| |
| |
| |
七、写在最后
通过这篇文章,你已经掌握了requests库的核心用法:
但是,requests只负责"把数据拿回来",拿到HTML之后如何从中提取有用的信息呢?
这就需要我们的"黄金搭档"——BeautifulSoup(bs4)登场了!
在下一篇文章中,我将手把手教你用bs4解析HTML,从杂乱的网页源码中精准提取你想要的数据。requests负责"抓取",bs4负责"解析",两者配合,天下无敌!