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.