Scrapy: выскабливание данных из пагинации - PullRequest
0 голосов
/ 09 сентября 2018

пока я собрал данные с одной страницы. Я хочу продолжить до конца нумерации страниц.

Нажмите здесь для просмотра страницы

Кажется, проблема в том, что href содержит элемент javascript.

<a href="javascript:void(0)" class="next" data-role="next" data-spm-anchor-id="a2700.galleryofferlist.pagination.8">Next</a>

Мой код

# -*- coding: utf-8 -*-
import scrapy


class AlibabaSpider(scrapy.Spider):
    name = 'alibaba'
    allowed_domains = ['alibaba.com']
    start_urls = ['https://www.alibaba.com/catalog/agricultural-growing-media_cid144?page=1']

def parse(self, response):
    for products in response.xpath('//div[contains(@class, "m-gallery-product-item-wrap")]'):
        item = {
            'product_name': products.xpath('.//h2/a/@title').extract_first(),
            'price': products.xpath('.//div[@class="price"]/b/text()').extract_first('').strip(),
            'min_order': products.xpath('.//div[@class="min-order"]/b/text()').extract_first(),
            'company_name': products.xpath('.//div[@class="stitle util-ellipsis"]/a/@title').extract_first(),
            'prod_detail_link': products.xpath('.//div[@class="item-img-inner"]/a/@href').extract_first(),
            'response_rate': products.xpath('.//i[@class="ui2-icon ui2-icon-skip"]/text()').extract_first('').strip(),
            #'image_url': products.xpath('.//div[@class=""]/').extract_first(),
         }
        yield item

    #Follow the paginatin link
    next_page_url = response.xpath('//link[@rel="next"]/@href').extract_first()
    if next_page_url:
        yield scrapy.Request(url=next_page_url, callback=self.parse)

Задача

  • Как решить проблему нумерации страниц?

Как вы можете помочь

  • Помогите мне изменить код таким образом, чтобы я мог перейти по ссылке нумерации страниц и очистить данные до конца.

Ответы [ 2 ]

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

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

next_page_url = response.xpath('//div[@class="ui2-pagination-pages"]/span[@class="current"]/following-sibling::a[1][contains(@href, "?page=")]/@href').extract_first()

, но это не сработает, потому что блок разбиения на страницы представлен Javascript: - (

Но вы можете использовать какую-то хитрость:

next_page_url = response.xpath('//link[@rel="next"]/@href').extract_first()
0 голосов
/ 09 сентября 2018

Чтобы найти и проанализировать все страницы в категории, вы можете использовать что-то вроде:

import re
import requests
base_url = "https://www.alibaba.com/catalog/agricultural-growing-media_cid144?page="
resp = requests.get(base_url)

try :
    n_pages = re.findall(r'"pagination":\{\s+"total":(.*?),', resp.text , re.IGNORECASE)
    if n_pages:
        for page in range(1, int(n_pages[0]) + 1):
            url = "{}{}".format(base_url, page)
            # do the parsing in this block using the dynamic generated url's
            # https://www.alibaba.com/catalog/agricultural-growing-media_cid144?page=1
            # ...
            # https://www.alibaba.com/catalog/agricultural-growing-media_cid144?page=68

except Exception as e:
    print ("Cannot find/parse the total number of pages", e)
    # general except, needs improvment in error handling
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...