【问题标题】:argument in spiders __init__ with spider crawler蜘蛛 __init__ 中的参数与蜘蛛爬虫
【发布时间】:2017-09-11 19:05:04
【问题描述】:

我正在尝试使用蜘蛛爬虫代码来获取一些房地产数据。但它一直给我这个错误:

Traceback(最近一次调用最后一次):

文件“//anaconda/lib/python2.7/site-packages/twisted/internet/defer.py”,第 1301 行,在 _inlineCallbacks 结果 = g.send(结果)

文件“//anaconda/lib/python2.7/site-packages/scrapy/crawler.py”,第 90 行,正在爬行 六.reraise(*exc_info)

文件“//anaconda/lib/python2.7/site-packages/scrapy/crawler.py”,第 71 行,正在爬行 self.spider = self._create_spider(*args, **kwargs)

文件“//anaconda/lib/python2.7/site-packages/scrapy/crawler.py”,第 94 行,在 _create_spider return self.spidercls.from_crawler(self, *args, **kwargs)

文件“//anaconda/lib/python2.7/site-packages/scrapy/spiders/crawl.py”,第 96 行,在 from_crawler spider = super(CrawlSpider, cls).from_crawler(crawler, *args, **kwargs)

文件“//anaconda/lib/python2.7/site-packages/scrapy/spiders/init.py”,第 50 行,在 from_crawler 蜘蛛 = cls(*args, **kwargs)

TypeError: init() 只需要 3 个参数(给定 1 个)

下面是定义爬虫的代码:

class RealestateSpider(scrapy.spiders.CrawlSpider):

    ###Real estate web crawler
    name = 'buyrentsold'
    allowed_domains = ['realestate.com.au']

    def __init__(self, command, search):
        search = re.sub(r'\s+', '+', re.sub(',+', '%2c', search)).lower()
        url = '/{0}/in-{{0}}{{{{0}}}}/list-{{{{1}}}}'.format(command)
        start_url = 'http://www.{0}{1}'
        start_url = start_url.format(
                self.allowed_domains[0], url.format(search)
        )
        self.start_urls = [start_url.format('', 1)]
        extractor = scrapy.linkextractors.sgml.SgmlLinkExtractor(
                allow=url.format(re.escape(search)).format('.*', '')
        )
        rule = scrapy.spiders.Rule(
                extractor, callback='parse_items', follow=True
        )
        self.rules = [rule]
        super(RealestateSpider, self).__init__()

    def parse_items(self, response):
        ###Parse a page of real estate listings
        hxs = scrapy.selector.HtmlXPathSelector(response)
        for i in hxs.select('//div[contains(@class, "listingInfo")]'):
            item = RealestateItem()
            path = 'div[contains(@class, "propertyStats")]//text()'
            item['price'] = i.select(path).extract()
            vcard = i.select('div[contains(@class, "vcard")]//a')
            item['address'] = vcard.select('text()').extract()
            url = vcard.select('@href').extract()
            if len(url) == 1:
                item['url'] = 'http://www.{0}{1}'.format(
                        self.allowed_domains[0], url[0]
                )
            features = i.select('dl')
            for field in ('bed', 'bath', 'car'):
                path = '(@class, "rui-icon-{0}")'.format(field)
                path = 'dt[contains{0}]'.format(path)
                path = '{0}/following-sibling::dd[1]'.format(path)
                path = '{0}/text()'.format(path)
                item[field] = features.select(path).extract() or 0
            yield item

这是错误出现的时间:

crawler = scrapy.crawler.CrawlerProcess(scrapy.conf.settings)
sp=RealestateSpider(command, search)
crawler.crawl(sp)
crawler.start()

谁能帮我解决这个问题?谢谢!

【问题讨论】:

    标签: python-2.7 scrapy web-crawler scrapy-spider scrapyd


    【解决方案1】:

    crawler.crawl() 方法需要蜘蛛 class 作为参数,在你的代码中提供了蜘蛛对象。

    有几种方法可以做到这一点,但最直接的方法是简单地扩展蜘蛛类:

    class MySpider(Spider):
        command = None
        search = None
    
        def __init__(self):
            # do something with self.command and self.search
            super(RealestateSpider, self).__init__()
    

    然后:

    crawler = scrapy.crawler.CrawlerProcess(scrapy.conf.settings)
    class MySpider(RealestateSpider):
        command = 'foo'
        search = 'bar'
    crawler.crawl(MySpider)
    crawler.start()
    

    【讨论】:

      【解决方案2】:

      我遇到了这个确切的问题,上面的解决方案对我来说太难了。
      但是我通过将参数作为类属性传递来回避这个问题:

      process = CrawlerProcess()
      sp = MySpider
      sp.storage = reference_to_datastorage
      process.crawl(sp)
      process.start()
      

      希望这将是您的问题的潜在解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-03
        • 1970-01-01
        • 1970-01-01
        • 2013-11-30
        • 2012-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多