scrapy框架中多個spider,tiems,pipelines的使用及運行方法

来源:https://www.cnblogs.com/nmsghgnv/archive/2020/02/26/12369656.html
-Advertisement-
Play Games

用scrapy只創建一個項目,創建多個spider,每個spider指定items,pipelines.啟動爬蟲時只寫一個啟動腳本就可以全部同時啟動。 本文代碼已上傳至github,鏈接在文未。 一,創建多個spider的scrapy項目 scrapy startproject mymultispi ...


用scrapy只創建一個項目,創建多個spider,每個spider指定items,pipelines.啟動爬蟲時只寫一個啟動腳本就可以全部同時啟動。

本文代碼已上傳至github,鏈接在文未。

一,創建多個spider的scrapy項目

scrapy startproject mymultispider
cd mymultispider
scrapy genspider myspd1 sina.com.cn
scrapy genspider myspd2 sina.com.cn
scrapy genspider myspd3 sina.com.cn

二,運行方法

1.為了方便觀察,在spider中分別列印相關信息

import scrapy
class Myspd1Spider(scrapy.Spider):
    name = 'myspd1'
    allowed_domains = ['sina.com.cn']
    start_urls = ['http://sina.com.cn/']

def parse(self, response): print('myspd1')

其他如myspd2,myspd3分別列印相關內容。

2.多個spider運行方法有兩種,第一種寫法比較簡單,在項目目錄下創建crawl.py文件,內容如下

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

process = CrawlerProcess(get_project_settings())

# myspd1是爬蟲名
process.crawl('myspd1')
process.crawl('myspd2')
process.crawl('myspd3')

process.start()

為了觀察方便,可在settings.py文件中限定日誌輸出

LOG_LEVEL = 'ERROR'

右鍵運行此文件即可,輸出如下

 

 

 3.第二種運行方法為修改crawl源碼,可以從官方的github中找到:https://github.com/scrapy/scrapy/blob/master/scrapy/commands/crawl.py

在spiders目錄的同級目錄下創建一個mycmd目錄,併在該目錄中創建一個mycrawl.py,將crawl源碼複製進來,修改其中的run方法,改為如下內容

def run(self, args, opts):
    # 獲取爬蟲列表
    spd_loader_list = self.crawler_process.spider_loader.list()
    # 遍歷各爬蟲
    for spname in spd_loader_list or args:
        self.crawler_process.crawl(spname, **opts.spargs)
        print("此時啟動的爬蟲:" + spname)
    self.crawler_process.start()

在該文件的目錄下創建初始化文件__init__.py

完成後機構目錄如下

 

 使用命令啟動爬蟲

scrapy mycrawl --nolog

輸出如下:

 

 

三,指定items

1,這個比較簡單,在items.py文件內創建相應的類,在spider中引入即可

items.py

import scrapy


class MymultispiderItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    pass

class Myspd1spiderItem(scrapy.Item):
    name = scrapy.Field()

class Myspd2spiderItem(scrapy.Item):
    name = scrapy.Field()

class Myspd3spiderItem(scrapy.Item):
    name = scrapy.Field()

spider內,例myspd1

# -*- coding: utf-8 -*-
import scrapy
from mymultispider.items import Myspd1spiderItem

class Myspd1Spider(scrapy.Spider):
    name = 'myspd1'
    allowed_domains = ['sina.com.cn']
    start_urls = ['http://sina.com.cn/']

    def parse(self, response):
        print('myspd1')
        item = Myspd1spiderItem()
        item['name'] = 'myspd1的pipelines'
        yield item

四,指定pipelines

1,這個也有兩種方法,方法一,定義多個pipeline類:

pipelines.py文件內:

class Myspd1spiderPipeline(object):
    def process_item(self,item,spider):
        print(item['name'])
        return item

class Myspd2spiderPipeline(object):
    def process_item(self,item,spider):
        print(item['name'])
        return item

class Myspd3spiderPipeline(object):
    def process_item(self,item,spider):
        print(item['name'])
        return item

1.1settings.py文件開啟管道

ITEM_PIPELINES = {
   # 'mymultispider.pipelines.MymultispiderPipeline': 300,
   'mymultispider.pipelines.Myspd1spiderPipeline': 300,
   'mymultispider.pipelines.Myspd2spiderPipeline': 300,
   'mymultispider.pipelines.Myspd3spiderPipeline': 300,
}

