Scrapy框架

阿麗米熱發表於2023-03-29

1. Scrapy介紹

1.1. Scrapy框架

Scrapy是用純Python實現一個為了爬取網站資料、提取結構性資料而編寫的應用框架,用途非常廣泛。

Scrapy框架

  • Scrapy Engine(引擎): 負責Spider、ItemPipeline、Downloader、Scheduler中間的通訊,訊號、資料傳遞等。

  • Scheduler(排程器): 它負責接受引擎傳送過來的Request請求,並按照一定的方式進行整理排列,入隊,當引擎需要時,交還給引擎。

  • Downloader(下載器):負責下載Scrapy Engine(引擎)傳送的所有Requests請求,並將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來處理,

  • Spider(爬蟲):它負責處理所有Responses,從中分析提取資料,獲取Item欄位需要的資料,並將需要跟進的URL提交給引擎,再次進入Scheduler(排程器),

  • Item Pipeline(管道):它負責處理Spider中獲取到的Item,並進行進行後期處理(詳細分析、過濾、儲存等)的地方.

  • Downloader Middlewares(下載中介軟體):你可以當作是一個可以自定義擴充套件下載功能的元件。

  • Spider Middlewares(Spider中介軟體):你可以理解為是一個可以自定擴充套件和操作引擎和Spider中間通訊的功能元件(比如進入Spider的Responses;和從Spider出去的Requests)

1.2. Scrapy執行流程

  1. 引擎:Hi!Spider, 你要處理哪一個網站?

  2. Spider:老大要我處理xxxx.com

  3. 引擎:你把第一個需要處理的URL給我吧。

  4. Spider:給你,第一個URL是xxxxxxx.com

  5. 引擎:Hi!排程器,我這有request請求你幫我排序入隊一下。

  6. 排程器:好的,正在處理你等一下。

  7. 引擎:Hi!排程器,把你處理好的request請求給我。

  8. 排程器:給你,這是我處理好的request

  9. 引擎:Hi!下載器,你按照老大的下載中介軟體的設定幫我下載一下這個request請求

  10. 下載器:好的!給你,這是下載好的東西。(如果失敗:sorry,這個request下載失敗了。然後引擎告訴排程器,這個request下載失敗了,你記錄一下,我們待會兒再下載)

  11. 引擎:Hi!Spider,這是下載好的東西,並且已經按照老大的下載中介軟體處理過了,你自己處理一下(注意!這兒responses預設是交給def parse()這個函式處理的)

  12. Spider:(處理完畢資料之後對於需要跟進的URL),Hi!引擎,我這裡有兩個結果,這個是我需要跟進的URL,還有這個是我獲取到的Item資料。

  13. 引擎:Hi !管道 我這兒有個item你幫我處理一下!排程器!這是需要跟進URL你幫我處理下。然後從第四步開始迴圈,直到獲取完老大需要全部資訊。

  14. 管道“排程器:好的,現在就做!

1.3. 製作Srapy爬蟲的四部曲

  • 新建專案 (scrapy startproject xxx):新建一個新的爬蟲專案
  • 明確目標 (編寫items.py):明確你想要抓取的目標
  • 製作爬蟲 (spiders/xxspider.py):製作爬蟲開始爬取網頁
  • 儲存內容 (pipelines.py):設計管道儲存爬取內容

1.4. 檔案目錄

插入scrapy01.png

  • scrapy.cfg :專案的配置檔案
[settings]
default = mySpider.settings

[deploy]
#url = http://localhost:6800/
project = mySpider
  • mySpider/ :專案的Python模組,將會從這裡引用程式碼
  • __init__: 必須的檔案
  • mySpider/items.py :專案的目標檔案
import scrapy


class MyspiderItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # age = scrapy.Field()
    pass
  • mySpider/Middlewares.py :
  • mySpider/pipelines.py :專案的管道檔案
class MyspiderPipeline(object):
    def process_item(self, item, spider):
        return item
  • mySpider/settings.py :專案的設定檔案
# 你的爬蟲名字
BOT_NAME = `mySpider`

# 你的爬蟲的位置
SPIDER_MODULES = [`mySpider.spiders`]
NEWSPIDER_MODULE = `mySpider.spiders`

# 是否遵循robust協議
ROBOTSTXT_OBEY = True

# 爬蟲併發量
#CONCURRENT_REQUESTS = 32

# 下載延遲
#DOWNLOAD_DELAY = 3
# 下載延遲的額外設定:一般不用設定
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16

# 是否使用cookie
#COOKIES_ENABLED = False

# 訪問電話線設定
#TELNETCONSOLE_ENABLED = False

# 設定預設請求報頭
#DEFAULT_REQUEST_HEADERS = {
# `User-Agent`: ``
#   `Accept`: `text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8`,
#   `Accept-Language`: `en`,
#}

# 爬蟲中間鍵:一般不設定
#SPIDER_MIDDLEWARES = {
#    `mySpider.middlewares.MyspiderSpiderMiddleware`: 543,
#}

# 下載中間鍵: 後面的值是優先順序,越小越高
#DOWNLOADER_MIDDLEWARES = {
#    `mySpider.middlewares.MyspiderDownloaderMiddleware`: 543,
#}

# 延展,沒什麼用
#EXTENSIONS = {
#    `scrapy.extensions.telnet.TelnetConsole`: None,
#}

# 管道檔案---經常使用的,用於指定優先順序
# 
#ITEM_PIPELINES = {
#    `mySpider.pipelines.MyspiderPipeline`: 300,
#}

2. Scrapy全部流程

我們打算抓取:http://www.itcast.cn/channel/teacher.shtml 網站裡的所有講師的姓名、職稱和個人資訊。

  • 建立專案
  • 編寫items.py檔案:設定需要儲存的資料欄位
  • 建立爬蟲模板
    • 在spiders/資料夾下面執行scrapy genspider spidername "startURL"
  • 進入xxx/spiders: 編寫爬蟲檔案,檔案裡的name就是爬蟲名
  • 寫管道檔案
    • 設定檔案儲存的形式和寫入檔案
    • 在setting中設定優先順序(預設自動設定)
    • 新增User-Agent到setting中
  • 執行:
    scrapy crawl itcast
    • scrapy crawl itcast -o json/csv/xml/
  • 資料處理
    • 資料:交給管道檔案處理 yield item
    • 請求:重新傳送給排程器入、出佇列,交給下載器下載 yield scrapy.Request(url, callback = self.parse)

3. 寫爬蟲主要檔案

要建立一個Spider, 你必須用scrapy.Spider類建立一個子類,並確定了三個強制的屬性 和 一個方法。

  • name = "" :這個爬蟲的識別名稱,必須是唯一的,在不同的爬蟲必須定義不同的名字。

  • allow_domains = [] 是搜尋的域名範圍,也就是爬蟲的約束區域,規定爬蟲只爬取這個域名下的網頁,不存在的URL會被忽略。

  • start_urls = ():爬取的URL元祖/列表。爬蟲從這裡開始抓取資料,所以,第一次下載的資料將會從這些urls開始。其他子URL將會從這些起始URL中繼承性生成。

  • parse(self, response) :解析的方法,每個初始URL完成下載後將被呼叫,呼叫的時候傳入從每一個URL傳回的Response物件來作為唯一引數,主要作用如下:

    • 負責解析返回的網頁資料(response.body),提取結構化資料(生成item)
    • 生成需要下一頁的URL請求。

相關文章