Подтвердить что ты не робот

Scrapy - как идентифицировать уже очищенные URL-адреса

Я использую scrapy для обхода новостного сайта ежедневно. Как я ограничу scrapy от соскабливания уже очищенных URL. Также есть четкая документация или примеры на SgmlLinkExtractor.

4b9b3361

Ответ 1

Вы можете сделать это довольно легко с помощью фрагмента scrapy, расположенного здесь: http://snipplr.com/view/67018/middleware-to-avoid-revisiting-already-visited-items/

Чтобы использовать его, скопируйте код из ссылки и поместите его в какой-либо файл в свой проект. Чтобы ссылаться на него, добавьте строку в свой файл settings.py, чтобы ссылаться на нее:

SPIDER_MIDDLEWARES = { 'project.middlewares.ignore.IgnoreVisitedItems': 560 }

Подробные сведения о том, почему вы выбираете номер, который вы делаете, можно прочитать здесь: http://doc.scrapy.org/en/latest/topics/downloader-middleware.html

Наконец, вам нужно изменить свои items.py, чтобы каждый класс элемента имел следующие поля:

visit_id = Field()
visit_status = Field()

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

Удачи!

Ответ 2

Я думаю, что ответ jama22 немного неполный.

В фрагменте if self.FILTER_VISITED in x.meta:, вы можете видеть, что для экземпляра запроса требуется FILTER_VISITED, чтобы этот запрос был проигнорирован. Это делается для того, чтобы вы могли различать ссылки, которые вы хотите перемещать и перемещаться, и ссылки на объекты, которые вам нужны, вы не хотите видеть снова.

Ответ 3

Scrapy может автоматически фильтровать URL-адреса, которые очищаются, не так ли? Некоторые разные URL-адреса, указывающие на одну и ту же страницу, не будут отфильтрованы, например "www.xxx.com/home/" и "www.xxx.com/home/index.html".

Ответ 4

Это прямо. Поддерживайте все ваши ранее просканированные URL-адреса в python dict. Поэтому, когда вы пытаетесь попробовать их в следующий раз, посмотрите, есть ли этот url в dict. else crawl.

def load_urls(prev_urls):
    prev = dict()
    for url in prev_urls:
        prev[url] = True
    return prev

def fresh_crawl(prev_urls, new_urls):
    for url in new_urls:
        if url not in prev_urls:
            crawl(url)
    return

def main():
    purls = load_urls(prev_urls)
    fresh_crawl(purls, nurls)
    return

Вышеприведенный код был напечатан в текстовом редакторе SO aka browser. Могут возникнуть синтаксические ошибки. Вам также может потребоваться внести несколько изменений. Но логика есть...

ПРИМЕЧАНИЕ. Но будьте осторожны, что некоторые веб-сайты постоянно меняют свой контент. Поэтому иногда вам придется пересканировать определенную веб-страницу (например, тот же URL), чтобы получить обновленный контент.