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

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

相关推荐
一只余弦函数8 分钟前
《C++》STL--list容器详解
开发语言·c++·list
yunnanwang37 分钟前
鹏哥C语言_85_结构体下(结构体传参)
c语言·开发语言
霜羽68921 小时前
【C++篇】模版进阶
开发语言·c++
测试老哥1 小时前
如何写好测试用例?
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
ALLSectorSorft1 小时前
相亲小程序个人资料管理系统模块搭建
服务器·网络·数据库·python·sql
给老吕螺丝1 小时前
C 语言作用域与存储期深度解析:空间与时间的双重维度
c语言·开发语言·经验分享·笔记
AI手记叨叨1 小时前
Python LRU缓存应用与示例
python·缓存
CHEN5_021 小时前
【Java面试题】缓存穿透
java·开发语言·数据库·redis·缓存
丘山子1 小时前
Python 布尔运算的优雅实践
后端·python·面试
UQWRJ2 小时前
R语言基础图像及部分调用函数
开发语言·r语言