2017-01-23 8 views
0

私はPythonとScrapyで初めてです。私はプロジェクトを持っています。クモではそのようなコードがあります:(Python、Scrapy)txtファイルからScrapyスパイダーにデータを取り込む

class MySpider(BaseSpider): 
    name = "project" 
    allowed_domains = ["domain.com"] 
    start_urls = ["https://domain.com/%d" % i for i in range(12308128,12308148)] 

私はtxtファイル(またはcsvファイル)から1230812812308148の間の範囲の数値を取りたい

2本のラインを含むそのnumbers.txtを言うことができますその中に:

12308128 
12308148 

これらの数字をスパイダーにインポートするにはどうすればよいですか?他のプロセスはtxtファイル内のこれらの番号を定期的に変更し、私のスパイダーは番号を更新して実行します。

ありがとうございます。

答えて

1

あなたのURL文字列にファイルを読み込み、値を渡す必要があると考えている:このクモが開きます

class Myspider(scrapy.Spider): 
    name = 'myspider' 

    def start_requests(self): 
     # read file data 
     with open('filename', 'r') as f: 
      start, end = f.read().split('\n', 1) 
     # make range and urls with your numbers 
     range_ = (int(start.strip()), int(end.strip())) 
     start_urls = ["https://domain.com/%d" % i for i in range(range_)] 
     for url in start_urls: 
      yield scrapy.Request(url) 

ファイルを読んだり、数字を読み込んだり、開始URLを作成したり、繰り返したり、それぞれのリクエストをスケジュールしたりすることができます。

デフォルトstart_requests()法のようなものになります。ですから、私たちはそれをオーバーライドすることで、ここでやっているかを見ることができます

def start_requests(self): 
    for url in self.start_urls: 
     yield scrapy.Request(url) 

を。

+0

ksを助けますが、私のプロジェクトをクロールしている間はエラーが発生します。 'IndentationError:この行のインデントされたブロックを期待しています:' open( 'numbers.txt'、 'r')をf: ' –

+0

にしました。 'def'行に接続する必要があります。しかし、それは 'SyntaxError: 'yield yield' outside function 'となりました –

+0

私はあなたがそれをコピーしたときに誤ってインデントされていると思います。インデントが私の例に一致することを確認してください。エラーがあってはいけません。 – Granitosaurus

0

私はあなたが蜘蛛のstart_requests()方法でstart_urlsロジックをオーバーライドすることができ

Start_Range = datacont.readline() 
End_Range = datacont.readline() 
print Start_Range 
print End_Range 
0

あなたは、exのためscrapy crawlコマンドのオプション-aを使用してコマンドラインからクモのコンストラクタにパラメータを渡すことができます)

scrapy crawl spider -a inputfile=filename.txt 

そして、このようにそれを使用します。

class MySpider(scrapy.Spider): 
    name = 'spider' 
    def __init__(self, *args, **kwargs): 
     self.infile = kwargs.pop('inputfile', None) 

    def start_requests(self): 
     if self.infile is None: 
      raise CloseSpider('No filename') 
     # process file, name in self.infile 

またはあなただけ渡すことができます次のように同様の方法で開始値と終了値を設定します。

scrapy crawl spider -a start=10000 -a end=20000 
+0

返信ありがとうございますが範囲に書き込む必要はありますか?どのようにあなたのコードで範囲に開始と終了番号を書き込みますか? –

関連する問題