我在抓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"
),
)
答案 0 :(得分:1)
如果多个规则与同一个链接匹配,则将根据它们在此属性中定义的顺序使用第一个规则。
因此,您需要反转Rule
的顺序。目前.*
会匹配所有内容,然后才会检查productdetail\.aspx
。
这应该有效:
rules = (
Rule (
SgmlLinkExtractor(allow=r"productdetail\.aspx"),
callback="parse_item"
),
Rule (
SgmlLinkExtractor(allow=r".*")
),
)
但是,如果您想关注 productdetail 页面上的链接,则必须确保parse_item
中的链接将被跟踪。第二条规则不会在 productdetail 页面上调用。