Scrapy Spider:不要抓取列表中的网站

时间:2014-03-25 13:52:00

标签: python scrapy

目前我的scrapy蜘蛛中有一条规则:

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

这意味着 www.site.com/item/123654 等所有链接都会被解压缩,然后会被解析。 / item / 背后的数字是唯一ID。蜘蛛的结果将存储在json文件中。

此外,我有一个已经被抓取的大约200,000个ID的csv文件,我不希望再次抓取这些网站以减少服务器负载。所以我想创建一个这个csv的python列表,如:

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

现在我不希望在抓取过程中发现这些链接时忽略这些ID,我希望它们存储在json文件中,只需要信息 available = true 。 怎么能实现这一目标?我应该在* parse_item *函数中添加第二条规则吗?

修改

我的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

1 个答案:

答案 0 :(得分:0)

SgmlLinkExtractor接受process_value callable:

  

接收从标签中提取的每个值的函数   扫描的属性,可以修改值并返回一个新的,或   返回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)]