with open('/home/timmy/myamazon/bannedasins.txt') as f:
    banned_asins = f.read().split('\n')

class AmazonSpider(CrawlSpider):

    name = 'amazon'
    allowed_domains = ['amazon.com',]

    rules = (
            Rule(LinkExtractor(restrict_xpaths='//li[@class="a-last"]/a')),
            Rule(LinkExtractor(restrict_xpaths='//h2/a[@class="a-link-normal a-text-normal"]',
            process_value= lambda i:f"https://www.amazon.com/dp/{re.search('dp/(.*)/',i).groups()[0]}"),
            callback="parse_item"),
            )

我有以下两个规则来提取Amazon产品链接,这两个规则都是正确的,现在我想从searchre.search('dp/(.*)/',i).groups()[0]中删除一些ASIN这将检索ASIN并将其以https://www.amazon.com/dp/{ASIN}格式放置,我想做的是--如果banned_asins中的ASIN不提取它。
在阅读了Link Extractors Scrapy doc之后,我相信它是由deny_extensions完成的,但不知道如何使用
banned_asins= ['B07RTX74L7','B07D9JCH5X',......]

最佳答案

deny_extensions不起作用,它指的是在链接中出现的不遵循的常见文件扩展名,如果没有给定默认值,请参见here
你只需过滤掉process_value函数中的禁用asin。如果返回None,则忽略给定链接:
过程值(可调用)–
一个函数,它接收从标记中提取的每个值
已扫描属性,可以修改该值并返回新值,或者
returnNone完全忽略链接。如果没有给出,process_value
默认为lambda x: x
所以应该是:

def process_value(i):
    asin = re.search('dp/(.*)', i).groups()[0]
    return f"https://www.amazon.com/dp/{asin}" if asin not in banned_asins else None

....
    rules = (
        Rule(LinkExtractor(restrict_xpaths='//li[@class="a-last"]/a')),
        Rule(LinkExtractor(restrict_xpaths='//h2/a[@class="a-link-normal a-text-normal"]',
            process_value=process_value), callback="parse_item"),
        )

关于python - 拒绝scrapy linkextractor中的某些链接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57137698/

10-12 18:51