2014-03-25 35 views
0

目前网站我在我的scrapy蜘蛛一个规则:Scrapy蜘蛛:不要爬网在列表中

rules = [Rule(SgmlLinkExtractor(allow=['/item/\d+']), 'parse_item')] 

这意味着,像www.site.com/item/所有链接123654得到提取,然后将被解析。 /item/后面的数字是唯一的ID。 spidering的结果将被存储在一个json文件中。

另外,我有一个CSV文件与已经爬,我不希望这些网站获得,以降低服务器负载再次爬到20万左右的ID。因此,可以说我创建这个CSV等构成的蟒蛇名单:

dontparse = [123111, 123222, 123333, 123444, ...] 

现在我不希望这些ID只是被忽略,如果这些链接被发现爬行过程中,我希望他们能够被存储在JSON文件,只是与信息available = true。 这是如何实现的?我应该在* parse_item *函数中添加第二条规则吗?

EDIT

我parse_item函数看起来像

def parse_item(self, response): 
    sel = Selector(response) 
    item = MyItem() 
    item['url'] = response.url 
    item['name'] = sel.xpath("//h1/text()").extract() 
    return item 
+0

我已经与scrapy没有经验,但为什么dont't你只筛选出事后使用'''dontparse'''列表中的'' 'if'''子句?或者你可以使用SgmlLinkExtractor级的参数之一,在这里看到:http://doc.scrapy.org/en/latest/topics/link-extractors.html(fe deny_domain等)(顺便说一句:你应该公开更多的代码,ESP。的'''parse_item'''功能,得到了详细的解答) – dorvak

回答

0

SgmlLinkExtractor接受process_value调用的:

,其接收从标签和 属性提取的每个值的函数扫描和可以修改值,并返回一个新的,或 返回None完全忽视的环节。如果没有给出, process_value默认为lambda x: x

所以这样的事情应该有所帮助:

def process_value(value): 
    unique_id = re.search(r"/item/(\d+)", value).group(1) 
    if unique_id in already_crawled_site_ids: 
     return None 
    return value 

rules = [Rule(SgmlLinkExtractor(allow=['/item/\d+']), 'parse_item', process_value=process_value)]