从零开始讲解Scrapy爬虫开发及数据存储的教程

从零开始讲解Scrapy爬虫开发及数据存储的教程,采用分步式讲解并附带完整代码示例:


Scrapy爬虫教程:从入门到数据存储(MySQL版)

一、开发环境准备

  1. 安装Python(推荐3.8+版本)

    • 官网下载地址:https://www.python.org/
  2. 创建虚拟环境(可选但推荐)

    python -m venv scrapy_env
    source scrapy_env/bin/activate  # Linux/Mac
    scrapy_env\Scripts\activate     # Windows
    
  3. 安装必要库

    pip install scrapy pymysql
    

二、创建Scrapy项目

  1. 新建项目

    scrapy startproject book_crawler
    cd book_crawler
    
  2. 目录结构说明:

    book_crawler/
    │
    ├── scrapy.cfg            # 项目配置文件
    └── book_crawler/         # 项目主目录
        ├── __init__.py
        ├── items.py          # 定义抓取数据结构
        ├── middlewares.py    # 中间件配置
        ├── pipelines.py      # 数据管道(数据库存储逻辑)
        ├── settings.py       # 项目设置
        └── spiders/          # 爬虫目录
            └── __init__.py
    

三、编写爬虫(以图书网站为例)

  1. 创建爬虫文件 spiders/book_spider.py
import scrapy

class BookSpider(scrapy.Spider):
    name = "books"
    start_urls = ['http://books.toscrape.com/']

    def parse(self, response):
        # 提取图书列表
        for book in response.css('article.product_pod'):
            yield {
                'title': book.css('h3 a::attr(title)').get(),
                'price': book.css('p.price_color::text').get(),
                'rating': book.css('p.star-rating::attr(class)').get().split()[-1],
                'stock': book.css('p.availability::text')[1].get().strip()
            }

        # 自动翻页
        next_page = response.css('li.next a::attr(href)').get()
        if next_page:
            yield response.follow(next_page, self.parse)

四、配置数据存储管道

  1. 修改 pipelines.py
import pymysql

class MysqlPipeline:
    def __init__(self):
        self.conn = None
        self.cursor = None

    def open_spider(self, spider):
        # 连接数据库
        self.conn = pymysql.connect(
            host='localhost',
            user='root',
            password='yourpassword',
            db='book_db',
            charset='utf8mb4'
        )
        self.cursor = self.conn.cursor()
        
        # 创建数据表
        self.cursor.execute("""
        CREATE TABLE IF NOT EXISTS books(
            id INT AUTO_INCREMENT PRIMARY KEY,
            title VARCHAR(255),
            price DECIMAL(10,2),
            rating VARCHAR(20),
            stock VARCHAR(50)
        )
        """)

    def process_item(self, item, spider):
        # 插入数据
        query = """
        INSERT INTO books (title, price, rating, stock)
        VALUES (%s, %s, %s, %s)
        """
        self.cursor.execute(query, (
            item['title'],
            float(item['price'][1:]),  # 去除£符号
            item['rating'],
            item['stock']
        ))
        self.conn.commit()
        return item

    def close_spider(self, spider):
        self.cursor.close()
        self.conn.close()
  1. 配置 settings.py
ITEM_PIPELINES = {
    'book_crawler.pipelines.MysqlPipeline': 300,
}

# 遵守robots协议(测试时可关闭)
ROBOTSTXT_OBEY = False

# 设置请求延迟(避免被封)
DOWNLOAD_DELAY = 2

五、运行与测试

  1. 启动爬虫
scrapy crawl books
  1. 查看MySQL数据库
SELECT * FROM books LIMIT 5;

六、常见问题解决

  1. 数据库连接失败

    • 检查MySQL服务是否运行
    • 确认用户名/密码是否正确
    • 检查数据库权限设置
  2. 乱码问题解决

    # 在settings.py中添加
    FEED_EXPORT_ENCODING = 'utf-8'
    
  3. 反爬虫策略应对

    • 在settings.py中配置:
    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'
    DOWNLOAD_DELAY = 3
    

七、项目扩展建议

  1. 添加异常处理
  2. 使用Item类规范化数据结构
  3. 添加日志记录
  4. 实现分布式爬虫(需结合Scrapy-Redis)

Q&A环节:

Q:爬虫运行时如何看到SQL语句?
A:在pipelines.py中添加打印语句,或者在MySQL中开启查询日志

Q:数据如何导出为CSV?
A:运行命令添加导出参数:

scrapy crawl books -o books.csv

建议新手按照以下步骤练习:

  1. 先运行示例爬虫观察效果
  2. 尝试修改CSS选择器提取不同字段
  3. 自定义存储到其他数据库(如MongoDB)
  4. 添加新的网站解析逻辑

注意:实际使用时请遵守目标网站的robots.txt协议,控制请求频率,避免对目标网站造成过大压力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值