【Python爬虫】手把手教你从零开始写爬虫,小白也能轻松学会!(附完整源码)
写在前面
大家好!今天给大家带来一篇超级详细的Python爬虫入门教程。很多朋友私信问我:"爬虫难不难学?"、"零基础能学会吗?"
我的回答是:完全可以!
本文将通过两个实战项目,让你在1小时内掌握爬虫的核心技能。文末有完整源码下载链接哦~
一、5分钟理解爬虫原理
1.1 什么是爬虫?
简单来说,爬虫就是一个自动化获取网页数据的程序。
举个例子:
- 手动操作:打开浏览器 → 输入网址 → 复制数据 → 粘贴到Excel
- 爬虫操作:运行程序 → 自动完成上述所有操作
1.2 爬虫能做什么?
- 📊 批量采集电商商品价格
- 📈 收集股票数据进行分析
- 🎬 爬取电影评分和评论
- 📰 自动收集新闻资讯
- 🏠 监控房价变化
1.3 爬虫工作原理
[发起请求] → [获取网页] → [解析数据] → [保存结果]
↑ ↓
└──────────── 循环处理 ←───────────────┘
二、环境搭建(超简单)
2.1 检查Python版本
打开命令行,输入:
bash
python --version
如果显示 Python 3.x.x,说明已安装成功。
2.2 安装必需库
只需要两个库,超级简单:
bash
pip install requests beautifulsoup4 -i https://pypi.douban.com/simple/
💡 小贴士:加上
-i https://pypi.douban.com/simple/使用国内镜像,下载速度飞快!
三、第一个爬虫:爬取Python官网新闻(10分钟搞定)
3.1 完整代码
python
# 第一个爬虫程序:获取Python官网最新动态
import requests
from bs4 import BeautifulSoup
def my_first_crawler():
"""我的第一个爬虫"""
# 1. 设置目标网址
url = "https://www.python.org/"
print(f"正在访问: {url}")
# 2. 发起请求,获取网页
response = requests.get(url)
print(f"状态码: {response.status_code}")
# 3. 解析网页内容
soup = BeautifulSoup(response.text, 'html.parser')
# 4. 找到新闻所在的区域
news_area = soup.find('div', class_='medium-widget blog-widget')
# 5. 提取每条新闻
print("\n=== Python官网最新动态 ===\n")
news_list = news_area.find_all('li')
for i, news in enumerate(news_list[:5], 1):
# 获取标题
title = news.find('a').text.strip()
# 获取日期
date = news.find('time').text
# 获取链接
link = "https://www.python.org" + news.find('a')['href']
print(f"{i}. {title}")
print(f" 发布时间:{date}")
print(f" 详情链接:{link}\n")
# 运行爬虫
if __name__ == "__main__":
my_first_crawler()
3.2 代码详解
让我们一行一行理解代码:
第1步:导入库
python
import requests # 用于发送网络请求
from bs4 import BeautifulSoup # 用于解析HTML
第2步:发送请求
python
response = requests.get(url)
这行代码相当于在浏览器中输入网址并回车。
第3步:解析HTML
python
soup = BeautifulSoup(response.text, 'html.parser')
把网页HTML转换成Python能理解的对象。
第4步:查找元素
python
news_area = soup.find('div', class_='medium-widget blog-widget')
就像用Ctrl+F在网页中查找内容一样。
第5步:提取数据
python
title = news.find('a').text.strip()
获取标签内的文本内容。
3.3 运行结果
正在访问: https://www.python.org/
状态码: 200
=== Python官网最新动态 ===
1. Python is for everyone: Join in the PSF fundraiser!
发布时间:2024-11-12
详情链接:https://www.python.org/blog/...
2. Connecting the Dots: PSF Financial Outlook
发布时间:2024-11-04
详情链接:https://www.python.org/blog/...
🎉 恭喜!你已经完成了第一个爬虫!
四、进阶项目:爬取豆瓣电影Top250(实战精华)
4.1 项目目标
爬取豆瓣电影Top250的所有电影信息,包括:
- 电影排名
- 电影名称
- 评分
- 评价人数
- 经典台词
4.2 核心代码
python
import requests
from bs4 import BeautifulSoup
import time
import json
class DoubanCrawler:
"""豆瓣电影Top250爬虫"""
def __init__(self):
self.movies = []
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
def get_one_page(self, url):
"""获取单页数据"""
print(f"正在爬取: {url}")
# 发送请求
response = requests.get(url, headers=self.headers)
soup = BeautifulSoup(response.text, 'html.parser')
# 找到所有电影条目
items = soup.find_all('div', class_='item')
for item in items:
movie = {}
# 排名
movie['rank'] = item.find('em').text
# 电影名
movie['title'] = item.find('span', class_='title').text
# 评分
movie['score'] = item.find('span', class_='rating_num').text
# 评价人数
rating_people = item.find('div', class_='star').find_all('span')[-1]
movie['people'] = rating_people.text.replace('人评价', '')
# 金句(如果有)
quote = item.find('span', class_='inq')
movie['quote'] = quote.text if quote else '暂无'
self.movies.append(movie)
print(f" 已获取: {movie['rank']}. {movie['title']} - 评分:{movie['score']}")
def crawl_all(self):
"""爬取所有页面"""
print("="*50)
print("开始爬取豆瓣电影Top250...")
print("="*50)
# Top250共10页,每页25部
for i in range(10):
page_url = f"https://movie.douban.com/top250?start={i*25}"
self.get_one_page(page_url)
# 礼貌爬虫,休息2秒
if i < 9:
print(f"\n休息2秒,避免访问过快...\n")
time.sleep(2)
print(f"\n完成!共爬取 {len(self.movies)} 部电影")
def save_data(self):
"""保存数据"""
# 保存为JSON
with open('douban_top250.json', 'w', encoding='utf-8') as f:
json.dump(self.movies, f, ensure_ascii=False, indent=2)
# 保存为TXT(方便查看)
with open('douban_top250.txt', 'w', encoding='utf-8') as f:
f.write("豆瓣电影Top250榜单\n")
f.write("="*60 + "\n\n")
for movie in self.movies:
f.write(f"排名:{movie['rank']}\n")
f.write(f"片名:{movie['title']}\n")
f.write(f"评分:{movie['score']} ({movie['people']}人评价)\n")
f.write(f"金句:{movie['quote']}\n")
f.write("-"*60 + "\n\n")
print("数据已保存到 douban_top250.json 和 douban_top250.txt")
def show_top10(self):
"""显示前10名"""
print("\n*** 豆瓣电影Top10 ***\n")
for movie in self.movies[:10]:
print(f"{movie['rank'].rjust(3)}. {movie['title']}")
print(f" 评分:{movie['score']} | {movie['people']}人评价")
print(f" \"{movie['quote']}\"")
print()
# 主程序
if __name__ == "__main__":
crawler = DoubanCrawler()
crawler.crawl_all()
crawler.save_data()
crawler.show_top10()
4.3 关键技术点解析
1️⃣ 模拟浏览器访问
python
headers = {
'User-Agent': 'Mozilla/5.0...' # 假装是浏览器
}
有些网站会检查访问者是不是真实浏览器,加上这个就能通过检查。
2️⃣ 处理分页
python
for i in range(10):
url = f"https://movie.douban.com/top250?start={i*25}"
豆瓣每页显示25部电影,通过改变start参数访问不同页面。
3️⃣ 爬虫礼仪
python
time.sleep(2) # 休息2秒
不要太快!给服务器一点喘息时间,这是爬虫的基本礼仪。
4️⃣ 数据保存
同时保存为JSON(程序读取)和TXT(人工查看)两种格式。
4.4 运行效果
==================================================
开始爬取豆瓣电影Top250...
==================================================
正在爬取: https://movie.douban.com/top250?start=0
已获取: 1. 肖申克的救赎 - 评分:9.7
已获取: 2. 霸王别姬 - 评分:9.6
已获取: 3. 阿甘正传 - 评分:9.5
...
*** 豆瓣电影Top10 ***
1. 肖申克的救赎
评分:9.7 | 2834328人评价
"希望让人自由。"
2. 霸王别姬
评分:9.6 | 2069901人评价
"风华绝代。"
五、常见问题与解决方案
❓ Q1: 为什么我爬不到数据?
可能原因:
- 网站结构变了 → 更新选择器
- 被反爬了 → 添加headers,降低速度
- 需要登录 → 使用cookies
解决代码:
python
# 添加更多请求头
headers = {
'User-Agent': 'Mozilla/5.0...',
'Referer': 'https://www.google.com',
'Accept-Language': 'zh-CN,zh;q=0.9'
}
# 使用Session保持会话
session = requests.Session()
session.headers.update(headers)
response = session.get(url)
❓ Q2: 中文乱码怎么办?
python
# 方法1:自动检测编码
response.encoding = response.apparent_encoding
# 方法2:手动指定编码
response.encoding = 'utf-8'
# 方法3:保存文件时指定编码
with open('data.txt', 'w', encoding='utf-8') as f:
f.write(content)
❓ Q3: 如何爬取需要登录的网站?
python
# 使用cookies
cookies = {
'session_id': 'xxx',
'user_token': 'yyy'
}
response = requests.get(url, cookies=cookies)
❓ Q4: 爬虫被封IP了怎么办?
- 降低爬取速度
- 使用代理IP
- 随机User-Agent
- 添加随机延时
python
import random
import time
# 随机延时
time.sleep(random.uniform(1, 3))
# 代理IP
proxies = {
'http': 'http://10.10.10.10:8000',
'https': 'https://10.10.10.10:8000'
}
response = requests.get(url, proxies=proxies)
六、爬虫进阶学习路线
🎯 初级(1-2周)
- requests基础
- BeautifulSoup解析
- 正则表达式
- XPath选择器
🎯 中级(1-2月)
- Scrapy框架
- Selenium动态网页
- 多线程/异步爬虫
- 数据存储(MySQL/MongoDB)
🎯 高级(3-6月)
- 分布式爬虫
- 反爬虫对抗
- 验证码识别
- App爬虫
七、爬虫道德与法律
⚠️ 必须遵守的原则
-
尊重robots.txt
python# 访问 https://网站域名/robots.txt 查看爬取规则 -
控制爬取频率
- 设置合理延时
- 避免并发过高
-
不爬取隐私数据
- 个人信息
- 未公开数据
- 付费内容
-
合理使用数据
- 学习研究 ✅
- 商业盈利(未授权)❌
📖 相关法律
- 《计算机信息网络国际联网安全保护管理办法》
- 《网络安全法》
- 尊重网站服务条款
八、实用工具推荐
🛠️ 开发工具
| 工具 | 用途 | 推荐指数 |
|---|---|---|
| PyCharm | Python IDE | ⭐⭐⭐⭐⭐ |
| Postman | 接口测试 | ⭐⭐⭐⭐⭐ |
| Chrome开发者工具 | 分析网页 | ⭐⭐⭐⭐⭐ |
| Jupyter Notebook | 交互式开发 | ⭐⭐⭐⭐ |
| Charles | 抓包工具 | ⭐⭐⭐⭐ |
📚 学习资源
九、完整源码下载
🎁 获取方式:
-
GitHub下载(推荐)
bashhttps://github.com/sweet77-zsx/pyworkspace.git -
直接复制
- 本文所有代码均可直接复制运行
十、总结
通过本教程,你已经学会了:
✅ 爬虫的基本原理
✅ requests发送请求
✅ BeautifulSoup解析HTML
✅ 处理分页数据
✅ 保存数据到文件
✅ 爬虫礼仪和注意事项
记住:爬虫是工具,关键在于如何使用。
希望这篇教程对你有帮助!如果觉得不错,请点赞👍收藏⭐哦~
💬 互动交流
有问题欢迎在评论区留言,看到会第一时间回复!
🔥 下期预告
下一篇将带来:《Scrapy框架实战:构建高性能分布式爬虫》
敬请期待!
声明:本文仅供学习交流使用,请勿用于非法用途。作者不承担任何法律责任。