Как пропустить родительские каталоги при очистке сайта с типом файла? - PullRequest
0 голосов
/ 30 мая 2018

При просмотре веб-сайта базовой системы папок, в котором для хранения файлов используются каталоги,

yield scrapy.Request(url1, callback=self.parse)

переходит по ссылкам и очищает все содержимое просканированной ссылки, но я обычно сталкиваюсь с передачей сканеромчерез ссылку на корневой каталог, и он получает все те же файлы с разными URL-адресами, поскольку корневой каталог находится между ними.

http://example.com/root/sub/file
http://example.com/root/sub/../sub/file

Любая помощь будет принята.

Вот фрагмент кода дляпример кода

class fileSpider(Spider):
    name = 'filespider'
    def __init__(self, filename=None):
        if filename:
            with open(filename, 'r') as f:
                self.start_urls =  [url.strip() for url in f.readlines()]

    def parse(self, response):
        item = Item()
        for url in response.xpath('//a/@href').extract():
            url1 = response.url + url
            if(url1[-4::] in videoext):
                item['name'] = url
                item['url'] = url1
                item['depth'] = response.meta["depth"]
                yield item
            elif(url1[-1]=='/'):
                yield scrapy.Request(url1, callback=self.parse)   
        pass

1 Ответ

0 голосов
/ 31 мая 2018

вы можете использовать os.path.normpath для нормализации всех путей, поэтому вы не получите дубликаты:

import os
import urlparse
...

    def parse(self, response):
        item = Item()
        for url in response.xpath('//a/@href').extract():
            url1 = response.url + url

            # =======================
            url_parts = list(urlparse.urlparse(url1))
            url_parts[2] = os.path.normpath(url_parts[2])
            url1 = urlparse.urlunparse(url_parts)
            # =======================

            if(url1[-4::] in videoext):
                item['name'] = url
                item['url'] = url1
                item['depth'] = response.meta["depth"]
                yield item
            elif(url1[-1]=='/'):
                yield scrapy.Request(url1, callback=self.parse)   
        pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...