2017-10-10 16 views
1

J'ai Scrapy explorer mon site, trouver des liens avec une réponse 404 et les retourner dans un fichier JSON. Cela fonctionne vraiment bien.Obtention de toutes les instances d'une erreur 404 avec scrapy

Cependant, je n'arrive pas à comprendre comment obtenir toutes les instances de ce mauvais lien puisque le filtre de duplication intercepte ces liens et ne les réessaye pas. Comme notre site a des milliers de pages, les sections sont gérées par plusieurs équipes, je dois être capable de créer un rapport de mauvais liens par section plutôt que d'en trouver un et de faire une recherche de remplacement sur l'ensemble du site.

Toute aide serait grandement appréciée.

Mon crawler actuel:

import scrapy 
from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors.lxmlhtml import LxmlLinkExtractor 
from scrapy.item import Item, Field 

# Add Items for exporting to JSON 
class DevelopersLinkItem(Item): 
    url = Field() 
    referer = Field() 
    link_text = Field() 
    status = Field() 
    time = Field() 

class DevelopersSpider(CrawlSpider): 
    """Subclasses Crawlspider to crawl the given site and parses each link to JSON""" 

    # Spider name to be used when calling from the terminal 
    name = "developers_prod" 

    # Allow only the given host name(s) 
    allowed_domains = ["example.com"] 

    # Start crawling from this URL 
    start_urls = ["https://example.com"] 

    # Which status should be reported 
    handle_httpstatus_list = [404] 

    # Rules on how to extract links from the DOM, which URLS to deny, and gives a callback if needed 
    rules = (Rule(LxmlLinkExtractor(deny=([ 
     '/android/'])), callback='parse_item', follow=True),) 

    # Called back to for each requested page and used for parsing the response 
    def parse_item(self, response): 
     if response.status == 404: 
      item = DevelopersLinkItem() 
      item['url'] = response.url 
      item['referer'] = response.request.headers.get('Referer') 
      item['link_text'] = response.meta.get('link_text') 
      item['status'] = response.status 
      item['time'] = self.now.strftime("%Y-%m-%d %H:%M") 

      return item 

J'ai essayé quelques filtres Dupe personnalisés mais finalement aucun d'entre eux travaillaient.

Répondre