中國技術大牛,首次公開自己的Scrapy項目開發過程,否是新的趨勢

中國技術大牛,首次公開自己的Scrapy項目開發過程,否是新的趨勢

介紹:

這是我的Scrapy教程系列的第9篇文章,在本Scrapy教程中,我將討論如何定義Scrapy項目,如何使用Scrapy項目,以及如何創建自定義項目管道以將Item的數據保存到DB中。如果您在閱讀時有任何疑問,我希望您在閱讀本文後有一個很好的理解,請在此留言,我會盡快回復。

您可以在本教程結束時獲取此項目的源代碼。

Scrapy Item VS Python Dict

在大多數抓取工作中,我們的目標是從網頁中提取結構化數據,Python Dict確實可以用來返回抓取的數據,但是,很容易在字段名稱中輸入拼寫錯誤或設置不一致的數據,這會造成一些災難有很多蜘蛛的大型項目。如果您希望一個字段只接收字符串類型,那麼沒有好的解決方案。

為了解決這個問題,Scrapy提供了Scrapy Item課程。Item

實例是用於收集數據的簡單容器,您可以將其視為Python dict的包裝,但它具有比原生Python Dict更有用的功能。

如果您不熟悉Scrapy,可以在項目中使用Python Dict,但是,如果您的項目很大或者您在Scrapy方面有一些經驗,請使用Scrapy Item來使您的項目保持一致。

如何定義Scrapy項目及其使用方法

每個Scrapy項目都調用了項目定義文件items.py,因此在此項目中,您需要編輯scrapy_spider/items.py

中國技術大牛,首次公開自己的Scrapy項目開發過程,否是新的趨勢

現在讓我們嘗試在Scrapy Shell中使用此項,scrapy shell輸入進入。

中國技術大牛,首次公開自己的Scrapy項目開發過程,否是新的趨勢

從上面的代碼中,您可以看到Scrapy項目和Python dict的使用之間沒有太大區別,但Scrapy項目可以幫助您刪除拼寫錯誤並使您的項目保持一致,這就是為什麼我建議使用Scrapy Item而不是比Python dict收集數據。

物品管道

在一個項目被spider抓取後,它將被髮送到Item Pipeline以有幾個組件處理。每個管道組件都是一個Python類,它實現了一個簡單的方法。組件可以對項執行操作,修改,刪除或將其發送到下一個組件。

項目管道可用於驗證已刪除數據,檢查重複數據或將數據插入到Mysql,PostgreSQL或MongoDB等數據庫中。

在本節中,我想向您展示如何使用項目管道將已刪除的引用數據保存到數據庫中,方法是使用SQLAlchemy-The Database Toolkit for Python。

設置SQLAlchemy

首先,我們需要確保已經安裝了Mysql Server

  1. 如果您使用的是Mac,則可以使用它homebrew來幫助您快速安裝mysql。
  2. 如果您使用的是Ubuntu或其他Linux發行版,則可以使用包管理器等apt。
  3. 如果您使用的是Windows,請使用二進制安裝程序進行安裝。
中國技術大牛,首次公開自己的Scrapy項目開發過程,否是新的趨勢

將localhost在該命令是MySQL服務器的IP地址,記得要改變它,如果你的MySQL服務器是另一臺機器上。quote_toscrape是數據庫名稱。安裝Mysql之後,現在需要使用命令

安裝SQLAlchemy pip install SQLAlchemy。

Settings.py

現在我們在項目settings.py中添加Mysql Server連接字符串,將下面的代碼添加到 scrapy_spider/settings.py

中國技術大牛,首次公開自己的Scrapy項目開發過程,否是新的趨勢

因為我們使用SQLAlchemy連接Mysql,所以這裡的drivername是mysql,如果你連接Postgres,那麼drivername就是postgres。你應該改變的user,passwd這裡的價值。

Models.py

現在創建scrapy_spider/models.py,此文件將包含由其創建的數據庫模型SQLAlchemy。

首先,我們定義一個幫助我們連接數據庫的函數。為此,我們需要導入SQLAlchemy以及我們的scrapy設置實例:

中國技術大牛,首次公開自己的Scrapy項目開發過程,否是新的趨勢

我想用這個例子指出一些要點。

1.首先,許多在線資源都喜歡用於from sqlalchemy import *將所有內容導入到我們的models.py中,但是,這不是一個好習慣,因為它可以使閱讀代碼的人感到困惑並對性能產生一些不良影響。因此,為了成為更好的開發人員,我們需要更明確地瞭解我們的導入內容。

