我正在尝试抓取域的所有页面,除了以/ 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
,前面没有斜线。
答案 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)]