これはWindows 7でpython 2.7
Capsというディレクトリにスクレイピープロジェクトがあります(scrapy.cfgがある場所です)
私のスパイダーはcaps\caps\spiders\campSpider.pyにあります
スクレイピープロジェクトにcdして実行しよう
scrapy crawl campSpider -o items.json -t json
クモが見つからないというエラーが表示されます。クラス名iscampSpider
...
spider = self.crawler.spiders.create(spname, **opts.spargs)
File "c:\Python27\lib\site-packages\scrapy-0.14.0.2841-py2.7-win32.Egg\scrapy\spidermanager.py", l
ine 43, in create
raise KeyError("Spider not found: %s" % spider_name)
KeyError: 'Spider not found: campSpider'
構成アイテムがありませんか?
スパイダーの"name"プロパティが設定されていることを確認してください。例:
class campSpider(BaseSpider):
name = 'campSpider'
Nameプロパティがないと、スクレイピーマネージャーはあなたのクモを見つけることができません。
また、プロジェクトがscrapy
と呼ばれないようにしてください!私はその間違いを犯し、名前を変更して問題を解決しました。
コマンドラインでscrapy list
を実行してみてください。スパイダーにエラーがある場合、それを検出します。
私の場合、別のプロジェクトからコードを率直にコピーし、スパイダーモジュールのインポートからプロジェクト名を変更するのを忘れていました
SPIDER_MODULES 設定をセットアップしましたか?
SPIDER_MODULES
デフォルト:
[]
Scrapyがスパイダーを探すモジュールのリスト。
例:
SPIDER_MODULES = ['mybot.spiders_prod', 'mybot.spiders_dev']
クモに名前を付けなければなりません。
ただし、BaseSpiderはdeprecatedで、Spider代わりに。
from scrapy.spiders import Spider
class campSpider(Spider):
name = 'campSpider'
プロジェクトは、startprojectコマンドによって作成されている必要があります。
scrapy startproject project_name
これにより、次のディレクトリツリーが得られます。
project_name/
scrapy.cfg # deploy configuration file
project_name/ # project's Python module, you'll import your code from here
__init__.py
items.py # project items file
pipelines.py # project pipelines file
settings.py # project settings file
spiders/ # a directory where you'll later put your spiders
__init__.py
...
settings.pyにスパイダーモジュールの定義があることを確認してください。例えば:
BOT_NAME = 'bot_name' # Usually equals to your project_name
SPIDER_MODULES = ['project_name.spiders']
NEWSPIDER_MODULE = 'project_name.spiders'
スパイダーをローカルまたは ScrappingHub で実行しても問題ありません。
同じ問題が発生する可能性がある人は、スパイダーのname
を設定し、SPIDER_MODULES
およびNEWSPIDER_MODULE
スクレイピー設定で、scrapyd
サービスを実行している場合は、変更を適用するために再起動する必要があります
スパイダーファイルがスパイダーディレクトリに保存されていることを確認してください。クローラーはスパイダーディレクトリでスパイダー名を探します
プロジェクトを使用しない場合、runspiderとfileNameを使用し、プロジェクトを使用する場合は、クロールと名前のサンプルを使用します:C/user> scrapy runspider myFile.py
Name CrawlSpiderクラスの属性はスパイダー名を定義し、この名前はスパイダーを呼び出すためのコマンドラインで使用されます。
import json
from scrapy import Spider
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.linkextractor import LinkExtractor
class NameSpider(CrawlSpider):
name = 'name of spider'
allowed_domains = ['allowed domains of web portal to be scrapped']
start_urls = ['start url of of web portal to be scrapped']
custom_settings = {
'DOWNLOAD_DELAY': 1,
'USER_AGENT': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
product_css = ['.main-menu']
rules = [
Rule(LinkExtractor(restrict_css=product_css), callback='parse'),
]
def parse(self, response):
//implementation of business logic
私もこの問題を抱えていましたが、かなり小さいことがわかりました。クラスがscrapy.Spider
を継承していることを確認してください
my_class(scrapy.Spider):
私の場合、「LOG_STDOUT = True」を設定すると、「/ listspiders.json」でスパイダーを探しているときに、scrapydはjson応答に結果を返すことができません。その代わりに、結果は、scrapydのdefault_scrapyd.confファイルで設定したログファイルに出力されます。それで、私はこのように設定を変更しました、そしてそれはうまく働きました。
LOG_STDOUT = False
インデントも確認してください。私のクモのクラスは1タブ分インデントされています。どういうわけか、クラスを無効にするか何か。