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产品链接,这两个规则都是正确的,现在我想从search
re.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/