1.2spider中設置管道,例myspd1

# -*- coding: utf-8 -*-
import scrapy
from mymultispider.items import Myspd1spiderItem

class Myspd1Spider(scrapy.Spider):
    name = 'myspd1'
    allowed_domains = ['sina.com.cn']
    start_urls = ['http://sina.com.cn/']
    custom_settings = {
        'ITEM_PIPELINES': {'mymultispider.pipelines.Myspd1spiderPipeline': 300},
    }

    def parse(self, response):
        print('myspd1')
        item = Myspd1spiderItem()
        item['name'] = 'myspd1的pipelines'
        yield item

指定管道的代碼

custom_settings = {
        'ITEM_PIPELINES': {'mymultispider.pipelines.Myspd1spiderPipeline': 300},
    }

1.3運行crawl文件,運行結果如下

 

 2,方法二,在pipelines.py文件內判斷是哪個爬蟲的結果

2.1 pipelines.py文件內

class MymultispiderPipeline(object):
    def process_item(self, item, spider):
        if spider.name == 'myspd1':
            print('myspd1的pipelines')
        elif spider.name == 'myspd2':
            print('myspd2的pipelines')
        elif spider.name == 'myspd3':
            print('myspd3的pipelines')
        return item

2.2 settings.py文件內只開啟MymultispiderPipeline這個管道文件

ITEM_PIPELINES = {
   'mymultispider.pipelines.MymultispiderPipeline': 300,
   # 'mymultispider.pipelines.Myspd1spiderPipeline': 300,
   # 'mymultispider.pipelines.Myspd2spiderPipeline': 300,
   # 'mymultispider.pipelines.Myspd3spiderPipeline': 300,
}

2.3spider中屏蔽掉指定pipelines的相關代碼

# -*- coding: utf-8 -*-
import scrapy
from mymultispider.items import Myspd1spiderItem

class Myspd1Spider(scrapy.Spider):
    name = 'myspd1'
    allowed_domains = ['sina.com.cn']
    start_urls = ['http://sina.com.cn/']
    # custom_settings = {
    #     'ITEM_PIPELINES': {'mymultispider.pipelines.Myspd1spiderPipeline': 300},
    # }

    def parse(self, response):
        print('myspd1')
        item = Myspd1spiderItem()
        item['name'] = 'myspd1的pipelines'
        yield item

2.4 運行crawl.py文件,結果如下

 

 

代碼git地址:https://github.com/terroristhouse/crawler

 

python系列教程:

鏈接:https://pan.baidu.com/s/10eUCb1tD9GPuua5h_ERjHA 

提取碼:h0td 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 鑒於python3目前已成流行之勢,而各發行版Linux依然是自帶python2.x,筆者嘗試在centos7下,部署Python3.x與2.x共存環境 本文參考博主良哥95網址https://blog.csdn.net/qq_39091354/article/details/86584046內容。 ...
  • python3-cookbook中每個小節以問題、解決方案和討論三個部分探討了Python3在某類問題中的最優解決方式,或者說是探討Python3本身的數據結構、函數、類等特性在某類問題上如何更好地使用。這本書對於加深Python3的理解和提升Python編程能力的都有顯著幫助,特別是對怎麼提高Py ...
  • 第一部分 必答題 1,簡述列舉瞭解的編程語言及語言間的區別? Python 解釋型語言,代碼簡潔,易懂 C語言 編譯型語言,底層語言 c++ 編譯型語言,在C語言基礎上加了面向對象 Java 混合型語言,可拓展性高 Golang 編譯型語言,強類型,代碼規範,高併發 語言特點: 靈活簡潔,語言優美 ...
  • 訪問許可權控制一個類的public的成員變數、成員函數,可以通過類的實例變數進行訪問。一個類的protected的成員變數、成員函數,無法通過類的實例變數進行訪問,但是可以通過類的友元函數、友元類進行訪問。一個類的private的成員變數、成員函數,無法通過類的實例變數進行訪問,但是可以通過類的友元函... ...
  • django項目中遇到要實現定時任務,所以選用了簡單易用的django-crontab插件。 1、安裝 django-crontab pip install django-crontab 2、定時要執行的腳本 先寫個簡單的測試腳本。crontab/crons.py import datetime d ...
  • 開發環境: Windows操作系統開發工具: MyEclipse+Jdk+Tomcat+Mysql資料庫運行效果圖 源碼及原文鏈接:https://javadao.xyz/forum.php?mod=viewthread&tid=50 ...
  • 最近django項目中使用到了定製後臺定時任務時報出“”及“ in crontab file, can't install”。經確認,根本原因是crontab文件中時間定義不正確導致的。簡單記錄一下這個,同時確認一下crontab中時間格式的規範,供參考。 1.具體報錯信息如下 ora10g@sec ...
  • 開發環境: Windows操作系統開發工具: Eclipse+Jdk+Tomcat+MySQL運行效果圖 源碼及原文鏈接:https://javadao.xyz/forum.php?mod=viewthread&tid=54 ...
