2016-04-18 11 views
1

私はpythonとscrapyの初心者です。あなたが見ることができるように存在し、プログラムのスパイダースパイダーにパラメータを渡すには?

class EPGDspider(scrapy.Spider): 
name = "EPGD" 
allowed_domains = ["epgd.biosino.org"] 
term = "man" 
start_urls = ["http://epgd.biosino.org/EPGD/search/textsearch.jsp?textquery="+term+"&submit=Feeling+Lucky"] 
MONGODB_DB = name + "_" + term 
MONGODB_COLLECTION = name + "_" + term 

def parse(self, response): 
    sel = Selector(response) 
    sites = sel.xpath('//tr[@class="odd"]|//tr[@class="even"]') 
    url_list = [] 
    base_url = "http://epgd.biosino.org/EPGD" 

    for site in sites: 
     item = EPGD() 
     item['genID'] = map(unicode.strip, site.xpath('td[1]/a/text()').extract()) 
     item['genID_url'] = base_url+map(unicode.strip, site.xpath('td[1]/a/@href').extract())[0][2:] 
     item['taxID'] = map(unicode.strip, site.xpath('td[2]/a/text()').extract()) 
     item['taxID_url'] = map(unicode.strip, site.xpath('td[2]/a/@href').extract()) 
     item['familyID'] = map(unicode.strip, site.xpath('td[3]/a/text()').extract()) 
     item['familyID_url'] = base_url+map(unicode.strip, site.xpath('td[3]/a/@href').extract())[0][2:] 
     item['chromosome'] = map(unicode.strip, site.xpath('td[4]/text()').extract()) 
     item['symbol'] = map(unicode.strip, site.xpath('td[5]/text()').extract()) 
     item['description'] = map(unicode.strip, site.xpath('td[6]/text()').extract()) 
     yield item 

    sel_tmp = Selector(response) 
    link = sel_tmp.xpath('//span[@id="quickPage"]') 

    for site in link: 
     url_list.append(site.xpath('a/@href').extract()) 

    for i in range(len(url_list[0])): 
     if cmp(url_list[0][i], "#") == 0: 
      if i+1 < len(url_list[0]): 
       print url_list[0][i+1] 
       actual_url = "http://epgd.biosino.org/EPGD/search/"+ url_list[0][i+1] 
       yield Request(actual_url, callback=self.parse) 
       break 
      else: 
       print "The index is out of range!" 

:ここ

# list of crawlers 
TO_CRAWL = [DmozSpider, EPGDspider, GDSpider] 

# crawlers that are running 
RUNNING_CRAWLERS = [] 

def spider_closing(spider): 
    """ 
    Activates on spider closed signal 
    """ 
    log.msg("Spider closed: %s" % spider, level=log.INFO) 
    RUNNING_CRAWLERS.remove(spider) 
    if not RUNNING_CRAWLERS: 
     reactor.stop() 

# start logger 
log.start(loglevel=log.DEBUG) 

# set up the crawler and start to crawl one spider at a time 
for spider in TO_CRAWL: 
    settings = Settings() 

    # crawl responsibly 
    settings.set("USER_AGENT", "Kiran Koduru (+http://kirankoduru.github.io)") 
    crawler = Crawler(settings) 
    crawler_obj = spider() 
    RUNNING_CRAWLERS.append(crawler_obj) 

    # stop reactor when spider closes 
    crawler.signals.connect(spider_closing, signal=signals.spider_closed) 
    crawler.configure() 
    crawler.crawl(crawler_obj) 
    crawler.start() 

# blocks process; so always keep as the last statement 
reactor.run() 

は私のスパイダーコードです:私はapp.Hereがコードであるフラスコ中に私のクモを実行するには、このブログRunning multiple scrapy spiders programmatically方法を使用しましたパラメータterm = 'man'は私のコードであり、それは私のstart urlsの一部です。私はこのパラメータを固定したくないので、どうすればstart urlやパラメータtermを私のプログラムに動的に与えることができますか?

class MySpider(BaseSpider): 

    name = 'my_spider'  

    def __init__(self, *args, **kwargs): 
     super(MySpider, self).__init__(*args, **kwargs) 

     self.start_urls = [kwargs.get('start_url')] 
And start it like: scrapy crawl my_spider -a start_url="http://some_url" 

を誰がどのようにこの問題に対処する方法を教えてもらえます:ちょうど、コマンドラインでクモを実行しているような方法は、以下のようにパラメータを渡すことができますがありますか?

+0

はい 'scrapyクロールがmy_spider -a START_URL = "http://google.com"'罰金 –

+0

を動作しますが、私はコマンドラインで私のスパイダーに電話したくないので、自分のプログラムでスパイダーに電話したい。 –

答えて

8

まず、スクリプト内で複数のスパイダーを実行するには、scrapy.crawler.CrawlerProcess,を使用し、スパイダー・インスタンスを使用しないことをお勧めします。

CrawlerProcessを使用してスパイダーに引数を渡すには、 のように、.crawl()呼び出しに、スパイダーサブクラスの後に引数を追加するだけです。

process.crawl(DmozSpider, term='someterm', someotherterm='anotherterm') 

引数は最後に、代わりに__init__start_urlsを構築する、あなたはstart_requestsと同じことを達成することができます(コマンドライン上-a term=sometermと同じ)クモの属性として利用可能です

このように合格し、そしてあなたself.termを使用して、このような初期の要求を構築することができます。

def start_requests(self): 
    yield Request("http://epgd.biosino.org/" 
        "EPGD/search/textsearch.jsp?" 
        "textquery={}" 
        "&submit=Feeling+Lucky".format(self.term)) 
+0

まず、詳細な回答をいただきありがとうございます!私は 'CrawlerProcess'を試してみましたが、Flask Appでこれを使うことができないという問題があります。私は、シグナルがメインスレッドでしか動かないというバグがあり、この質問をしています[link] (http://stackoverflow.com/questions/36384286/cant-call-scrapy-spiders-in-flask-web-framework),しかし、効果的な解決策はありません。あなたには他の方法がありますか? –

+0

'scrapy.crawler.Crawler'を使うには、' '(spidercls、settings)'でインスタンス化する必要があります(http://doc.scrapy.org/en/latest/topics/api.html# scrapy.crawler.Crawler)、設定だけでなく。例えば'crawler = Crawler(DmozSpider、settings) 'そして' crawler.crawl(term = "someterm") ' –

+0

問題は私がFlask Appでこれらのスパイダーを実行しているので、代わりに' scrapy.crawler.Crawler'を試してみてください。 'CrawlerProcess'の? –

関連する問題