Я использую scrapy для обхода новостного сайта ежедневно. Как я ограничу scrapy от соскабливания уже очищенных URL. Также есть четкая документация или примеры на SgmlLinkExtractor
.
Scrapy - как идентифицировать уже очищенные URL-адреса
Ответ 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), чтобы получить обновленный контент.