Как получить несколько наборов данных на странице с помощью скрапа? - PullRequest
0 голосов
/ 12 апреля 2020

Я хочу извлечь все 50 наборов данных со страницы результатов поиска с помощью scrapy.

Первоначально я использовал для извлечения каждого набора данных со страниц продукта, чтобы легко найти на странице соскоба go. Мне пришла в голову идея получить все необходимые данные только со страницы результатов поиска, поскольку это все данные, которые мне нужны в пределах фрагментов страницы продукта. Таким образом, несколько наборов результатов на каждой странице вместо одного.

Мой код действительно подсчитывает количество наборов данных, а затем должен циклически проходить по наборам данных для извлечения данных.

например

# how many datasets on this page?
datasets = len(response.xpath('//div[@class="col-result-list"]'))

Теперь переберите все элементы:

for i in range(0, datasets):
    print('dataset_' + str(i))
    # new dataset
    mouse                  = mouseItem()
    mouse['i02_title']     = response.xpath('//div[@class="col-result-list"][' + str(i) + ']/div[@class="result-list-entry"]/text()').extract_first()

return mouse

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

Это весь класс:

class GetbidSpider(CrawlSpider):
    name = 'test'

    allowed_domains = ['www.test.com']
    start_urls = ['https://www.test.com/all-from-category/']

    rules = (

        # parse this pages
        Rule(
            LinkExtractor(allow=['.*test\.com\/all\-from\-category\/\?resultsPerPage=100\&pageNumber=(\d.*)&\$cat=nvkps23f7dy']), 
            callback='parse_item'
        ),

        # follow all the index urls 
        Rule(
            LinkExtractor(allow=['.*test\.com\/all\-from\-category\/\?resultsPerPage=100\&pageNumber=(\d.*)&\$cat=nvkps23f7dy']), 
            follow=True
        ),
    )


    def parse_item(self, response):

        # how many datasets on this page?
        datasets = len(response.xpath('//div[@class="col-result-list"]'))

        print("Amount of data sets:" + str(datasets))

        # get the individual datasets 
        for i in range(0, datasets):
            print('dataset_' + str(i))
            # new dataset
            mouse                  = mouseItem()

            mouse['i02_title']     = response.xpath('//div[@class="col-result-list"][' + str(i) + ']/div[@class="result-list-entry"]/div[@class="result-list-entry-data"]/div[@class="result-list-entry-title"]/a/text()').extract_first()


        return mouse

Как я могу изменить мой код для получения всех наборов данных с одной страницы?

1 Ответ

0 голосов
/ 12 апреля 2020

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

def parse_item(self, response):
    # how many datasets on this page?
    datasets = len(response.xpath('//div[@class="col-result-list"]'))
    print("Amount of data sets:" + str(datasets))

    # get the individual datasets
    for i in range(0, datasets):
        print('dataset_' + str(i))
        # new dataset
        mouse = mouseItem()

        mouse['i02_title'] = response.xpath('//div[@class="col-result-list"][' + str(
            i) + ']/div[@class="result-list-entry"]/div[@class="result-list-entry-data"]/div[@class="result-list-entry-title"]/a/text()').extract_first()

        yield mouse

Я только что удалил return statement и, наконец, добавил yield statement для l oop.

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