【python】Python爬虫入门教程:使用requests库

Python爬虫入门教程:使用requests库

爬虫是数据获取的重要手段,下面我将通过一个完整的示例,教你如何使用Python的requests库编写一个简单的爬虫。我们将以爬取豆瓣电影Top250为例。

【python】网络爬虫教程 - 教你用python爬取豆瓣电影 Top250

1. 环境准备

首先需要安装必要的库:

bash 复制代码
pip install requests beautifulsoup4

2. 项目结构规划

一个简单的爬虫项目通常包含以下模块:

  • 发送HTTP请求获取页面内容
  • 解析HTML提取数据
  • 数据存储
  • 控制爬虫行为(如翻页、延时)

3. 编写爬虫代码

下面是一个完整的爬虫示例:

python 复制代码
import requests
from bs4 import BeautifulSoup
import time
import random
import csv

class DoubanSpider:
    def __init__(self):
        # 设置请求头,模拟浏览器访问
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
        }
        # 存储结果的列表
        self.movies = []
        
    def get_page(self, page_num):
        """获取指定页数的HTML内容"""
        url = f'https://movie.douban.com/top250?start={page_num*25}'
        
        try:
            response = requests.get(url, headers=self.headers, timeout=10)
            # 检查响应状态码
            if response.status_code == 200:
                return response.text
            else:
                print(f"请求失败,状态码: {response.status_code}")
                return None
        except requests.exceptions.RequestException as e:
            print(f"请求异常: {e}")
            return None
    
    def parse_page(self, html_content):
        """解析HTML内容,提取电影信息"""
        if not html_content:
            return
            
        soup = BeautifulSoup(html_content, 'html.parser')
        # 查找所有电影项
        movie_items = soup.select('div.item')
        
        for item in movie_items:
            try:
                # 提取电影标题
                title = item.select_one('span.title').text
                
                # 提取评分
                rating = item.select_one('span.rating_num').text
                
                # 提取简介
                quote = item.select_one('span.inq')
                quote = quote.text if quote else '无简介'
                
                # 提取导演和主演
                info = item.select_one('div.bd p').text.strip()
                
                # 添加到结果列表
                self.movies.append({
                    'title': title,
                    'rating': rating,
                    'quote': quote,
                    'info': info
                })
            except Exception as e:
                print(f"解析错误: {e}")
    
    def save_to_csv(self, filename='douban_movies.csv'):
        """将结果保存为CSV文件"""
        if not self.movies:
            print("没有数据可保存")
            return
            
        with open(filename, 'w', newline='', encoding='utf-8-sig') as csvfile:
            fieldnames = ['title', 'rating', 'quote', 'info']
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            
            # 写入表头
            writer.writeheader()
            # 写入数据
            writer.writerows(self.movies)
            
        print(f"数据已保存到 {filename}")
    
    def run(self, pages=10):
        """运行爬虫,爬取指定页数的数据"""
        for page in range(pages):
            print(f"正在爬取第 {page+1} 页...")
            html_content = self.get_page(page)
            self.parse_page(html_content)
            
            # 设置随机延时,避免频繁请求
            delay = random.uniform(1, 3)
            print(f"等待 {delay:.2f} 秒后继续...")
            time.sleep(delay)
        
        # 保存数据
        self.save_to_csv()
        print(f"共爬取 {len(self.movies)} 条电影数据")

# 运行爬虫
if __name__ == "__main__":
    spider = DoubanSpider()
    # 爬取前10页数据,共250条
    spider.run(pages=10)

4. 代码解析

这个爬虫程序包含以下关键部分:

  1. 请求处理

    • get_page 方法发送HTTP请求获取网页内容
    • 设置了请求头和超时时间,提高稳定性
    • 处理了可能的请求异常
  2. 数据解析

    • parse_page 方法使用BeautifulSoup解析HTML
    • 通过CSS选择器定位电影信息元素
    • 提取标题、评分、简介等关键信息
  3. 数据存储

    • save_to_csv 方法将结果保存为CSV文件
    • 使用UTF-8-sig编码确保中文正常显示
  4. 爬虫控制

    • run 方法控制爬取流程
    • 设置随机延时避免被封IP
    • 支持指定爬取页数

5. 进阶优化建议

  1. 添加异常处理:可以增强错误处理机制,例如失败重试功能

  2. 使用代理IP:爬取大量数据时,使用代理IP避免被封

  3. 数据清洗:提取数据后进行清洗和验证

  4. 存储优化:可以使用数据库存储数据,如SQLite、MySQL等

  5. 异步请求:对于大规模爬取,可以考虑使用aiohttp提高效率

这个爬虫示例展示了基本的爬虫架构和实现方法。实际应用中,你可以根据目标网站的结构调整解析逻辑,或者添加更多功能如图片下载、数据可视化等。

相关推荐
你怎么知道我是队长3 小时前
C语言---枚举变量
c语言·开发语言
李慕婉学姐4 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
吃茄子的猫4 小时前
quecpython中&的具体含义和使用场景
开发语言·python
じ☆冷颜〃4 小时前
黎曼几何驱动的算法与系统设计:理论、实践与跨领域应用
笔记·python·深度学习·网络协议·算法·机器学习
云栖梦泽4 小时前
易语言中小微企业Windows桌面端IoT监控与控制
开发语言
数据大魔方4 小时前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
APIshop4 小时前
Python 爬虫获取 item_get_web —— 淘宝商品 SKU、详情图、券后价全流程解析
前端·爬虫·python
风送雨4 小时前
FastMCP 2.0 服务端开发教学文档(下)
服务器·前端·网络·人工智能·python·ai
效率客栈老秦5 小时前
Python Trae提示词开发实战(8):数据采集与清洗一体化方案让效率提升10倍
人工智能·python·ai·提示词·trae
哈里谢顿5 小时前
一条 Python 语句在 C 扩展里到底怎么跑
python