фильтрующий элемент в трубопроводе очистки - PullRequest
0 голосов
/ 09 октября 2018

Я удалил URL, которые хочу со страницы.Теперь я хочу отфильтровать их по ключевым словам, используя конвейер:

class GumtreeCouchesPipeline(object):

keywords = ['leather', 'couches']

def process_item(self, item, spider):
    if any(key in item['url'] for key in keywords):
        return item

Проблема в том, что теперь он ничего не возвращает.

Паук:

import scrapy
from gumtree_couches.items import adItem
from urllib.parse import urljoin

class GumtreeSpider(scrapy.Spider):
    name = 'GumtreeCouches'
    allowed_domains = ['https://someurl']
    start_urls = ['https://someurl']


def parse(self, response):
    item = adItem()
    for ad_links in response.xpath('//div[@class="view"][1]//a'):
        relative_url = ad_links.xpath('@href').extract_first()
        item['title'] = ad_links.xpath('text()').extract_first()
        item['url'] = response.urljoin(relative_url)

        yield item

Как я могу отфильтровать все очищенные URL для ключевых слов, используя конвейер?Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Это должно решить вашу проблему:

class GumtreeCouchesPipeline(object):

    keywords = ['leather', 'couches']

    def process_item(self, item, spider):
        if any(key in item['url'] for key in self.keywords):
            return item

Обратите внимание, что я использую self.keywords для ссылки на атрибут класса keywords.

Если вы посмотрите журналы вашего паука, вы должны найти некоторые ошибки, говорящие что-то вроде: NameError: name 'keywords' is not defined.

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

from scrapy.exceptions import DropItem

class GumtreeCouchesPipeline(object):

    keywords = ['leather', 'couches']

    def process_item(self, item, spider):
        if not any(key in item['url'] for key in self.keywords):
            raise DropItem('missing keyword in URL')
        return item

Таким образом, вы получитеинформация о пропущенных предметах в статистике заданий после ее завершения.

0 голосов
/ 09 октября 2018

Из прочтения документации я думаю, что вы должны обслуживать все пути, например

from scrapy.exceptions import DropItem

    def process_item(self, item, spider):
        keywords = ['leather', 'couches']
        if item['url']:
            if any(key in item['url'] for key in keywords):
                return item
            else
                raise DropItem("Missing specified keywords.")
        else
            return item
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...