【问题标题】:Scrapy multiple Rules for SgmlLinkExtractor don't workSgmlLinkExtractor 的 Scrapy 多个规则不起作用
【发布时间】:2013-05-20 04:22:55
【问题描述】:

我想抓取整个网站并有条件地提取链接。

按照此链接中的建议,我尝试了多个规则,但它不起作用。 Scrapy doesn't crawl all pages

我尝试使用此代码,但它没有删除任何细节。

class BusinesslistSpider(CrawlSpider):
    name = 'businesslist'
    allowed_domains = ['www.businesslist.ae']
    start_urls = ['http://www.businesslist.ae/']

    rules = (
        Rule(SgmlLinkExtractor()),
        Rule(SgmlLinkExtractor(allow=r'company/(\d)+/'), callback='parse_item'),
    )

    def parse_item(self, response):
        self.log('Hi, this is an item page! %s' % response.url)
        hxs = HtmlXPathSelector(response)
        i = BusinesslistItem()
        company = hxs.select('//div[@class="text companyname"]/strong/text()').extract()[0]
        address = hxs.select('//div[@class="text location"]/text()').extract()[0]
        location = hxs.select('//div[@class="text location"]/a/text()').extract()[0]
        i['url'] = response.url
        i['company'] = company
        i['address'] = address
        i['location'] = location
        return i

在我的情况下,它不应用第二条规则,因此它不解析详细信息页面。

【问题讨论】:

  • 您的第一条规则为空。你怎么知道第二个有效?
  • 因为第一条规则是空的,它应该爬取整个站点并且它应该提取与第二条规则匹配的链接。根据参考文献。 stackoverflow.com/questions/15147057/…

标签: scrapy


【解决方案1】:

第一条规则Rule(SgmlLinkExtractor()) 匹配每个链接,scrapy 忽略第二条。

尝试以下方法:

...
start_urls = ['http://www.businesslist.ae/sitemap.html']
...
# Rule(SgmlLinkExtractor()),

【讨论】:

  • 我们不能使用此链接中建议的多个规则吗? stackoverflow.com/questions/15147057/… 因为我只想为特定链接调用 parse_item。
  • 还是不明白你想要什么。
  • 我想使用多个这样的规则,Rule(SgmlLinkExtractor()), Rule(SgmlLinkExtractor(allow=r'company/(\d)+/'), callback='parse_item'),因此,第一条规则抓取整个网站,第二条规则从特定 url 中抓取数据(即在 url 中包含“company/”的详细信息页面 url)。
  • 在您的情况下,规则 #1 将覆盖规则 #2,因此 #2 将不起作用。您应该将规则 #1 从“整个网站中的所有链接”更改为“所有链接但不匹配规则 #2”,这样规则 #2 就不会被忽略。
  • 我是scrapy的新手,你能告诉我我应该尝试的确切规则吗?
猜你喜欢
  • 1970-01-01
  • 2014-09-21
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多