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

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

相关推荐
数研小生17 小时前
亚马逊商品列表API详解
前端·数据库·python·pandas
独好紫罗兰17 小时前
对python的再认识-基于数据结构进行-a005-元组-CRUD
开发语言·数据结构·python
chilavert31818 小时前
技术演进中的开发沉思-356:重排序(中)
java·开发语言
jianghua00118 小时前
Python中的简单爬虫
爬虫·python·信息可视化
devmoon18 小时前
为 Pallet 搭建最小化 Mock Runtime 并编写单元测试环境
开发语言·单元测试·区块链·智能合约·polkadot
喵手18 小时前
Python爬虫实战:针对Python官网,精准提取出每一个历史版本的版本号、发布日期以及对应的文档/详情页链接等信息,并最终清洗为标准化的CSV文件!
爬虫·python·爬虫实战·零基础python爬虫教学·python官方数据采集·采集历史版本版本号等信息·导出csv文件
Coder_Boy_18 小时前
Java开发者破局指南:跳出内卷,借AI赋能,搭建系统化知识体系
java·开发语言·人工智能·spring boot·后端·spring
databook18 小时前
像搭积木一样思考:数据科学中的“自下而上”之道
python·数据挖掘·数据分析
Mr_Xuhhh18 小时前
介绍一下ref
开发语言·c++·算法
luoluoal18 小时前
基于python的医疗问句中的实体识别算法的研究(源码+文档)
python·mysql·django·毕业设计·源码