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

时间:2014-08-08 11:30:32

标签: scrapy

我在抓dell.com网站,我的目标是像http://accessories.us.dell.com/sna/productdetail.aspx?c=us&cs=19&l=en&s=dhs&sku=A7098144这样的页面。如何设置链接提取规则,以便在任何深度的任何位置找到这些页面?据我所知,默认情况下,深度没有限制。如果我这样做:

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())。我尝试在第一条规则中包含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"
        ),
    )

1 个答案:

答案 0 :(得分:1)

来自CrawlSpider documentation

  

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

因此,您需要反转Rule的顺序。目前.*会匹配所有内容,然后才会检查productdetail\.aspx

这应该有效:

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

但是,如果您想关注 productdetail 页面上的链接,则必须确保parse_item中的链接将被跟踪。第二条规则不会在 productdetail 页面上调用。