Scrapy - LinkExtractor & настройка DEPTH_LIMIT не работает? - PullRequest
0 голосов
/ 29 июня 2018

Итак, я передаю start_url, который является страницей новостных статей (например, cnn.com ). Но я просто хочу извлечь новостную статью, я не хочу переходить по ссылкам на странице статьи. Для этого я использую CrawlSpider со следующим правилом:

rules = (
    Rule(LinkExtractor(allow=('regexToMatchArticleUrls',),
    deny=('someDenyUrls')), callback='parse_article_page'),
)

def parse_article_page(self,response): 
    #extracts the title, date, body, etc of article 

Я включил scrapy.spidermiddlewares.depth.DepthMiddleware и установил DEPTH_LIMIT = 1.

Тем не менее, я все еще получаю ссылки, сканированные со страниц отдельных статей, которые совпадают с regexToMatchArticleUrls, поскольку они являются ссылками на другие части того же веб-сайта (и я не могу сделать регулярное выражение более ограничительным).

Но почему эти ссылки вообще сканируются, когда DEPTH_LIMIT=1? Это потому, что DEPTH_LIMIT сбрасывается для каждой ссылки, извлеченной из LinkExtractor, т.е. URL страницы статьи? Есть ли способ заставить DEPTH_LIMIT работать или расширить DepthMiddleware, чтобы не сканировать ссылки на странице статьи? Спасибо!

1 Ответ

0 голосов
/ 29 июня 2018

Для правильной работы DepthMiddleware необходимо передать метаатрибут от одного запроса к другому, в противном случае depth будет установлен в 0 после каждого нового запроса.

К сожалению, по умолчанию CrawlSpider не сохраняет этот метаатрибут от одного запроса к другому.

Эту проблему можно решить с помощью промежуточного программного обеспечения для пауков (middlewares.py):

from scrapy import Request


class StickyDepthSpiderMiddleware:

    def process_spider_output(self, response, result, spider):
        key_found = response.meta.get('depth', None)
        for x in result:
            if isinstance(x, Request) and key_found is not None:
                x.meta.setdefault('depth', key_found)
            yield x

Кроме того, не забудьте включить это промежуточное ПО в settings.py:

SPIDER_MIDDLEWARES = { '{your_project_name}.middlewares.StickyDepthSpiderMiddleware' : 100 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...