首先,確保安裝以下必要的 Python 套件:
pip install scrapy sqlalchemy psycopg2-binary
請建立一個檔案 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)
注意:
username
、password
和 mydatabase
替換為你的資料庫設定資訊。sqlite:///mydatabase.db
。執行以下代碼一次來初始化資料庫:
from models import init_db
init_db()
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
建立檔案 scrapy_sqlalchemy_example/items.py
。
import scrapy
class ArticleItem(scrapy.Item):
title = scrapy.Field()
url = scrapy.Field()
content = scrapy.Field()
建立檔案 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
編輯 Scrapy 的設定檔,啟用 Pipeline:scrapy_sqlalchemy_example/settings.py
# 啟用 Pipeline
ITEM_PIPELINES = {
'scrapy_sqlalchemy_example.pipelines.SQLAlchemyPipeline': 300,
}
# 禁止遵循機器人協議(根據需求啟用/禁用)
ROBOTSTXT_OBEY = False
執行 Scrapy 爬蟲:
scrapy crawl example
檢查資料庫中的 articles
表,應該可以看到抓取的文章數據已成功存入。
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。
你可以擴展這個範例,根據目標網站和數據需求修改爬蟲邏輯和資料庫結構。如果需要處理更多高級功能(如異步操作、增量抓取等),可以進一步優化。