我正在使用Python中的Scrapy框架从this page中抓取数据。我想创建一个单独的蜘蛛,它将首先跟踪到六个图库的链接,然后从每个页面抓取一些数据,并跟踪每个页面中的链接到 Read the Curators' Statement;我想从该页中抓取语句的文本。解析器应该如何嵌套才能完成这项任务?
import scrapy
class GalleriesSpider(scrapy.Spider):
name = "galleries"
start_urls = ['https://www.exploratorium.edu/visit/galleries']
def parse(self, response):
galleries_page_links = response.xpath('//h2[text()="Museum Galleries"]/following-sibling::div//h5/a/@href')
yield from response.follow_all(galleries_page_links, self.parse_gallery)
def parse_gallery(self, response):
def extract(query):
return response.xpath(query).get(default='').replace(u'\xa0', u' ').strip()
def extracts(query):
return [item.replace(u'\xa0', u' ').strip() for item in response.xpath(query).getall()]
# def parse_curator(response):
# def extracts_merge(query):
# return ' '.join(extracts(query))
#
# yield {
# 'curator-statement': extracts_merge('//div[@id="main-content"]'
# '//div[@class="field-items"]//p//text()')
# }
# this_curator_url = extracts('//div[@id="main-content"]//p/a/@href')[-1]
# this_curator_statement = response.follow(this_curator_url, parse_curator(this_curator_url))
yield {
'url': response.url,
'title': extract('//div[@id="main-content"]//h1/text()'),
'subtitle': extract('//div[@id="main-content"]//h3/text()'),
'description': extract('//div[@id="main-content"]//h3/following-sibling::p/text()'),
'highlights_url': extracts('//div[@class="grid-33 grid-parent pod-body"]//h5/a/@href'),
'curator-url': extract('//div[@id="main-content"]//p/a/@href'),
}\
#.update(this_curator_statement)
上面的代码产生了一个蜘蛛,它从图库页面抓取数据(正如预期的那样)。但是,当我试图添加注解代码时,我得到了AttributeError: 'str' object has no attribute 'xpath'
。我认为这是因为this_curator_url
不是一个Scrapy响应对象。在这种情况下,嵌套解析器的最佳方式是什么?
1条答案
按热度按时间wsewodh21#
您根本不需要嵌套解析器。您需要做的是为每个抓取的页面创建单独的解析回调方法,并在从每个页面提取必要数据时依次调用它们。然后,您可以通过scrapy请求的
cb_kwargs
参数将必要信息传递给下一个解析器,这样您就可以一次性完成项目并产生最终结果。比如说
输出