1. Python爬虫入门实战:从零开始抓取网页数据并存储
作为一名有多年爬虫开发经验的程序员,我深知新手在学习Python爬虫时面临的困惑。很多教程要么过于理论化,要么代码片段不完整,让初学者无从下手。今天我就分享一个完整的爬虫案例,包含从网页抓取到数据存储的全流程,代码可以直接复用,特别适合新手练手。
这个爬虫示例使用Python标准库urllib和第三方库BeautifulSoup、xlwt,实现了以下功能:
- 模拟浏览器请求获取网页内容
- 解析HTML提取所需数据
- 将结构化数据保存到Excel文件
- 完善的异常处理机制
2. 环境准备与工具选型
2.1 开发环境配置
在开始之前,我们需要准备好Python开发环境。推荐使用Python 3.6+版本,这是目前最稳定的Python发行版。安装方法很简单:
- Windows用户可以从Python官网下载安装包
- Mac用户可以使用Homebrew安装:
brew install python - Linux用户一般系统自带Python3,可通过包管理器安装
提示:建议使用虚拟环境管理项目依赖,避免包冲突。创建虚拟环境的命令:
bash复制python -m venv spider_env source spider_env/bin/activate # Linux/Mac spider_env\Scripts\activate # Windows
2.2 必备库安装
本案例需要安装以下Python库:
bash复制pip install beautifulsoup4 xlwt requests
- beautifulsoup4:HTML解析库,比正则表达式更友好
- xlwt:生成Excel文件的库(适用于.xls格式)
- requests:比urllib更易用的HTTP请求库(备用方案)
注意:虽然代码中使用的是urllib,但我个人更推荐requests库,因为它API更简洁。后续优化部分会展示requests的用法。
3. 爬虫核心代码解析
3.1 主流程设计
整个爬虫的工作流程可以分为三个主要步骤:
- 发送HTTP请求获取网页内容
- 解析HTML提取目标数据
- 存储数据到Excel文件
对应的代码结构也很清晰:
python复制def main():
baseurl = "http://jshk.com.cn" # 基础URL
datelist = getDate(baseurl) # 获取数据
savepath = "./jshk.xls" # 保存路径
saveDate(datelist, savepath) # 保存数据
3.2 网页请求实现
askURL函数负责发送HTTP请求并获取响应内容:
python复制def askURL(url):
head = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..."
}
request = urllib.request.Request(url, headers=head)
html = ""
try:
response = urllib.request.urlopen(request)
html = response.read().decode("utf-8")
except urllib.error.URLError as e:
if hasattr(e, "code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
return html
关键点说明:
- User-Agent伪装成浏览器,避免被服务器识别为爬虫
- try-except块捕获网络请求异常
- decode('utf-8')确保正确解析中文内容
3.3 数据解析逻辑
getDate函数使用BeautifulSoup和正则表达式提取目标数据:
python复制def getDate(baseurl):
datalist = []
for i in range(0, 10):
url = baseurl + str(i*25)
html = askURL(url)
soup = BeautifulSoup(html, "html.parser")
for item in soup.find_all('div', class_="item"):
data = []
item = str(item)
link = re.findall(findlink, item)[0]
data.append(link)
# 其他数据提取类似...
datalist.append(data)
return datalist
解析策略分析:
- 遍历分页URL(通过i*25实现)
- 使用BeautifulSoup查找class="item"的div元素
- 对每个item使用正则表达式提取具体字段
4. 数据存储实现
4.1 Excel文件生成
saveDate函数将数据保存到Excel文件:
python复制def saveDate(datelist, savepath):
workbook = xlwt.Workbook(encoding='utf-8')
worksheet = workbook.add_sheet('电影', cell_overwrite_ok=True)
col = ("电影详情", "图片", "影片", "评分", "评价数", "概况")
for i in range(0, 5):
worksheet.write(0, i, col[i])
for i in range(0, 250):
data = datalist[i]
for j in range(0, 5):
worksheet.write(i+1, j, data[j])
workbook.save(savepath)
注意事项:
- xlwt只支持.xls格式,不支持.xlsx
- cell_overwrite_ok=True允许覆盖单元格
- 第一行写入表头,之后写入数据
4.2 数据存储优化建议
实际项目中可以考虑更灵活的存储方式:
- 使用openpyxl替代xlwt(支持.xlsx)
- 存储到数据库(MySQL/MongoDB)
- 保存为CSV格式(更通用)
- 添加增量存储逻辑(避免重复爬取)
5. 爬虫优化与扩展
5.1 使用requests库改进
requests库比urllib更简洁,下面是改进版的askURL:
python复制import requests
def askURL(url):
headers = {"User-Agent": "Mozilla/5.0..."}
try:
response = requests.get(url, headers=headers)
response.encoding = 'utf-8'
return response.text
except Exception as e:
print(f"请求失败: {str(e)}")
return None
优势:
- 代码更简洁
- 自动处理编码
- 更友好的异常处理
5.2 反爬虫策略应对
常见反爬虫机制及应对方案:
-
User-Agent检测
- 解决方案:轮换多个User-Agent
-
IP限制
- 解决方案:使用代理IP池
-
请求频率限制
- 解决方案:添加随机延迟
python复制import time import random time.sleep(random.uniform(0.5, 1.5)) -
验证码
- 解决方案:使用打码平台或机器学习识别
5.3 爬虫工程化建议
当爬虫项目规模扩大时,需要考虑:
- 任务调度:使用Scrapy或Celery
- 分布式爬取:Scrapy-Redis
- 数据清洗:pandas库
- 监控报警:日志记录+邮件通知
- 数据去重:BloomFilter
6. 常见问题与解决方案
6.1 编码问题
症状:爬取的内容出现乱码
解决方法:
- 确认网页实际编码(查看response headers或meta标签)
- 统一使用utf-8解码
- 使用chardet库自动检测编码
6.2 数据提取失败
可能原因:
- 网页结构发生变化
- XPath/CSS选择器写错
- 数据是JavaScript动态加载的
排查步骤:
- 打印完整HTML确认是否包含目标数据
- 使用浏览器开发者工具检查元素
- 考虑使用Selenium处理动态内容
6.3 请求被封禁
现象:返回403状态码或验证码页面
应对策略:
- 降低请求频率
- 更换User-Agent
- 使用代理IP
- 模拟登录获取cookie
7. 法律与道德注意事项
开发爬虫时必须注意:
- 遵守robots.txt协议
- 不爬取敏感或个人隐私数据
- 控制爬取频率,避免对目标网站造成负担
- 查看网站的服务条款,明确是否允许爬取
- 对爬取的数据合理使用,不用于商业牟利
重要:本代码仅供学习参考,实际使用时请遵守目标网站的规定,切勿滥用爬虫技术。
8. 项目扩展思路
掌握了基础爬虫后,可以尝试以下进阶方向:
- 爬虫+数据分析:使用pandas分析爬取的数据
- 可视化展示:用Pyecharts生成图表
- 自动化监控:定时爬取价格、库存等信息
- 自然语言处理:对爬取的文本进行情感分析
- 构建API服务:将爬虫封装为RESTful API
这个爬虫示例虽然简单,但包含了爬虫开发的核心要素。我在实际项目中总结的经验是:先确保基础功能可用,再逐步添加异常处理、性能优化等高级特性。刚开始可以多参考成熟的爬虫框架如Scrapy的设计思路,但不要被框架限制,理解原理后就能灵活应对各种爬取需求。