我试图通过提取所有带有"huis"(荷兰语="house")的链接来抓取网站。按照 http://doc.scrapy.org/en/latest/topics/spiders.html,我正在尝试
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from Funda.items import FundaItem
class FundaSpider(scrapy.Spider):
name = "Funda"
allowed_domains = ["funda.nl"]
start_urls = [
"http://www.funda.nl/koop/amsterdam/"
]
rules = (
Rule(LinkExtractor(allow=r'.*huis.*', callback='parse_item'))
)
def parse_item(self, response):
item = FundaItem()
item['title'] = response.extract()
return item
但是,我收到错误消息
Rule(LinkExtractor(allow=r'.*huis.*', callback='parse_item'))
TypeError: __init__() got an unexpected keyword argument 'callback'
从上一篇文章(Scrapy Error:TypeError:__init__)得到了一个意想不到的关键字参数"deny")看起来一个可能的原因是括号不匹配,因此关键字被传递给Rule
而不是LinkExtractor
。然而,在我看来,在这种情况下,callback
按预期在LinkExtractor
括号内。
知道是什么导致了此错误吗?
是的,callback
肯定会传递给LinkExtractor
.实际上,这似乎是问题所在,因为我在文档中该类的预期参数下看不到callback
。
我看到 Rule
类确实在文档中列出了一个回调参数。所以也许你应该把它传递给规则而不是链接提取器?
Rule(LinkExtractor(allow=r'.*huis.*'), callback='parse_item')
如果你在想"但是为什么链接问题的回答者把callback
放在LinkExtractor
电话里?",我认为你可能误解了括号的嵌套,这确实有些令人困惑。更改布局使其更清晰:
rules = (
Rule(
LinkExtractor(
allow=[r'/*'],
deny=('blogs/*', 'videos/*', )
),
callback='parse_html'
),
)