目前我的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
答案 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)]