一、前言
前面我们学习了 Python 基础、文件处理、GUI 工具开发,本篇进入网络爬虫实战。借助requests第三方库,实现访问网页、获取页面源码、提取文本内容,适合抓取静态网页文字、资讯、数据,全程零基础可上手。
二、环境准备:安装 requests 库
requests不是 Python 自带标准库,需要用 pip 安装,打开 CMD 执行:
bash
运行
# 国内清华源加速安装
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
安装完成后,代码中通过import requests导入即可使用。
三、爬虫基础概念
请求头 User-Agent:模拟浏览器访问,防止网站识别出爬虫直接拦截
get 请求:最常用,用于获取网页页面内容(浏览网页本质就是 GET 请求)
响应状态码:
200:请求成功,正常获取页面
404:页面不存在
403:服务器拒绝访问(反爬虫拦截)
响应文本 text:网页完整 HTML 源代码,所有文字、图片链接都存放在这里
四、基础案例:访问网页并打印源码
1. 基础请求(不带请求头,极易被拦截)
python
运行
import requests
# 目标网页地址
url = "https://www.baidu.com"
# 发送get请求
response = requests.get(url)
# 打印响应状态码
print("状态码:", response.status_code)
# 打印网页源码(前500字符,避免输出过长)
print(response.text[:500])
2. 标准规范写法:添加浏览器 UA 伪装(必加)
网站会校验访问来源,不加 User-Agent 大概率返回 403 错误
python
运行
import requests
# 请求头,模拟Chrome浏览器
headers = {
"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"
}
url = "https://www.baidu.com"
# 携带请求头发送请求
res = requests.get(url, headers=headers)
# 设置编码,解决中文乱码
res.encoding = "utf-8"
if res.status_code == 200:
print("网页访问成功!")
# 打印网页标题附近内容
html = res.text
print(html[:800])
else:
print(f"访问失败,状态码:{res.status_code}")
五、提取网页标题简易示例
通过字符串切片,快速提取网页<title>标签内的网页标题
python
运行
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36"
}
url = "https://www.baidu.com"
res = requests.get(url, headers=headers)
res.encoding = "utf-8"
html = res.text
# 截取<title>和</title>中间文字
start = html.find("<title>") + len("<title>")
end = html.find("</title>")
title = html[start:end]
print("网页标题:", title)
六、将爬取到的网页源码保存到本地 TXT
结合之前学的文件操作,把页面代码持久化保存到本地,方便离线查看
python
运行
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36"
}
url = "https://www.baidu.com"
try:
res = requests.get(url, headers=headers, timeout=10)
res.encoding = "utf-8"
# 写入本地文件
with open("百度首页源码.txt", "w", encoding="utf-8") as f:
f.write(res.text)
print("网页源码已保存到本地!")
except Exception as e:
print("爬取失败:", e)
参数timeout=10:设置 10 秒超时,网络卡顿不会无限等待。
七、带参数 GET 请求(搜索页面通用)
很多网址通过?key=xxx传递搜索内容,requests 支持 params 自动拼接参数
python
运行
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36"
}
url = "https://www.baidu.com/s"
# 搜索参数
params = {
"wd": "Python爬虫教程"
}
res = requests.get(url, headers=headers, params=params)
res.encoding = "utf-8"
print("当前搜索页面地址:", res.url)
print("页面前600字符:", res.text[:600])
八、新手爬虫避坑指南
中文乱码:添加
res.encoding = "utf-8"指定编码403 拒绝访问:请求头缺少 User-Agent,必须配置 headers 模拟浏览器
请求超时卡死:get 方法添加
timeout=10限制等待时长频繁访问被封 IP:短时间不要循环大量爬取,可导入 time 模块
time.sleep(1)每次请求暂停 1 秒动态网页空白:requests 只能爬静态 HTML,JS 动态加载数据需要 Selenium(进阶内容)
九、综合完整可运行案例:爬取并保存网页标题 + 源码
python
运行
import requests
import time
def crawl_web(url, save_file="page.txt"):
headers = {
"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"
}
try:
# 发送网络请求
response = requests.get(url, headers=headers, timeout=10)
response.encoding = "utf-8"
html = response.text
# 提取标题
t_start = html.find("<title>") + 7
t_end = html.find("</title>")
page_title = html[t_start:t_end]
# 写入文件
with open(save_file, "w", encoding="utf-8") as f:
f.write(f"网页标题:{page_title}\n")
f.write("=" * 50 + "\n")
f.write(html)
print(f"爬取完成!标题:{page_title},文件已保存为 {save_file}")
except Exception as err:
print(f"爬取出错:{err}")
# 调用函数
if __name__ == "__main__":
target_url = input("请输入要爬取的网页地址:")
crawl_web(target_url, "网页源码.txt")
time.sleep(1)
十、法律与规范提醒
仅用于学习、爬取公开无版权静态页面,禁止抓取付费、隐私、企业涉密数据
遵守网站
robots.txt爬虫协议,不高频暴力访问服务器商业用途爬虫需要网站官方授权,私自大规模抓取存在法律风险
十一、下期预告
下一篇:Python 自动化办公:批量处理 Excel 表格数据实战,用代码快速读写、统计表格内容。