如何防止Scrapy抓取“被拒绝”页面

时间:2014-01-11 00:49:37

标签: python regex scrapy

我正在尝试抓取域的所有页面,除了以/ go.php开头的那些页面,但我对如何让Scrapy理解这一点感到茫然。我已经尝试过这个规则(这是我的CrawlSpider中定义的唯一规则),但它仍然会抓取像 domain.tld / go.php?key = value 这样的网址:

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

规则似乎得到了应用,因为在启动带有明显无效的正则表达式的蜘蛛时(例如带有不平衡括号的蜘蛛),我得到一个异常。


更新

恐怕我在其他地方找到了解决问题的方法。在重新阅读文档之后,我注意到了这个警告:“在编写爬网蜘蛛规则时,请避免使用parse作为回调,因为CrawlSpider使用parse方法本身来实现其逻辑。因此,如果重写解析方法,爬网蜘蛛将不再起作用“。 - 不幸的是,这正是我所做的。将parse方法重命名为其他方法使Scrapy尊重规则。对不起,感谢您的所有答案,这使我指出了正确的方向。

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

1 个答案:

答案 0 :(得分:0)

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

您可以运行scrapy shell "http://website/page?foo&bar"来检查页面并使用allow / deny参数进行播放。您还可以针对任意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)]