【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提高效率

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

相关推荐
Thomas_YXQ2 分钟前
Unity3D Addressable 深度优化热更性能消耗
开发语言·3d·unity·微信
aini_lovee6 分钟前
C# 快递单打印系统(万能套打系统)
开发语言·c#
量化君也9 分钟前
快速入门量化交易都要学些什么?
大数据·人工智能·python·算法·金融
吴卫斌9 分钟前
行业ETF轮动策略实战(二):精选候选池——打造你的赛道武器库
大数据·python·股票·量化交易
天启HTTP11 分钟前
开启全局代理后网络变慢,问题出在哪
开发语言·前端·网络·tcp/ip·php
Tbisnic14 分钟前
AI大模型学习 第十天:让程序“指挥”大模型 —— 从对话到工具调用
人工智能·python·ai·大模型·react·cot·提示词工程
丑过三八线15 分钟前
Runc 深度解析:从原理到实操
java·linux·开发语言·docker·容器·rpc
伊布拉西莫17 分钟前
Flask 请求生命周期
后端·python·flask
STDD17 分钟前
ntfy 自托管推送通知服务搭建:一条 curl 命令向手机发送通知
java·开发语言·智能手机