2017-02-27 32 views
0

我正在使用Scrapy 1.1,并且我有一个项目,其中有蜘蛛'1'刮网站A(我获得了90%的信息来填充我的项目)。然而,根据Site A Scrape的结果,我可能需要从B站点获取更多信息。就开发该程序而言,在蜘蛛'1'内部的B站点进行刮擦还是可以进行交互的更有意义站点B在管道对象内。我更喜欢后者,认为它会去除2个站点的垃圾信息,但我不确定这是否可行或处理此用例的最佳方式。另一种方法可能是为站点B使用第二个蜘蛛(蜘蛛'2'),但后来我认为我必须让蜘蛛'1'运行,保存到db然后运行蜘蛛'2'。无论如何,任何意见将不胜感激。Scrapy:与辅助网站互动时的程序组织

回答

0

这两种方法都很常见,这只是一个偏好问题。对于包含一个蜘蛛中所有内容的情况,听起来像是一个简单的解决方案。

可以URL字段添加到您的项目和计划,并在管道后对其进行分析:

class MyPipeline(object): 
    def __init__(self, crawler): 
     self.crawler = crawler 

    @classmethod 
    def from_crawler(cls, crawler): 
     return cls(crawler) 

    def process_item(self, item, spider): 
     extra_url = item.get('extra_url', None) 
     if not extra_url: 
      return item 
     req = Request(url=extra_url 
         callback=self.custom_callback, 
         meta={'item': item},) 
     self.crawler.engine.crawl(req, spider) 
     # you have to drop the item here since you will return it later anyway 
     raise DropItem() 

    def custom_callback(self, response): 
     # retrieve your item 
     item = response.mete['item'] 
     # do something to add to item 
     item['some_extra_stuff'] = ... 
     del item['extra_url'] 
     yield item 

什么上面的代码的作用是检查项目是否有一定的URL字段中,如果这样做,下降的项目并安排新的请求。该请求用一些额外数据填充该项目并将其发送回管道。

+0

谢谢你的例子。我以前从未见过这种方法。 – user61629

+0

我有一个后续问题。 http://stackoverflow.com/questions/42515747/initializing-pipeline-object-with-crawler-in-scrapy – user61629

+0

我会在这里给你一个赏金给你的帮助。再次感谢。 – user61629