Python文件爬取案例实操——手把手教你抓取网页数据
目录导读
问:新手第一次做爬虫,最容易踩的坑是什么?
答: 没有设置User-Agent导致被网站直接403拒绝;忘记处理反爬机制如验证码、IP封禁;以及不尊重robots.txt协议进行恶意抓取,爬虫是技术,合规是底线。
爬虫基础:为什么选择Python?
Python之所以成为爬虫领域的“标配”,主要得益于其简洁的语法和强大的第三方库生态,无论是网页解析(BeautifulSoup、lxml)、网络请求(Requests、aiohttp)还是数据存储(pandas、SQLite),Python都能用最少的代码实现复杂功能,在GitHub上,超过60%的爬虫项目使用Python编写,这本身就证明了其主流地位。
环境搭建与核心库介绍
1 必要安装
pip install requests beautifulsoup4 lxml
- Requests:处理HTTP请求,支持Cookie、Session、代理等。
- BeautifulSoup:解析HTML/XML,支持CSS选择器。
- lxml:作为解析器,速度比标准库快5倍以上。
2 编写前的准备工作
- 检查目标网站的
robots.txt(https://example.com/robots.txt) - 确定爬取频率,建议加
time.sleep(1)避免封禁 - 使用
headers伪造浏览器身份headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' }
实战案例一:爬取静态网页文本
1 目标:抓取一个新闻网站的标题列表
假设我们想从news.ycombinator.com(Hacker News)获取当天热门帖子的标题和链接。
2 代码实现
import requests
from bs4 import BeautifulSoup
url = 'https://news.ycombinator.com/'
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'lxml')
s = soup.select('a.storylink') # CSS选择器in titles:
print(f"标题:{title.get_text()}")
print(f"链接:{title['href']}")
问:为什么用
select而不是find_all?
答:select支持CSS选择器语法,更适合复杂嵌套结构;find_all适合简单标签名匹配,实际开发中建议优先使用select,代码更易读。
3 保存结果
import csv
with open('news.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
writer.writerow(['Title', 'Link'])
for title in titles:
writer.writerow([title.get_text(), title['href']])
实战案例二:动态页面与文件下载
1 目标:下载一个图片网站的批量图片
很多图片网站使用JavaScript懒加载,直接请求HTML只能看到<img>标签但无src属性,这时需要分析网络请求。
2 解决方案:查看XHR请求
- 打开浏览器开发者工具(F12)→ Network → XHR
- 翻动页面,观察触发的新请求
- 找到真实的图片API地址(通常是JSON格式)
3 代码示例(Unsplash图片)
import json
api_url = 'https://api.unsplash.com/photos/random?count=10'
headers['Authorization'] = 'Client-ID YOUR_ACCESS_KEY' # 需注册获取
resp = requests.get(api_url, headers=headers)
data = json.loads(resp.text)
for i, photo in enumerate(data):
img_url = photo['urls']['regular']
img_data = requests.get(img_url).content
with open(f'image_{i}.jpg', 'wb') as f:
f.write(img_data)
print(f'已下载第{i+1}张')
问:JSON解析时遇到KeyError怎么办?
答: 先用print(data.keys())查看结构,或者使用.get()方法(如photo.get('urls', {}).get('regular'))避免程序崩溃。
常见问题与避坑指南
1 反爬对策
| 反爬手段 | 解决方案 |
|---|---|
| IP封禁 | 使用代理池(免费如https://github.com/jhao104/proxy_pool) |
| 验证码 | 使用打码平台(如超级鹰)或Selenium模拟操作 |
| 动态渲染 | 使用Playwright/Selenium进行浏览器自动化 |
2 数据清洗技巧
- 使用
re.sub(r'\s+', ' ', text)去除多余空白 - 用
unidecode库处理特殊Unicode字符 - 对日期字符串使用
datetime.strptime统一格式
3 法律红线
根据《网络安全法》和《数据安全法》:
- 不得绕过网站的反爬措施(如破解加密参数)
- 不得爬取用户隐私数据(如身份证、密码)
- 控制请求频率,避免造成服务器过载
结语与进阶方向
今天我们从零实现了两个完整案例:静态文本爬取和动态页面文件下载,接下来你可以尝试:
- 使用
scrapy框架构建分布式爬虫 - 结合
pandas进行数据分析与可视化 - 学习
selenium处理更复杂的交互页面
爬虫的价值不在于“爬”,而在于“取”——提取有价值的数据并转化为洞察,希望这篇文章能成为你数据探索之路的第一块基石,欢迎在评论区分享你的爬虫作品或遇到的难题,我们一起讨论解决方案。
标签: Web scraping Python