LinkExtractor не работает - необходимо запустить собственный код - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь сканировать сайт. Он имеет индексные страницы, которые разбиты на страницы, а затем детализируют страницы. Искатель работает нормально на страницах сведений, но горизонтальный обход не работает на индексных страницах. Это вызвано тем, что элемент «Далее» на горизонтальных страницах не имеет URL-адреса, по которому сканер должен следовать. Я решил это с помощью Selinium, но я не знаю, как добавить это к гусеничнику.

Я попытался переписать функцию разбора, но это сломало сканер.

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy.loader.processors import MapCompose,Join
from scrapy.loader import ItemLoader
from ..items import PropertiesItem
import datetime
import socket


class EasySpider(CrawlSpider):
    name = 'easy'
    allowed_domains = ['www.example.co.uk']
    start_urls = ['https://www.example.co.uk/starturl']

    rules = (
        Rule(LinkExtractor(restrict_xpaths='//*[contains(@class,"pagination-direction-next")]'), callback='parse_horizontal'),
        Rule(LinkExtractor(restrict_xpaths='//*[contains(@class, "propertyCard-img-link aspect-3x2 ")]'), callback='parse_item')
    )

    def parse_horizontal(self, response):
        l = ItemLoader(item=PropertiesItem(), response=response)
        l.add_value('url', response.url)
        return l.load_item()
        #add additional code here that yields the URLS


    def parse_item(self, response):
        #item = {}
        #item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get()
        #item['name'] = response.xpath('//div[@id="name"]').get()
        #item['description'] = response.xpath('//div[@id="description"]').get()
        #return item
        l = ItemLoader(item=PropertiesItem(), response=response)

        l.add_xpath('price', '//*[@id="propertyHeaderPrice"]/strong/text()',
                    MapCompose(lambda i: i.replace(',', ''), float), re='[,.0-9]+')

        # Housekeeping fields
        l.add_value('url', response.url)
        l.add_value('project', self.settings.get('BOT_NAME'))
        l.add_value('spider', self.name)
        l.add_value('server', socket.gethostname())
        l.add_value('date', datetime.datetime.now())

        return l.load_item()

Я бы хотел, чтобы parse_horizontal запускалась, когда встречается класс 'pagination-direction-next'. Однако класс содержит кнопку, которую вы можете нажать на веб-сайте, но не содержит фактического URL. Наверное, поэтому обратный вызов никогда не срабатывает, но я не знаю, что делать вместо этого.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...