Herança múltipla em aranhas arranhadas
É possível criar uma aranha que herda a funcionalidade de duas aranhas base, a saber SitemapSpider e CrawlSpider?
Eu tenho tentado raspar dados de vários sites e percebi que nem todos os sites têm uma lista de todas as páginas do site, portanto, é necessário usar o CrawlSpider. Mas o CrawlSpider passa por muitas páginas indesejadas e é meio que um exagero.
O que eu gostaria de fazer é algo como isto:
Inicie meu Spider, que é uma subclasse de SitemapSpider, e passe respostas correspondentes a regex para os parse_products para extrair informações úteis.
Vá para os links correspondentes ao regex: / reviews / na página de produtos e envie os dados para a função parse_review.
Nota: As páginas do tipo "/ reviews /" não estão listadas no mapa do site
Extrair informações de / comentários / página
CrawlSpider é basicamente para rastreamentos recursivos e raspagem
-------DETALHES ADICIONAIS-------
O site em questão é www.flipkart.com O site possui listagens para muitos produtos, com cada página tendo sua própria página de detalhes. Juntamente com a página de detalhes, é uma página de "revisão" correspondente ao produto. O link para a página de revisão também está disponível na página de detalhes do produto.
Nota: As páginas de revisão não estão listadas no mapa do site.
class WebCrawler(SitemapSpider, CrawlSpider):
name = "flipkart"
allowed_domains = ['flipkart.com']
sitemap_urls = ['http://www.flipkart.com/robots.txt']
sitemap_rules = [(regex('/(.*?)/p/(.*?)'), 'parse_product')]
start_urls = ['http://www.flipkart.com/']
rules = [Rule(LinkExtractor(allow=['/(.*?)/product-reviews/(.*?)']), 'parse_reviews'),
Rule(LinkExtractor(restrict_xpaths='//div[@class="fk-navigation fk-text-center tmargin10"]'), follow=True)]
def parse_product(self, response):
loader = FlipkartItemLoader(response=response)
loader.add_value('pid', 'value of pid')
loader.add_xpath('name', 'xpath to name')
yield loader.load_item()
def parse_reviews(self, response):
loader = ReviewItemLoader(response=response)
loader.add_value('pid','value of pid')
loader.add_xpath('review_title', 'xpath to review title')
loader.add_xpath('review_text', 'xpath to review text')
yield loader.load_item()