我有一个刮擦蜘蛛,只要我给它一个包含指向它应该抓取的页面的链接的页面,它就可以很好地工作。现在,我不想给它所有类别,而是提供包含所有类别链接的页面。我想我可以简单地添加另一个解析函数来实现这一点。
但是控制台输出给了我一个属性错误
"属性错误:'zaubersonder' 对象没有属性'解析细节'">
这告诉我某些属性引用无法正常工作。我是面向对象的新手,但我认为 scrapy 正在调用 parse,它调用prase_level2进而调用parse_details,这应该可以正常工作。
以下是我迄今为止的努力。
import scrapy
class zaubersonder(scrapy.Spider):
name = 'zaubersonder'
allowed_domains = ['abc.de']
start_urls = ['http://www.abc.de/index.php/rgergegregre.html'
]
def parse(self, response):
urls = response.css('a.ulSubMenu::attr(href)').extract() # links to categories
for url in urls:
url = response.urljoin(url)
yield scrapy.Request(url=url,callback=self.parse_level2)
def parse_level2(self, response):
urls2 = response.css('a.ulSubMenu::attr(href)').extract() # links to entries
for url2 in urls2:
url2 = response.urljoin(url2)
yield scrapy.Request(url=url2,callback=self.parse_details)
def parse_details(self,response): #extract entries
yield {
"Titel": response.css("li.active.last::text").extract(),
"Content": response.css('div.ce_text.first.block').extract() + response.css('div.ce_text.last.block').extract(),
}
编辑:修复了代码,以防有人搜索它
代码中有拼写错误。parse_level2
中的回调是 self.parsedetails
,但函数名为 parse_details
。
只需将 parse_level2
中的yield
更改为:
yield scrapy.Request(url=url2,callback=self.parse_details)
..它应该工作得更好。