Scrapy - как определить уже очищенные URL - PullRequest
13 голосов
/ 06 октября 2010

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

Ответы [ 4 ]

13 голосов
/ 17 ноября 2010

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

Чтобы использовать его, скопируйте код из ссылки и поместите его в какой-нибудь файл в вашем проекте Scrapy.Чтобы сослаться на него, добавьте строку в файл 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()

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

Удачи!

1 голос
/ 27 ноября 2012

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

».
1 голос
/ 12 января 2012

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

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

0 голосов
/ 06 октября 2010

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

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 или браузере. Может иметь синтаксические ошибки. Вам также может потребоваться внести несколько изменений. Но логика есть ...

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

...