Python 痒蜘蛛:唐';t爬网列表中的站点
目前,我在我的刮痧蜘蛛中有一条规则:Python 痒蜘蛛:唐';t爬网列表中的站点,python,scrapy,Python,Scrapy,目前,我在我的刮痧蜘蛛中有一条规则: rules = [Rule(SgmlLinkExtractor(allow=['/item/\d+']), 'parse_item')] 这意味着所有像www.site.com/item/123654这样的链接都会被提取,然后被解析。/item/后面的数字是唯一的id。爬网的结果将存储在json文件中 此外,我有一个csv文件,其中包含大约200000个已经被爬网的ID,我不希望这些站点再次被爬网以减少服务器负载。假设我创建了一个csv的python列表,
rules = [Rule(SgmlLinkExtractor(allow=['/item/\d+']), 'parse_item')]
这意味着所有像www.site.com/item/123654这样的链接都会被提取,然后被解析。/item/后面的数字是唯一的id。爬网的结果将存储在json文件中
此外,我有一个csv文件,其中包含大约200000个已经被爬网的ID,我不希望这些站点再次被爬网以减少服务器负载。假设我创建了一个csv的python列表,如下所示:
dontparse = [123111, 123222, 123333, 123444, ...]
现在,我不希望在爬行过程中发现这些链接时忽略这些ID,我希望它们存储在json文件中,只需要info 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
接受process\u值
可调用:
一种函数,用于接收从标记中提取的每个值,并
已扫描属性,可以修改该值并返回新值,或
返回None
以完全忽略链接。如果不给,,
process\u值
默认为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)]
我没有使用scrapy的经验,但是为什么不在以后使用
if
-子句过滤掉dontparse
列表呢?或者可以使用SgmlLinkExtractor类的参数之一,请参见此处:。deny_domain等)(顺便说一句:您应该公开更多代码,尤其是parse_项
-函数,以获得详细答案)