Scrapy 如何在任何深度的任何地方提取链接?

Scrapy 如何在任何深度的任何地方提取链接?,scrapy,Scrapy,我正在抓取dell.com网站,我的目标是像这样的页面。我如何设置链接提取规则,以便他们在任何深度的任何地方都能找到这些页面?我知道,默认情况下,深度没有限制。如果我这样做: rules = ( Rule ( SgmlLinkExtractor(allow=r"productdetail\.aspx"), callback="parse_item" ), ) rules = ( Rule ( SgmlLinkExtract

我正在抓取dell.com网站,我的目标是像这样的页面。我如何设置链接提取规则,以便他们在任何深度的任何地方都能找到这些页面?我知道,默认情况下,深度没有限制。如果我这样做:

rules = (
    Rule (
        SgmlLinkExtractor(allow=r"productdetail\.aspx"),
        callback="parse_item"
    ),
)
rules = (
    Rule (
        SgmlLinkExtractor(allow=r".*")
    ),
    Rule (
        SgmlLinkExtractor(allow=r"productdetail\.aspx"),
        callback="parse_item"
    ),
)
它不工作:它只抓取起始页。如果我这样做:

rules = (
    Rule (
        SgmlLinkExtractor(allow=r"productdetail\.aspx"),
        callback="parse_item"
    ),
)
rules = (
    Rule (
        SgmlLinkExtractor(allow=r".*")
    ),
    Rule (
        SgmlLinkExtractor(allow=r"productdetail\.aspx"),
        callback="parse_item"
    ),
)
它会抓取产品页面,但不会刮取它们(我的意思是不会对它们调用parse_item()。我在第一条规则中尝试了include follow=True,但是如果没有回调,默认情况下应该为True

编辑:

这是除解析函数外的其余代码:

import re
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.http import Request

class DellSpider(CrawlSpider):
    name = 'dell.com'
    start_urls = ['http://www.dell.com/sitemap']
    rules = (
        Rule (
            SgmlLinkExtractor(allow=r".*")
        ),
        Rule (
            SgmlLinkExtractor(allow=r"productdetail\.aspx"),
            callback="parse_item"
        ),
    )
从:

如果多个规则匹配同一链接,将根据在此属性中定义的顺序使用第一个规则

因此,您需要颠倒
规则的顺序。当前,
*
将匹配所有内容,然后再检查
productdetail\.aspx

这应该起作用:

rules = (
    Rule (
        SgmlLinkExtractor(allow=r"productdetail\.aspx"),
        callback="parse_item"
    ),
    Rule (
        SgmlLinkExtractor(allow=r".*")
    ),
)

但是,如果您想查看productdetail页面上的链接,则必须确保在
parse_item
中遵循链接。第二条规则将不会在productdetail页面上调用。

您可以发布spider初始化的其余部分吗?除了解析和其他函数之外,其他都有。是的,我也试过了。但在这种情况下,它只抓取很少的产品页面(大约10个),然后继续抓取其他页面(我检查了这些页面,这些其他页面包含指向产品页面的链接,但它们被忽略)。我不明白这里发生了什么。也许这有助于添加调试
打印
,如“爬行URL X”、“在URL X上找到URL Y”等,并让爬虫程序在
设置.py中运行
下载延迟=2
左右。然后你会看到哪些URL被找到,哪些被忽略。是的,我做了,没有帮助。正如我前面所说,蜘蛛的行为很奇怪。