2016-12-12 10 views
2

私はscrapyする新しいspider.pyを追加するたびに、私は、例えば、いくつかのモジュールをインポートする必要があります。モジュールをscrapyスパイダーに一度インポートする方法は?

from __future__ import division 
from extruct.w3cmicrodata import MicrodataExtractor 
from extruct.jsonld import JsonLdExtractor 
import scrapy 
import re 
import logging 
from pprint import pprint 
from scrapy.exceptions import DropItem 
from urlparse import urlparse 
import tldextract 
import json 
.... 

それは、これらのモジュールごとに追加非常に退屈です。

私はPythonを初めて使いました。これらのものを一度インポートしてから、各スパイダーファイルごとにインポートする必要はありませんか?ちょうどPHPのように。

答えて

3

これらのインポートをすべてモジュール(myimports.py)に入れてからfrom .myimports import *を実行することはできますが、これは悪い習慣です。暗黙的なインポートは、コードのメンテナンス性が低くなるために避けてください。

一般的なインポートがある場合は、これらのスパイダーに共通のコードがあり、それをユーティリティ関数のライブラリまたはベーススパイダークラスに抽出できますか?

scrapy genspiderコマンドとカスタムスパイダーテンプレートを使用することもできます。次のような構造でフォルダを作成します:

mytemplates 
    spiders 
    myspider.tmpl 

次にmyspider.tmplファイルにクモテンプレート(スターターPythonコードで単にファイル)を入れ、このフォルダにプロジェクトのTEMPLATES_DIRオプションを設定します。

現在namedomainが必要です。引数:genspider;テンプレート内でこれらの変数を使用できます(例:

import scrapy 
# your long imports list 

class MySpider(scrapy.Spider): 
    name = "$name" 
    allowed_domains = ["$domain"] 
    start_urls = ['http://$domain/'] 

    def parse(self, response): 
     pass 

その後scrapy genspider -t myspider <spider-name> <domain-to-crawl>を実行し、あなたのテンプレートが利用可能であることを確認するためにscrapy genspider --listを実行します。

さらに多くのテンプレート生成ユーティリティがあります。cookiecutterをご覧ください。

私の意見では、一般的なコードを抽出することですが、これはインポートリストを減らすのに役立ちます。コード生成は悪い解決策であり、すべての輸入品を含むモジュールはひどい解決策であり、最悪です。

インポートの長いリストについてあまり気にしないでください。Pythonではインポートのリストをファイルの先頭に置くのが一般的です。それは良いことです。関数やクラスがどこから来たのか分かりますデバッグが容易になります。

+0

この詳細な回答ありがとうございます。私はPHPの世界から来た、私はPythonの禅を学ぶためにいくつかの時間が必要だと思う:) – Cl0udSt0ne

関連する問題