如何在程序中将参数传递给抓痒的蜘蛛?

编码兔子

我是python和scrapy的新手。我在此博客中使用了该方法,以编程方式运行多个scrapy蜘蛛以在flask应用程序中运行我的蜘蛛,以下是代码:

# 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()

这是我的蜘蛛代码:

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!"

如您所见,term = 'man'我的代码中有一个参数,它是my的一部分start urls我不想固定该参数,所以我想知道如何在程序中动态赋予start url或参数term就像在命令行中运行Spider一样,有一种方法可以传递参数,如下所示:

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"

有人可以告诉我如何处理吗?

保罗·特姆布雷斯

首先,要在一个脚本中运行多个蜘蛛,建议的方法是使用scrapy.crawler.CrawlerProcess在其中传递蜘蛛类而不是蜘蛛实例。

要将参数传递给您的Spider CrawlerProcess,您只需要将参数添加到.crawl()调用中的Spider子类之后,例如

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

然后,以这种方式传递的参数可作为蜘蛛属性使用(与-a term=someterm命令行上的相同

最后,您可以使用构建与相同的初始请求,而不是构建start_urls在中__init__start_requests而可以使用self.term以下方法构建初始请求

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Xamarin IOS中将参数传递给事件处理程序

来自分类Dev

如何在Flask应用程序中将配置参数传递给Celery任务?

来自分类Dev

如何在MVC中将参数传递给GenericController构造函数?

来自分类Dev

如何在C#中将参数传递给线程?

来自分类Dev

如何在墨西哥舒适沙发中将参数传递给局部?

来自分类Dev

如何在Golang中将变量参数传递给Sprintf

来自分类常见问题

如何在Django中将参数传递给表单?

来自分类Dev

如何在angularjs中将参数传递给$ http?

来自分类Dev

如何在Java中将函数作为参数传递给Callable

来自分类Dev

如何在Perl中将参数传递给系统命令

来自分类Dev

如何在Request中将参数传递给重定向路由

来自分类Dev

如何在Django中将可选参数传递给url

来自分类Dev

如何在Javascript OO中将参数传递给子方法

来自分类Dev

如何在Powershell中将参数传递给批处理

来自分类Dev

如何在Laravel中将路由参数传递给webcontroller?

来自分类Dev

如何在命令中将参数传递给linux

来自分类Dev

如何在PHP中将多个参数传递给URL

来自分类Dev

如何在SQL Server中将参数传递给IN

来自分类Dev

如何在LightInject中将参数传递给命名服务?

来自分类Dev

如何在PHP中将参数传递给匿名函数?

来自分类Dev

如何在Codeigniter中将多个参数传递给函数或查询

来自分类Dev

如何在Spark SQL中将额外的参数传递给UDF?

来自分类Dev

如何在AngularJS中将参数传递给DELETE?

来自分类Dev

如何在flutter中将参数传递给回调?

来自分类Dev

如何在Flutter中将参数传递给侦听器?

来自分类Dev

如何在Haskell中将参数传递给as模式

来自分类Dev

如何在Django中将参数传递给基于类的视图?

来自分类Dev

如何在Angular中将多个参数传递给根路径

来自分类Dev

如何在pandas中将列名传递给参数

Related 相关文章

  1. 1

    如何在Xamarin IOS中将参数传递给事件处理程序

  2. 2

    如何在Flask应用程序中将配置参数传递给Celery任务?

  3. 3

    如何在MVC中将参数传递给GenericController构造函数?

  4. 4

    如何在C#中将参数传递给线程?

  5. 5

    如何在墨西哥舒适沙发中将参数传递给局部?

  6. 6

    如何在Golang中将变量参数传递给Sprintf

  7. 7

    如何在Django中将参数传递给表单?

  8. 8

    如何在angularjs中将参数传递给$ http?

  9. 9

    如何在Java中将函数作为参数传递给Callable

  10. 10

    如何在Perl中将参数传递给系统命令

  11. 11

    如何在Request中将参数传递给重定向路由

  12. 12

    如何在Django中将可选参数传递给url

  13. 13

    如何在Javascript OO中将参数传递给子方法

  14. 14

    如何在Powershell中将参数传递给批处理

  15. 15

    如何在Laravel中将路由参数传递给webcontroller?

  16. 16

    如何在命令中将参数传递给linux

  17. 17

    如何在PHP中将多个参数传递给URL

  18. 18

    如何在SQL Server中将参数传递给IN

  19. 19

    如何在LightInject中将参数传递给命名服务?

  20. 20

    如何在PHP中将参数传递给匿名函数?

  21. 21

    如何在Codeigniter中将多个参数传递给函数或查询

  22. 22

    如何在Spark SQL中将额外的参数传递给UDF?

  23. 23

    如何在AngularJS中将参数传递给DELETE?

  24. 24

    如何在flutter中将参数传递给回调?

  25. 25

    如何在Flutter中将参数传递给侦听器?

  26. 26

    如何在Haskell中将参数传递给as模式

  27. 27

    如何在Django中将参数传递给基于类的视图?

  28. 28

    如何在Angular中将多个参数传递给根路径

  29. 29

    如何在pandas中将列名传递给参数

热门标签

归档