Очистка веб-сайта без сканирования раздела «Поисковая система» страницы - PullRequest
0 голосов
/ 02 июля 2018

В последнее время я пытался разработать веб-сканер, используя Scrapy для извлечения всех документов PDF из определенного домена, и, хотя я могу каким-то образом достичь цели, он все еще застревает в каком-то «бесконечном цикле», потому что части «поисковой системы» указанного сайта.

Можно ли как-нибудь избежать такого поведения?

Вот код сканера, который был написан до сих пор (извините, если это спагетти, все еще пытаюсь поправиться ..):

class AirbusSpider(CrawlSpider):
    name = "test"
    tag = "aircraft"
    n_iterations = 3
    allowed_domains = ['airbus.com']

    start_urls = [
        'https://www.airbus.com'
    ]

def start_requests(self):
    for url in self.start_urls:
        yield scrapy.Request(url=url, callback=self.parse)

def parse(self, response):
    yield scrapy.Request(url=response.url+'/'+self.tag+'.html', callback=self.parse_item, meta={'iteration': self.n_iterations})


def parse_item(self, response):
    current_iteration = response.meta['iteration']
    if(current_iteration>0):

        temp_links = []
        valuable_links = []
        current_iteration-=1

        #all "somewhat-valuable" links to crawl into
        links = response.selector.xpath('//a[contains(@href,"aircraft")]/@href').extract() #all hrefs of current page

        for link in links:
            valuable_links.append(link)

        temp_links = set(valuable_links) 
        valuable_links = list(temp_links)

        for link in valuable_links:
            link = str(link.encode('utf-8'))
            if '.pdf' not in link:
                if(link[0] == '/' or link[0] == '#'):
                    yield scrapy.Request(url=self.start_urls[0]+link, callback=self.parse_item, meta={'iteration': current_iteration})
                else:
                    yield scrapy.Request(url=link, callback=self.parse_item, meta={'iteration': current_iteration})
            else:
                if(link[0] == '/'  or link[0] == '#'):
                    #increase the priority of these requests
                    yield scrapy.Request(url=self.start_urls[0]+link, callback=self.download_file, priority = 1)
                else:
                    yield scrapy.Request(url=link, callback=self.download_file, priority = 1)

def download_file(self, response):
    item = PdfLink()
    item['link'] = str(response.url)

    return item

Я попытался ограничить рекурсию, добавив ограничитель (n_iterations) того, насколько глубоко должен проникнуть сканер. Это работает, но, тем не менее, я хотел бы отфильтровать ссылки, по которым он сканирует должным образом.

Большое спасибо за помощь, хорошей недели!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...