Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scrapy 根据传入的参数委托给'SitemapSpider'或'CrawlSpider'的基'Spider'类?_Scrapy - Fatal编程技术网

Scrapy 根据传入的参数委托给'SitemapSpider'或'CrawlSpider'的基'Spider'类?

Scrapy 根据传入的参数委托给'SitemapSpider'或'CrawlSpider'的基'Spider'类?,scrapy,Scrapy,我以前提到过重用我编写的parse方法,以便根据是否在start\u url参数中传递,使我的爬行器的行为有所不同。如果是,它应该只抓取那些给定的URL(不跟随),但是如果不是,它应该抓取整个站点(跟随链接) 我得到的答案非常有用,效果也很好,并产生了如下CrawlSpider定义: from scrapy.contrib.spiders import CrawlSpider, Rule from scrapy.contrib.linkextractors import LinkExtracto

我以前提到过重用我编写的
parse
方法,以便根据是否在
start\u url
参数中传递,使我的爬行器的行为有所不同。如果是,它应该只抓取那些给定的URL(不跟随),但是如果不是,它应该抓取整个站点(跟随链接)

我得到的答案非常有用,效果也很好,并产生了如下
CrawlSpider
定义:

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor
from scrapy.selector import Selector

from foo.items import FooItem
from scrapy.contrib.loader import ItemLoader

import json
import datetime
import re

class FooSpider(CrawlSpider):
    name = "foo"
    allowed_domains = ["example.com"]

    def __init__(self, start_urls=None, *args, **kwargs):
        if start_urls:
            self.start_urls = json.loads(start_urls)
            self.rules = []
            self.parse = self.parse_response
        else:
            self.start_urls = ["http://example.com/"]
            self.rules = [
                Rule(LinkExtractor(allow=[], deny=['/blog']), follow=True, callback='parse_response'),
            ]

        super(FooSpider, self).__init__(*args, **kwargs)

    def parse_response(self, response):
      sel = Selector(response)
      if not(sel.css('div.product-view')):
          return None
      l = ItemLoader(item=FooItem(), response=response)
      product = l.load_item()
      return product
然而,我现在刚刚发现它有一个我可以使用的站点地图,而不必对整个站点进行爬网。因此,我更新了我的spider,如下所示:

class FooSpider(SitemapSpider):
    name = "foo"
    sitemap_urls = ['http://example.com/sitemap.xml']
    sitemap_rules = [('/', 'parse_response')]
但是在这一点上,我意识到
SitemapSpider
的行为与
CrawlSpider
不同,并且不会以与我之前定义相同的方式接受
start\u URL
。那么,有没有一种方法可以保留名为
“foo”
的单个爬行器以前的行为,该爬行器根据
start\u url
参数委托行为

我对Python不太了解,开始想我可以有一个
foosider
基类,根据参数动态返回一个子类,但现在我想这可能是无效的。我开始思考的草图代码(未加工):

class FooSpider(Spider):
    name = "foo"

    def __init__(self, start_urls=None, *args, **kwargs):
        if start_urls:
            self.start_urls = json.loads(start_urls)
            FooCrawlSpider.__init__(self, *args, **kwargs)
        else:
            FooSitemapSpider.__init__(self, *args, **kwargs)

    def parse_response(self, response):
      sel = Selector(response)
      if not(sel.css('div.product-view')):
          return None
      l = ItemLoader(item=FooItem(), response=response)
      product = l.load_item()
      return product

class FooCrawlSpider(CrawlSpider, FooSpider):
    allowed_domains = ["example.com"]
    rules = []
    parse = self.parse_response

class FooSitemapSpider(SitemapSpider, FooSpider):
    sitemap_urls = ['http://example.com/sitemap.xml']
    sitemap_rules = [('/', 'parse_response')]
我对Python知识的缺乏使我在这里感到困惑。任何想法都将不胜感激!最糟糕的情况是,我总是可以用不同的
name
s创建单独的爬行器