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创建单独的爬行器