一周排行
    -Advertisement-
    Play Games
  • JWT(JSON Web Token)是一種用於在網路應用之間傳遞信息的開放標準(RFC 7519)。它使用 JSON 對象在安全可靠的方式下傳遞信息,通常用於身份驗證和信息交換。 在Web API中,JWT通常用於對用戶進行身份驗證和授權。當用戶登錄成功後,伺服器會生成一個Token並返回給客戶端 ...
  • 老周在幾個世紀前曾寫過樹莓派相關的 iOT 水文,之所以沒寫 Nano Framework 相關的內容,是因為那時候這貨還不成熟,可玩性不高。不過,這貨現在已經相對完善,老周都把它用在項目上了——第一個是自製的智能插座,這個某寶上50多塊可以買到,搜“esp32 插座”就能找到。一種是 86 型盒子 ...
  • 引言 上一篇我們創建了一個Sample.Api項目和Sample.Repository,並且帶大家熟悉了一下Moq的概念,這一章我們來實戰一下在xUnit項目使用依賴註入。 Xunit.DependencyInjection Xunit.DependencyInjection 是一個用於 xUnit ...
  • 在 Avalonia 中,樣式是定義控制項外觀的一種方式,而控制項主題則是一組樣式和資源,用於定義應用程式的整體外觀和感覺。本文將深入探討這些概念,並提供示例代碼以幫助您更好地理解它們。 樣式是什麼? 樣式是一組屬性,用於定義控制項的外觀。它們可以包括背景色、邊框、字體樣式等。在 Avalonia 中,樣 ...
  • 在處理大型Excel工作簿時,有時候我們需要在工作表中凍結窗格,這樣可以在滾動查看數據的同時保持某些行或列固定不動。凍結窗格可以幫助我們更容易地導航和理解複雜的數據集。相反,當你不需要凍結窗格時,你可能需要解凍它們以獲得完整的視野。 下麵將介紹如何使用免費.NET庫通過C#實現凍結Excel視窗以鎖 ...
  • .NET 部署 IIS 的簡單步驟一: 下載 dotnet-hosting-x.y.z-win.exe ,下載地址:.NET Downloads (Linux, macOS, and Windows) (microsoft.com) .NET 部署 IIS 的簡單步驟二: 選擇對應的版本,點擊進入詳 ...
  • 拓展閱讀 資料庫設計工具-08-概覽 資料庫設計工具-08-powerdesigner 資料庫設計工具-09-mysql workbench 資料庫設計工具-10-dbdesign 資料庫設計工具-11-dbeaver 資料庫設計工具-12-pgmodeler 資料庫設計工具-13-erdplus ...
  • 初識STL STL,(Standard Template Library),即"標準模板庫",由惠普實驗室開發,STL中提供了非常多對信息學奧賽很有用的東西。 vector vetor是STL中的一個容器,可以看作一個不定長的數組,其基本形式為: vector<數據類型> 名字; 如: vector ...
  • 前言 最近自己做了個 Falsk 小項目,在部署上伺服器的時候,發現雖然不乏相關教程,但大多都是將自己項目代碼複製出來,不講核心邏輯,不太簡潔,於是將自己部署的經驗寫成內容分享出來。 uWSGI 簡介 uWSGI: 一種實現了多種協議(包括 uwsgi、http)並能提供伺服器搭建功能的 Pytho ...
  • 1 文本Embedding 將整個文本轉化為實數向量的技術。 Embedding優點是可將離散的詞語或句子轉化為連續的向量,就可用數學方法來處理詞語或句子,捕捉到文本的語義信息,文本和文本的關係信息。 ◉ 優質的Embedding通常會讓語義相似的文本在空間中彼此接近 ◉ 優質的Embedding相 ...