Как перемещаться по нумерации страниц на основе js / ajax при просмотре веб-сайта? - PullRequest
0 голосов
/ 24 февраля 2020

Мой код работает нормально только для первой страницы каждой категории, но я хочу вырезать из всех страниц каждой категории. Я не могу перемещаться по следующим страницам. Веб-сайт использует AJAX для заполнения данных, когда я нажимаю кнопку «Далее» для перехода на следующую страницу.

Я также изучил запрос ajax, который этот веб-сайт делает для динамического заполнения данными (это URL-адрес, который появляется на вкладке сети, когда я нажимал кнопку следующей страницы https://www.couponcodesme.com/ae/category/searchfilter). Но не нашел способа высмеять этот запрос вручную, используя Scrapy. Если есть возможность посмеяться над запросом ajax, пожалуйста, дайте мне знать, как это сделать для этой конкретной проблемы. Вы можете предложить любое другое решение, а не Scrapy-Spla sh!

Я искал весь форум Stack Overflow, но не нашел правильного решения этой проблемы. Пожалуйста, посмотрите на это и помогите мне.

Спасибо

import scrapy
from scrapy import Request
from ..items import CouponcollectItem
from scrapy_splash import SplashRequest

class Couponsite5SpiderSpider(scrapy.Spider):
    name = 'couponSite5_spider'
    allowed_domains = ['www.couponcodesme.com']

    script = '''
        function main(splash, args)
            local url = splash.args.url
            assert(splash:go(url))
            assert(splash:wait(5))
            assert(splash:runjs("$('a.category_pagination_btn.next_btn.top-page-button').click()"))
            assert(splash:wait(5))
            return {
                html = splash:html()
            }
        end
    '''

    def start_requests(self):
        yield Request(
            url="https://www.couponcodesme.com/ae/categories",
            callback=self.parse
        )

    def parse(self, response):   
        urls = response.xpath('//ul[@class="flexboxesmain categorieslist"]/li/a/@href').extract()
        for url in urls:
            yield SplashRequest(
                url=url, 
                callback=self.parse_params,
                endpoint="execute",
                args={
                    'wait': 1,
                    'lua_source': self.script
                }
            )

    def parse_params(self, response):   
        items = CouponcollectItem()
        coupon_category = response.xpath('//div[@class="head_main"]/h1[@class="h2_title"]/text()').extract()
        coupon_lists = response.css('#temp1')

        for coupon in coupon_lists.xpath('div'):
            coupon_title = coupon.xpath('normalize-space(.//h3/a/text())').extract()
            coupon_store_name = coupon.xpath('normalize-space(.//div[@class="img-vert-center setheight brdrclr"]/a/@href)').extract()
            store_img_src = coupon.xpath('normalize-space(.//div[@class="img-vert-center setheight brdrclr"]/a/img/@data-src)').extract()
            coupon_code_txt = coupon.xpath('normalize-space(.//span[@class="offer_code"]/span/text())').extract()
            coupon_store_out = coupon.xpath('.//button/@data-alt').extract()

            items['coupon_title'] = [self.deEmojify(coupon_title[0]) if len(coupon_title) != 0 else '']
            items['coupon_code_txt'] = [coupon_code_txt[0] if len(coupon_code_txt) != 0 else '']

            items['coupon_store_out'] = [coupon_store_out[0] if len(coupon_store_out) != 0 else '']
            items['store_img_src'] = [store_img_src[0] if len(store_img_src) != 0 else '']
            items['website_link'] = [response.request.url]

            if len(coupon_category) != 0:
                if coupon_category[0].endswith(' Coupons'):
                    items['coupon_category'] = [self.deEmojify(coupon_category[0][:-8])]
                else:
                    items['coupon_category'] = [self.deEmojify(coupon_category[0])]
            else:
                items['coupon_category'] = ['']

            if len(coupon_store_name) != 0:
                if coupon_store_name[0].endswith(' Coupons'):
                    items['coupon_store_name'] = [self.deEmojify(coupon_store_name[0][:-8])]
                elif coupon_store_name[0].startswith('https://'):
                    items['coupon_store_name'] = [coupon_store_name[0].split('/')[-1]]
                else:
                   items['coupon_store_name'] = [self.deEmojify(coupon_store_name[0])]
            else:
                items['coupon_store_name'] = [''] 

            yield items

    def deEmojify(self, inputString):
        return inputString.encode('ascii', 'ignore').decode('ascii')
...