2.我們使用get_project_settingsScrapy附帶來獲取設置對象,這可以讓我們訪問CONNECTION_STRING。

3.要使用Sqlalchemy創建表,我們必須declarative_base從SQLAlchemy 導入以將定義表結構的類映射到Mysql。我們QuoteDB繼承DeclarativeBase並設置類中的字段。對於每個字段,我們定義它的字段類型,我們的主鍵字段為Integer,其餘為字符串,文本。

在設置了sqlalchemy之後,我們可以通過輸入來測試它是否按預期工作scrapy shell。請記住使用%paste命令粘貼下面的代碼塊以在Scrapy shell中進行測試。您可以查看這篇文章,瞭解有關Scrapy shell Scrapy教程#6:Scrapy Shell概述和技巧的更多提示。

中國技術大牛,首次公開自己的Scrapy項目開發過程,否是新的趨勢

如果您不清楚此代碼阻止了什麼,請不要擔心,我將在下一節中詳細解釋。你應該知道的是,如果沒有引發錯誤,那麼你會在終端中看到測試引號文本,這意味著SqlAlchemy可以在你的環境中按預期工作。現在我們可以將此代碼塊移動到我們的管道中,使其由spider抓取進程項並將數據保存到Mysql數據庫中。

將Scraped數據流水線化到數據庫

pipelines.pyscrapy項目中有一個文件,它定義了我們在Scrapy項目中使用的管道。我們可以修改ScrapySpiderPipeline文件,使其按照我們的預期將數據保存到數據庫。

中國技術大牛,首次公開自己的Scrapy項目開發過程,否是新的趨勢

這裡,我們有一個構造函數,def __init__(self)通過定義引擎,DB中的數據表來初始化類。create_table

如果DB中沒有數據表。

函數會嘗試為我們創建數據表。每個管道組件類都必須有一個方法process_item,該方法將被順序調用以處理已刪除的項目。所以在process_item中,我們與數據庫建立會話並將數據設置為我們的QuoteDB模型。然後將其添加到我們的會話中,您應該注意的是,在您調用該commit方法之前,此時數據不會保存到數據庫。

如果commit方法有問題,那麼rollback將幫助我們回滾正在進行的事務。

在process_item的最後,我們將項目返回到下一個要處理的管道。

激活管道

完成自定義管道後,我們需要在settings.py中激活它,這ITEM_PIPELINES是您應該修改的唯一一個。

中國技術大牛,首次公開自己的Scrapy項目開發過程,否是新的趨勢

此處的數字決定了它們運行的順序,項目從較低值到較高值類別。您可以設置0-1000之間的數字。

運行蜘蛛和檢查數據庫

現在我們可以運行我們的蜘蛛並在DB中檢查結果scrapy crawl quotes_spider,並且在完成蜘蛛完成後,您可以登錄mysql服務器來檢查結果。

中國技術大牛,首次公開自己的Scrapy項目開發過程,否是新的趨勢

如您所見,由於在測試SqlAchemy時插入了第一行和第二行,因此您需要刪除生產中的數據。建議的方法是在

def __init__我們的Pipeline組件類中添加一些代碼。您可以將此視為一個小練習,如果您有任何問題,請將消息發送給我。

故障排除:

如果您嘗試使用SqSqlalchemy將已刪除項目插入數據庫,本節將列出您可能遇到的一些錯誤。

ImportError: No module named 'MySQLdb'

此錯誤通常是由於缺少mysql連接器引起的,我們可以通過安裝第三方軟件包來安裝該問題。

pip install mysqlclient 無論你的Python是Python2還是Python3,都可以解決你的問題。

一些在線舊資源會告訴您使用,pip install mysql-python但此包只能在Python2中使用。這mysqlclient是更好的選擇,因為它可以在兩個Python版本上工作。

結論

在這個Scrapy教程中,我談到了如何定義Scrapy項目,如何使用Scrapy項目,以及如何創建自定義項目管道以將Item的數據保存到DB中。您還學習瞭如何使用SQLAlchemy(python世界中最流行的ORM)為您做一些數據庫工作。由於我在這篇文章中主要關注Scrapy,所以在本教程中我沒有多談SQLAlchemy,如果在將代碼導入項目時有任何疑問,請留言並儘快回覆。

喜歡的話就轉發這篇文章吧!歡迎在下方評論,留下你的獨特見解分享給大家! 私信“01”還可獲取10本電子書


分享到:


相關文章: