我已将一只蜘蛛放在一起,它按预期运行,直到我将关键字deny
添加到规则中。
这是我的蜘蛛:
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy.selector import Selector
from bhg.items import BhgItem
class BhgSpider (CrawlSpider):
name = 'bhg'
start_urls = ['http://www.bhg.com/holidays/st-patricks-day/']
rules = (Rule(LinkExtractor(allow=[r'/*'], ),
deny=('blogs/*', 'videos/*', ),
callback='parse_html'), )
def parse_html(self, response):
hxs = Selector(response)
item = BhgItem()
item['title'] = hxs.xpath('//title/text()').extract()
item['h1'] = hxs.xpath('//h1/text()').extract()
item['canonical'] = hxs.xpath('//link[@rel = \"canonical\"]/@href').extract()
item['meta_desc'] = hxs.xpath('//meta[@name=\"description"]/@content').extract()
item['url'] = response.request.url
item['status_code'] = response.status
return item
当我运行此代码时,我得到:
deny=('blogs/', 'videos/', ),), )
TypeError: __init__() got an unexpected keyword argument 'deny'
我做错了什么?好吧,我猜一个函数或某些东西不期待额外的参数(deny
),但是哪个函数? parse_html()
?
我没有定义任何其他蜘蛛,也没有__init__()
答案 0 :(得分:2)
deny
应该作为参数传递给LinkExtractor
,但是你把它放在那些括号之外并将它传递给Rule
。把它移到里面,所以你有:
rules = (Rule(LinkExtractor(allow=[r'/*'], deny=('blogs/*', 'videos/*', )),
callback='parse_html'), )
__init__
是在实例化类时传递参数时调用的方法,就像您在此处使用Rule
和LinkExtractor
类一样。
答案 1 :(得分:1)
__init__
是构造对象时调用的Rule类的内部方法。
我在网上找到的这个例子deny=
传递给了LinkExtractor,而不是规则。所以你想要:
rules = (Rule(LinkExtractor(allow=('/*',),
deny=('blogs/*', 'videos/*', )),
callback='parse_html'), )