2017-09-01 3 views
0

ここには単純なpythonファイル--test.pyがあります。スクラップクロールの動作:どのクラスがインスタンス化され、どのメソッドが呼び出されましたか?

import math 
class myClass(): 
    def myFun(self,x): 
     return(math.sqrt(x)) 

if __name__ == "__main__": 
    myInstance=myClass() 
    print(myInstance.myFun(9)) 

python test.pyで3を印刷します。実行プロセスを分析しましょう。
1. myClassをインスタンス化してmyInstanceに割り当てます。
2. myFun関数を呼び出して結果を出力します。

治療の向きです。
scrap1.4マニュアルでは、quotes_spider.pyは次のとおりです。 scrapy crawl quotesでクモを実行するには

import scrapy 

class QuotesSpider(scrapy.Spider): 
    name = "quotes" 

    def start_requests(self): 
     urls = [ 
      'http://quotes.toscrape.com/page/1/', 
      'http://quotes.toscrape.com/page/2/', 
     ] 
     for url in urls: 
      yield scrapy.Request(url=url, callback=self.parse) 

    def parse(self, response): 
     page = response.url.split("/")[-2] 
     filename = 'quotes-%s.html' % page 
     with open(filename, 'wb') as f: 
      f.write(response.body) 
     self.log('Saved file %s' % filename) 

、私は困惑しています:
1.Whereはクモのための主な機能や本体のですか?
2.どのクラスがインスタンス化されましたか?
3.どのメソッドが呼び出されましたか?

mySpider = QuotesSpider(scrapy.Spider) 
mySpider.parse(response) 

どのようにスクラップクロールが正確に機能しますか?

答えて

1

だから始めましょう。 linux/macを使うと仮定します。

$ cat /Users/tarun.lalwani/.virtualenvs/myproject/bin/scrapy 
#!/Users/tarun.lalwani/.virtualenvs/myproject/bin/python3.6 

# -*- coding: utf-8 -*- 
import re 
import sys 

from scrapy.cmdline import execute 

if __name__ == '__main__': 
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) 
    sys.exit(execute()) 

のは、このファイルの内容を見てみましょう私たちは

$ which scrapy 
/Users/tarun.lalwani/.virtualenvs/myproject/bin/scrapy 

をscrapyどこのは、確認してみましょうこれはcmdline.pyからexecute方法を実行し、彼女はあなたの主な方法です。あなたがこの方法を実行気づけば

cmdline.py

from __future__ import print_function 
.... 
.... 

def execute(argv=None, settings=None): 
    if argv is None: 
     argv = sys.argv 

    # --- backwards compatibility for scrapy.conf.settings singleton --- 
    if settings is None and 'scrapy.conf' in sys.modules: 
     from scrapy import conf 
     if hasattr(conf, 'settings'): 
      settings = conf.settings 
    # ------------------------------------------------------------------ 

    if settings is None: 
     settings = get_project_settings() 
     # set EDITOR from environment if available 
     try: 
      editor = os.environ['EDITOR'] 
     except KeyError: pass 
     else: 
      settings['EDITOR'] = editor 
    check_deprecated_settings(settings) 

    # --- backwards compatibility for scrapy.conf.settings singleton --- 
    import warnings 
    from scrapy.exceptions import ScrapyDeprecationWarning 
    with warnings.catch_warnings(): 
     warnings.simplefilter("ignore", ScrapyDeprecationWarning) 
     from scrapy import conf 
     conf.settings = settings 
    # ------------------------------------------------------------------ 

    inproject = inside_project() 
    cmds = _get_commands_dict(settings, inproject) 
    cmdname = _pop_command_name(argv) 
    parser = optparse.OptionParser(formatter=optparse.TitledHelpFormatter(), \ 
     conflict_handler='resolve') 
    if not cmdname: 
     _print_commands(settings, inproject) 
     sys.exit(0) 
    elif cmdname not in cmds: 
     _print_unknown_command(settings, cmdname, inproject) 
     sys.exit(2) 

    cmd = cmds[cmdname] 
    parser.usage = "scrapy %s %s" % (cmdname, cmd.syntax()) 
    parser.description = cmd.long_desc() 
    settings.setdict(cmd.default_settings, priority='command') 
    cmd.settings = settings 
    cmd.add_options(parser) 
    opts, args = parser.parse_args(args=argv[1:]) 
    _run_print_help(parser, cmd.process_options, args, opts) 

    cmd.crawler_process = CrawlerProcess(settings) 
    _run_print_help(parser, _run_command, cmd, args, opts) 
    sys.exit(cmd.exitcode) 


if __name__ == '__main__': 
    execute() 

は今、それはあなたによって渡される引数を処理します。あなたのケースではcrawl quotesです。実行メソッドは、クラスのプロジェクトをスキャンし、名前がquotesと定義されているかどうかを調べます。それはCrawlerProcessクラスを作成し、それはショー全体を実行します。

Scrapy Architecture

ScrapyはツイストPythonのフレームワークに基づいています。スケジューラベースのフレームワークです。エンジンがこの機能を実行し、最初の収率が実行されたとき

コード

for url in urls: 
      yield scrapy.Request(url=url, callback=self.parse) 

の下部分を考えます。値はエンジンに戻されます。エンジンは現在、保留中の他のタスクを実行します(それらが発生すると、他の保留中のタスクキュー関数がチャンスを得る)。したがって、yieldは、関数の実行をパーツに分割し、Scrapy/Twistedの作業を支援するものです。

あなたは下のリンクに関する詳細な概要を得ることができます

https://doc.scrapy.org/en/latest/topics/architecture.html

関連する問題