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

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

相关推荐
数据知道19 小时前
Go基础:Go语言应用的各种部署
开发语言·后端·golang·go语言
刀客12319 小时前
C++ 面试总结
开发语言·c++·面试
hqwest19 小时前
QT肝8天16--加载动态菜单
开发语言·数据库·qt·ui·sqlite
友友马20 小时前
『 QT 』Qt初识
开发语言·qt
listhi52020 小时前
基于MATLAB的高斯混合模型(GMM)实现
开发语言·matlab
兰亭妙微20 小时前
兰亭妙微QT软件开发经验:跨平台桌面端界面设计的三大要点
开发语言·qt
Mingze031420 小时前
考研408之栈与队列学习
开发语言·c++·学习·考研·算法
循环渐进Forward20 小时前
Go语言:给AI开发装上高性能引擎
开发语言·人工智能·golang
数据知道21 小时前
Go基础:用Go语言操作MySQL详解
开发语言·数据库·后端·mysql·golang·go语言
励志不掉头发的内向程序员21 小时前
【Linux系列】并发世界的基石:透彻理解 Linux 进程 — 进程状态
linux·运维·服务器·开发语言·学习