【问题标题】:How to keep Scrapy from crawling "denied" pages如何防止 Scrapy 抓取“拒绝”页面
【发布时间】:2014-01-30 04:20:43
【问题描述】:

我正在尝试抓取域的所有页面除了那些以 /go.php 开头的页面,但我不知道如何让 Scrapy 理解这一点。我已经尝试过这条规则(这是我的 CrawlSpider 中定义的唯一规则),但它仍然会抓取诸如 domain.tld/go.php?key=value 之类的 URL:

rules = [
    Rule(SgmlLinkExtractor(allow=(
        '.*'
    ), deny=(
        '\\/go\\.php(.*)',
        'go.php',
        'go\.php',
        'go\\.php',
        'go.php(.*)',
        'go\.php(.*)',
        'go\\.php(.*)'
    )))
]

该规则似乎已被应用,因为在使用明显无效的正则表达式(例如带有不平衡括号的表达式)启动蜘蛛时出现异常。


更新

恐怕我在别处找到了解决问题的方法。重读文档后,我注意到这个警告:“在编写爬虫规则时,避免使用 parse 作为回调,因为 CrawlSpider 使用 parse 方法本身来实现其逻辑。所以如果你重写 parse 方法,爬虫将不再工作。” - 不幸的是,这正是我所做的。将 parse 方法重命名为其他名称使 Scrapy 遵守规则。对此感到抱歉,感谢您的所有回答,它们为我指明了正确的方向。

也许这对其他人有帮助:正确的正则表达式原来是 go\.php,前面没有斜线。

【问题讨论】:

    标签: python regex scrapy


    【解决方案1】:

    您确定实际的href 值是那个值吗?看起来可能是 javascript 生成的。

    您可以运行scrapy shell "http://website/page?foo&bar" 来检查页面并使用允许/拒绝参数。您还可以针对任意 html 测试链接提取器,看看它是如何工作的。

    In [1]: html = """
      ...: <a href="http://domain.tld/go.php?key=value">go</a>
      ...: <a href="/go.php?key=value2">go2</a>
      ...: <a href="/index.html">index</a>
      ...: """
    
    In [2]: from scrapy.http import HtmlResponse
    
    In [3]: response = HtmlResponse('http://example.com/', body=html)
    
    In [4]: from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
    
    In [5]: lx = SgmlLinkExtractor()
    
    In [6]: lx.extract_links(response)
    Out[6]: 
    [Link(url='http://domain.tld/go.php?key=value', text=u'go', fragment='', nofollow=False),
    Link(url='http://example.com/go.php?key=value2', text=u'go2', fragment='', nofollow=False),
    Link(url='http://example.com/index.html', text=u'index', fragment='', nofollow=False)]
    
    In [8]: SgmlLinkExtractor(allow='go\.php').extract_links(response)
    Out[8]: 
    [Link(url='http://domain.tld/go.php?key=value', text=u'go', fragment='', nofollow=False),
    Link(url='http://example.com/go.php?key=value2', text=u'go2', fragment='', nofollow=False)]
    
    In [9]: SgmlLinkExtractor(deny='go\.php').extract_links(response)
    Out[9]: [Link(url='http://example.com/index.html', text=u'index', fragment='', nofollow=False)]
    
    In [10]: SgmlLinkExtractor(allow=('key=', 'index'), deny=('value2', )).extract_links(response)
    Out[10]: 
    [Link(url='http://domain.tld/go.php?key=value', text=u'go', fragment='', nofollow=False),
    Link(url='http://example.com/index.html', text=u'index', fragment='', nofollow=False)]
    
    In [11]: SgmlLinkExtractor(allow='domain\.tld').extract_links(response)
    Out[11]: [Link(url='http://domain.tld/go.php?key=value', text=u'go', fragment='', nofollow=False)]
    
    In [12]: SgmlLinkExtractor(allow='example.com').extract_links(response)
    Out[12]: 
    [Link(url='http://example.com/go.php?key=value2', text=u'go2', fragment='', nofollow=False),
    Link(url='http://example.com/index.html', text=u'index', fragment='', nofollow=False)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多