Scrapy 如何在任何深度的任何地方提取链接?
我正在抓取dell.com网站,我的目标是像这样的页面。我如何设置链接提取规则,以便他们在任何深度的任何地方都能找到这些页面?我知道,默认情况下,深度没有限制。如果我这样做:Scrapy 如何在任何深度的任何地方提取链接?,scrapy,Scrapy,我正在抓取dell.com网站,我的目标是像这样的页面。我如何设置链接提取规则,以便他们在任何深度的任何地方都能找到这些页面?我知道,默认情况下,深度没有限制。如果我这样做: rules = ( Rule ( SgmlLinkExtractor(allow=r"productdetail\.aspx"), callback="parse_item" ), ) rules = ( Rule ( SgmlLinkExtract
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被找到,哪些被忽略。是的,我做了,没有帮助。正如我前面所说,蜘蛛的行为很奇怪。