2017-11-16 19 views
1

私はPythonでScrapyを使ってWebクローラをプログラミングしています。目的は、所定の時間間隔でウェブページの変化を監視することである。 ウェブサイトにログインすると、スパイダーはX分ごとにWebページを要求し、特定のデータがページから抽出され、テキストファイルに保存されます。 テキストファイルは、スパイダーが閉じたときにのみ書き込まれ、テキストファイルの行は時間順に並んでいないことが判明しました。私は何が起こっているのか理解できません。多分、それはScrapyモジュールの特定の作業方法でしょうか?何か案は?scrapy spider:時系列での出力

import scrapy 
from scrapy.http import Request 
from scrapy.http import FormRequest 
from scraping_example.loginform import fill_login_form 
from datetime import datetime 
import time 


class ExampleSpiderSpider(scrapy.Spider): 
    name = 'example_spider' 
    allowed_domains = ['example.com'] 
    start_urls = ['http:/www.example.com/login'] 
    login_user = 'edging780' 
    login_pass = '' 

    def parse(self, response): 
     (args, url, method) = fill_login_form(response.url, 
       response.body, self.login_user, self.login_pass) 
     return FormRequest(url, method=method, formdata=args, 
          callback=self.after_login) 

    def after_login(self, response): 
     for i in range(0,6): 
      request = Request('https://www.example.com/page_to_scrape', callback=self.get_table, dont_filter = True) 
      request.meta['dateTime'] = str(datetime.now()) 
      request.meta['order'] = str(i) 
      yield request 
      time.sleep(600) 
     return 

    def get_table(self, response): 
     table = response.xpath('//table[@class="example_table"]/tbody/tr[not(contains(@class,"thead"))]') 
     Data=[] 
     for n_row in range(0,len(table)): 
      row = table[n_row] 
      Data.append(row.xpath('td[1]/text()').extract())  

     dictionary = {'Time': response.meta['dateTime'], 
       'Order': response.meta['order'], 
       'Data': Data}    
     with open('output.txt', 'a') as f: 
      f.write(str(dictionary) + '\n') 
     return 
+0

'after_login'をジェネレータとして使用するのは意図した通りですか?私はドキュメントでそれを見つけることができませんでした:https://doc.scrapy.org/en/latest/topics/request-response.html、https://doc.scrapy.org/en/latest/topics/request-response .html#scrapy.http.FormRequest、https://doc.scrapy.org/en/latest/topics/request-response.html#topics-request-response-ref-request-callback-arguments、https:// doc .scrapy.org/ja/latest/topics/request-response.html#scrapy.http.FormRequest.from_response、https://stackoverflow.com/questions/5850755/using-scrapy-with-authenticated-logged-in-user -session、... –

+0

私はあなたの質問を理解しているかどうかはわかりません。おそらく数ヶ月前にプログラミングを始めたからでしょう。 'after login'メソッドの中で' yield'と 'return'を使うことを参照すると、私はオンラインで見つかったいくつかの例から取りました。 'output.txt'の行が時系列順になっていないことを除いて、コードは機能します – edding780

+0

このような例にリンクできますか? ( 'yield'はジェネレータ式を生成し、' .next() 'は次の値を返します。これは' return'とは異なります)。 –

答えて

0

あなたがこの参照することもできます。https://doc.scrapy.org/en/latest/faq.html#does-scrapy-crawl-in-breadth-first-or-depth-first-order

と、この:(LIFO (last in, first out)

Scrapyは、あなたが彼に与えるために要求を処理しませんが、あなたは、この動作を変更することができますします上記のリンクで説明されているオプションがあります)。

また、あなたが

編集...代わりにあなたがやるようなあなたのアイテムを扱うItemsfeed exportersを使用して検討する必要がありますも私を必要と

DEPTH_PRIORITY = 1 
SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue' 
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue' 

: は、の上後者の設定は1

によって要求を一にすることです

CONCURRENT_REQUESTS = 1 

設定