Python - Scrapy SgmlLinkExtractor 的 Deny 值被忽略

0 投票
1 回答
761 浏览
提问于 2025-04-17 09:14

我正在使用Scrapy来抓取http://www.investopedia.com这个网站。

在我的"Spider.py"文件中,我有一个抓取过滤器的定义:

rules = (
    # Crawl filters
    Rule(SgmlLinkExtractor(deny=settings['DENY_FILTER']), callback='parse_item', follow=True, process_links='process_links'),
)

settings['DENY_FILTER']这个设置是从"settings.py"文件中提取的,不管我怎么格式化,它都无法过滤(或者说“拒绝”)我想要的内容。拒绝的值如下:

DENY_FILTER     =   (re.compile('((?!(\?|&)page=(\d)+)\?.*)', re.I), re.compile('/markets/stocks/', re.I), re.compile('/errorpage/', re.I))

我还尝试过使用未编译的正则表达式,但也没有成功:

DENY_FILTER     =   ('((?!(\?|&)(p|P)age=(\d)+)\?.*)', '/markets/stocks/', '/(e|E)rror(p|P)age/')

我在网上搜索了好几天,也没有找到答案,所以现在我来向你们求助,StackOverflow的朋友们。有什么想法吗?

1 个回答

0

试着直接传递 deny 参数

Rule(SgmlLinkExtractor(deny=('regexp1', 'regexp2',),...

如果你的拒绝规则能正常工作,我觉得你应该像这样访问 settings.py 中定义的 DENY_FILTER

DENY_FILTER =  ('regexp1', 'regexp2',)

可以这样写:

Rule(SgmlLinkExtractor(deny=settings.DENY_FILTER), ...

另外,请把 process_links 函数的代码也展示一下?

撰写回答