【问题标题】:Scrapy ignore noindexScrapy忽略noindex
【发布时间】:2014-02-15 21:15:03
【问题描述】:

我正在抓取大量 URL,并且想知道是否可以让 scrapy 不解析带有 'meta name="robots" content="noindex"' 的页面? 查看此处列出的拒绝规则http://doc.scrapy.org/en/latest/topics/link-extractors.html 看起来拒绝规则仅适用于 URL。你能让 scrapy 忽略 xpath 吗?

from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor

from wallspider.items import Website


class Spider(CrawlSpider):
    name = "browsetest"
    allowed_domains = ["www.mydomain.com"]
    start_urls = ["http://www.mydomain.com",]

    rules = (
        Rule(SgmlLinkExtractor(allow=('/browse/')), callback="parse_items", follow= True),
        Rule(SgmlLinkExtractor(allow=(),unique=True,deny=('/[1-9]$', '(bti=)[1-9]+(?:\.[1-9]*)?', '(sort_by=)[a-zA-Z]', '(sort_by=)[1-9]+(?:\.[1-9]*)?', '(ic=32_)[1-9]+(?:\.[1-9]*)?', '(ic=60_)[0-9]+(?:\.[0-9]*)?', '(search_sort=)[1-9]+(?:\.[1-9]*)?', 'browse-ng.do\?', '/page/', '/ip/', 'out\+value', 'fn=', 'customer_rating', 'special_offers', 'search_sort=&', 'facet=' ))),
    )

    def parse_items(self, response):
        hxs = HtmlXPathSelector(response)
        sites = hxs.select('//html')
        items = []

        for site in sites:
            item = Website()
            item['url'] = response.url
            item['canonical'] = site.xpath('//head/link[@rel="canonical"]/@href').extract()
            item['robots'] = site.select('//meta[@name="robots"]/@content').extract()
            items.append(item)

        return items

【问题讨论】:

  • 您想跳过检索这些页面吗?如果是这样,那将是不可能的,因为要查找元机器人,您必须检索页面。
  • 抱歉,我已经改写了我的问题。是否可以让它不解析包含 'meta name="robots" content="noindex"' 的 URL?
  • 你不想跟随没有索引的页面的链接吗?在这种情况下,您可以在 noindex 存在时跳过响应。你能分享你的蜘蛛的简化版本吗?你在使用CrawlSpider 类吗?
  • 感谢@Rho 出于某种原因,它没有正确格式化我的“代码”。作为一种解决方法,我决定识别其中没有索引的页面

标签: python web-crawler scrapy


【解决方案1】:

很遗憾,CrawlSpider 没有提供您想要执行的操作的选项。不过,您可以重写它的方法来实现这一点。

尝试将此方法添加到您的蜘蛛:

    def _response_downloaded(self, response):
        # Check whether this page contains the meta noindex in order to skip the processing.
        sel = Selector(response)
        if sel.xpath('//meta[@content="noindex"]'):
            return

        return super(Spider, self)._response_downloaded(response)

当文档不够用时,您可以查看源代码以查看可以更改的内容和位置,请注意您使用的版本。可以在github上浏览最新的源码:https://github.com/scrapy/scrapy/blob/master/scrapy/contrib/spiders/crawl.py#L61

但最好检查系统中的源代码。如果您使用的是 IPython,可以通过 ?? 运算符轻松完成。

【讨论】:

  • 关于源代码的重要提示 - 我是 python 和编程新手,您的帮助对我帮助很大。
  • 对于另一个爬虫,如果元内容包含 noindex,我将如何进行解析? return super(Spider, self).parse_items(response)?
  • @Murdrae 是的,将 return super(... 移动到 if 块内。
猜你喜欢
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2017-06-17
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
相关资源
最近更新 更多