Scrapy + SQLAlchemy 完整範例

1. 安裝相關套件

首先,確保安裝以下必要的 Python 套件:

pip install scrapy sqlalchemy psycopg2-binary

2. 建立 SQLAlchemy 的資料庫模型與連線設定

請建立一個檔案 models.py,來定義 SQLAlchemy 的資料庫模型與連線設定。


from sqlalchemy import create_engine, Column, Integer, String, Text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# 定義 SQLAlchemy Base
Base = declarative_base()

# 定義資料庫模型(例如:存儲抓取的文章資訊)
class Article(Base):
    __tablename__ = 'articles'
    id = Column(Integer, primary_key=True, autoincrement=True)
    title = Column(String(255), nullable=False)
    url = Column(String(255), nullable=False)
    content = Column(Text, nullable=True)

# 建立資料庫連接
DATABASE_URL = "postgresql://username:password@localhost:5432/mydatabase"  # 更新為你的資料庫資訊
engine = create_engine(DATABASE_URL)
Session = sessionmaker(bind=engine)

# 初始化資料庫(只需執行一次)
def init_db():
    Base.metadata.create_all(engine)
    

注意:

執行以下代碼一次來初始化資料庫:


from models import init_db

init_db()
    

3. 定義 Scrapy 專案與爬蟲 (Spider)

建立 Scrapy 專案

scrapy startproject scrapy_sqlalchemy_example

編輯爬蟲:

建立檔案 scrapy_sqlalchemy_example/spiders/example_spider.py


import scrapy
from scrapy_sqlalchemy_example.items import ArticleItem

class ExampleSpider(scrapy.Spider):
    name = "example"
    start_urls = ["https://example-blog.com/articles"]  # 替換為你的目標網站

    def parse(self, response):
        # 遍歷文章列表
        for article in response.css(".article-preview"):
            item = ArticleItem()
            item["title"] = article.css("h2.title::text").get()
            item["url"] = article.css("a::attr(href)").get()
            yield scrapy.Request(
                response.urljoin(item["url"]),
                callback=self.parse_article,
                meta={"item": item},
            )

    def parse_article(self, response):
        # 抓取文章內容
        item = response.meta["item"]
        item["content"] = response.css(".article-content::text").get()
        yield item
    

4. 定義 Item 與 Pipeline

定義 Scrapy Item:

建立檔案 scrapy_sqlalchemy_example/items.py


import scrapy

class ArticleItem(scrapy.Item):
    title = scrapy.Field()
    url = scrapy.Field()
    content = scrapy.Field()
    

定義 Pipeline 並存入資料庫:

建立檔案 scrapy_sqlalchemy_example/pipelines.py


from sqlalchemy.orm import sessionmaker
from scrapy_sqlalchemy_example.models import Article, engine

class SQLAlchemyPipeline:
    def __init__(self):
        # 初始化資料庫連線
        self.Session = sessionmaker(bind=engine)

    def open_spider(self, spider):
        # 在爬蟲啟動時開啟 session
        self.session = self.Session()

    def close_spider(self, spider):
        # 在爬蟲結束時關閉 session
        self.session.close()

    def process_item(self, item, spider):
        # 將 Item 存入資料庫
        article = Article(
            title=item["title"],
            url=item["url"],
            content=item["content"],
        )
        self.session.add(article)
        self.session.commit()
        return item
    

5. 配置 Scrapy 設定

編輯 Scrapy 的設定檔,啟用 Pipeline:scrapy_sqlalchemy_example/settings.py


# 啟用 Pipeline
ITEM_PIPELINES = {
    'scrapy_sqlalchemy_example.pipelines.SQLAlchemyPipeline': 300,
}

# 禁止遵循機器人協議(根據需求啟用/禁用)
ROBOTSTXT_OBEY = False
    

6. 運行爬蟲並測試

執行 Scrapy 爬蟲:

scrapy crawl example

檢查資料庫中的 articles 表,應該可以看到抓取的文章數據已成功存入。

7. 整個專案結構


scrapy_sqlalchemy_example/
│
├── scrapy_sqlalchemy_example/
│   ├── __init__.py
│   ├── items.py
│   ├── middlewares.py
│   ├── pipelines.py
│   ├── settings.py
│   ├── spiders/
│   │   ├── __init__.py
│   │   ├── example_spider.py
│
├── models.py
    

結語

這是一個完整的範例,展示如何結合 Scrapy 和 SQLAlchemy。

你可以擴展這個範例,根據目標網站和數據需求修改爬蟲邏輯和資料庫結構。如果需要處理更多高級功能(如異步操作、增量抓取等),可以進一步優化。