【Python爬虫】手把手教你从零开始写爬虫,小白也能轻松学会!(附完整源码)

【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: 为什么我爬不到数据?

可能原因:

  1. 网站结构变了 → 更新选择器
  2. 被反爬了 → 添加headers,降低速度
  3. 需要登录 → 使用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了怎么办?

  1. 降低爬取速度
  2. 使用代理IP
  3. 随机User-Agent
  4. 添加随机延时
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爬虫

七、爬虫道德与法律

⚠️ 必须遵守的原则

  1. 尊重robots.txt

    python 复制代码
    # 访问 https://网站域名/robots.txt 查看爬取规则
  2. 控制爬取频率

    • 设置合理延时
    • 避免并发过高
  3. 不爬取隐私数据

    • 个人信息
    • 未公开数据
    • 付费内容
  4. 合理使用数据

    • 学习研究 ✅
    • 商业盈利(未授权)❌

📖 相关法律

  • 《计算机信息网络国际联网安全保护管理办法》
  • 《网络安全法》
  • 尊重网站服务条款

八、实用工具推荐

🛠️ 开发工具

工具 用途 推荐指数
PyCharm Python IDE ⭐⭐⭐⭐⭐
Postman 接口测试 ⭐⭐⭐⭐⭐
Chrome开发者工具 分析网页 ⭐⭐⭐⭐⭐
Jupyter Notebook 交互式开发 ⭐⭐⭐⭐
Charles 抓包工具 ⭐⭐⭐⭐

📚 学习资源

九、完整源码下载

🎁 获取方式:

  1. GitHub下载(推荐)

    bash 复制代码
    https://github.com/sweet77-zsx/pyworkspace.git
  2. 直接复制

    • 本文所有代码均可直接复制运行

十、总结

通过本教程,你已经学会了:

✅ 爬虫的基本原理

✅ requests发送请求

✅ BeautifulSoup解析HTML

✅ 处理分页数据

✅ 保存数据到文件

✅ 爬虫礼仪和注意事项

记住:爬虫是工具,关键在于如何使用。

希望这篇教程对你有帮助!如果觉得不错,请点赞👍收藏⭐哦~


💬 互动交流

有问题欢迎在评论区留言,看到会第一时间回复!

🔥 下期预告

下一篇将带来:《Scrapy框架实战:构建高性能分布式爬虫》

敬请期待!


声明:本文仅供学习交流使用,请勿用于非法用途。作者不承担任何法律责任。

相关推荐
普通网友2 小时前
C++与Qt图形开发
开发语言·c++·算法
geng_zhaoying2 小时前
在VPython中使用向量计算3D物体移动
python·3d·vpython
yue0082 小时前
C# 更改窗体样式
开发语言·c#
普通网友2 小时前
C++中的适配器模式
开发语言·c++·算法
风闲12172 小时前
Qt源码编译记录
开发语言·qt
普通网友3 小时前
C++中的委托构造函数
开发语言·c++·算法
半tour费3 小时前
TextCNN-NPU移植与性能优化实战
python·深度学习·分类·cnn·华为云
普通网友3 小时前
使用Flask快速搭建轻量级Web应用
jvm·数据库·python
月上柳青3 小时前
OpenWrt系统上配置batman-adv快速开始与配置详解
开发语言·mysql·php