前面一至四篇我們學習瞭如何使用 python 來獲取網頁並將網頁中的有效數據解析出來,當獲取到有效數據以後,不可能將數據放在內存中,一旦系統出現問題辛辛苦苦獲取的數據都付諸東流了,此時需要考慮數據持久化的事情,數據持久化我們有兩種選擇一是將數據保存在文件中「比如 txt 文件或 execl 文件」,另一種是將數據保存在數據庫中。
對於將數據保存到文件中前面已經寫過相應的文件有興趣的話可以看 保存數據到文件 這篇文件,今天我們主要來看下如何將獲取到的有效數據保存在數據庫中。
將數據保存到數據庫首先需要使用 python 連接到數據,並依據數據的類型創建數據類,Python 數據庫操作 SQLAlchemy 這篇文章詳細介紹瞭如何在 python 中使用 SQLAlchemy 庫連接數據並創建數據表,SQLAlchemy 定義關係 這篇文件詳細介紹瞭如何使用 SQLAlchemy 來建立各個數據表之間的關係。
在前面的文章中使用 BeautifulSoup 解析出了網站立創商城中的電子元件的基本信息「廠家、型號、名稱等等」以及相應的價格信息。因爲電子元件的基本信息時固定不變,而價格信息卻是浮動的,如果我們想要建立該電子元件的價格波動情況,就需要有它在不同時期的價格,此時如果將基本信息和價格信息使用同一張表來實現的話,是無法完成了此功能的。需要將基本信息和價格信息分開,一個電子元件在不同的時期可以對應多個不同的價格,這是一個一對多的關係。
具體的數據表信息如下:
class Materials(Base, CRUDMixin):
__tablename__ = 'materials'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(100), nullable=False)
category = Column(String(100), nullable=False)
brand = Column(String(100), nullable=False)
model = Column(String(100), nullable=False)
number = Column(String(100), unique=True, nullable=False)
package = Column(String(50), nullable=False)
# price
price = relationship('Price', backref='materials')
class Price(Base, CRUDMixin):
__tablename__ = 'price'
id = Column(Integer, primary_key=True, autoincrement=True)
date = Column(DateTime, default=datetime.datetime.utcnow)
price = Column(Text)
materials_id = Column(Integer, ForeignKey('materials.id'))
在數據爬取的過程中,有可能長時間獲取到的是無效的數據,此時會產生一段沒有對數據庫進行操作的時間,可能造成數據庫鏈接的斷開,需要在 SQLAlchemy 的初始化中設置自動重連,避免出現無法存儲數據的情況。設置代碼如下:
def init_url(self, url):
self.engine = create_engine(
url,
pool_size=100,
pool_recycle=5,
pool_timeout=30,
pool_pre_ping=True,
max_overflow=0)
self.db_session = sessionmaker(bind=self.engine)
self.session = self.db_session()
Base.metadata.create_all(self.engine)
使用一個單核 1G 內存的服務器,用 40 多個小時的時間一共獲取了一共獲取四萬兩千多條的數據
完整代碼地址
更多內容關注我的微信公衆號「keinYe」。