scrapy, splash, lua, нажатие кнопки

Я новичок во всех инструментах здесь. Моя цель состоит в том, чтобы извлечь все URL-адреса из большого количества страниц, которые связаны не более чем с помощью кнопки «Weiter» / «следующий» - это для нескольких URL-адресов. Я решил попробовать это с помощью scrapy. Страница создается динамически. Затем я узнал, что мне нужен еще один инструмент, и установил для этого Splash. Установка рабочая. Я настроил установку согласно руководству. Затем мне удалось получить первую страницу, отправив «возврат» в поле ввода поиска. С браузером, который дает мне нужные результаты. Моя проблема в том, что я пытаюсь нажать кнопку «Далее» на сгенерированной странице и не знаю, как именно. Я читал на нескольких страницах, что это не всегда было легко. Предлагаемые решения я пробовал безуспешно. Я думаю, что я не так уж далеко, и был бы признателен за помощь. Спасибо.

мой settings.py

BOT_NAME = 'gr'
SPIDER_MODULES = ['gr.spiders']
NEWSPIDER_MODULE = 'gr.spiders'
ROBOTSTXT_OBEY = True
DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
SPLASH_URL = 'http://localhost:8050'
SPIDER_MIDDLEWARES = {
    'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

мой паук:

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy_splash import SplashRequest
import json
# import base64

class GrSpider(scrapy.Spider):
    name = 'gr_'
    allowed_domains = ['lawsearch.gr.ch']
    start_urls = ['http://www.lawsearch.gr.ch/le/']

    def start_requests(self):

        script = """
        function main(splash)
            assert(splash:go(splash.args.url))
            splash:set_viewport_full()
            splash:wait(0.3)
            splash:send_keys("<Return>")
            splash:wait(0.3)
            return splash:html()
        end
        """

        for url in self.start_urls:

             yield SplashRequest(url=url,
                    callback=self.parse,
                    endpoint='execute',
                    args={'lua_source': script})

    def parse(self, response):

        script3 = """
            function main(splash)
            splash:autoload{url="https://code.jquery.com/jquery-3.2.1.min.js"}
            assert(splash:go(splash.args.url))
            splash:set_viewport_full()

--            splash:wait(2.8)
--            local element = splash:select('.result-pager-next-active .simplebutton')
--            element:mouse_click()

--            local bounds = element:bounds()
--            assert(element:mouse_click{x=bounds.width, y=bounds.height})

--            naechster VERSCUH
-- https://blog.scrapinghub.com/2015/03/02/handling-javascript-in-scrapy-with-splash/

--  https://stackoverflow.com/questions/35720323/scrapyjs-splash-click-controller-button
--  assert(splash:runjs("$('#date-controller > a:first-child').click()"))

--  https://github.com/scrapy-plugins/scrapy-splash/issues/27
--            assert(splash:runjs("$('#result-pager-next-active .simplebutton').click()"))



-- https://developer.mozilla.org/de/docs/Web/API/Document/querySelectorAll
-- ANSCHAUEN
-- https://stackoverflow.com/questions/38043672/splash-lua-script-to-do-multiple-clicks-and-visits

-- elementList = baseElement.querySelectorAll(selectors)
-- var domRect = element.getBoundingClientRect();
-- var rect = obj.getBoundingClientRect();
-- https://stackoverflow.com/questions/34001917/queryselectorall-with-multiple-conditions

            local get_dimensions = splash:jsfunc([[
               function () {
                 var doc1 = document.querySelectorAll("result-pager-next-active.simplebutton")[0];
                 var el = doc1.documentElement;
                 var rect = el.getClientRects()[0];
                 return {'x': rect.left, 'y': rect.top}
               }
            ]])
--            splash:set_viewport_full()
            splash:wait(0.1)
            local dimensions = get_dimensions()
            splash:mouse_click(dimensions.x, dimensions.y)


--            splash:runjs("document.querySelectorAll('result-pager-next-active ,simplebutton')[1].click()")
--            assert(splash:runjs("$('.result-pager-next-active .simplebutton')[1].click()"))
--            assert(splash:runjs("$('.simplebutton')[12].click()"))

            splash:wait(1.6)
            return splash:html()
        end
        """

        for teil in response.xpath('//div/div/div/div/a'):
            yield {
                'link': teil.xpath('./@href').extract()
            }

        next_page = response.xpath('//div[@class="v-label v-widget simplebutton v-label-simplebutton v-label-undef-w"]').extract_first()

#        print response.body

        print '----------------------'        
#        print  response.xpath('//div[@class="v-slot v-slot-simplebutton"]/div[contains(text(), "Weiter")]').extract_first()
#        print  response.xpath('//div[@class="v-slot v-slot-simplebutton"]/div[contains(text(), "Weiter")]').extract()

#       class="v-slot v-slot-simplebutton"
#        nextPage = HtmlXPathSelector(response).select("//div[@class='paginationControl']/a[contains(text(),'Link Text Next')]/@href")

#        neue_seite=response.url

#        print response.url

        if next_page is not None: 
#            yield SplashRequest(url=neue_seite,

            yield SplashRequest(response.url,
                    callback=self.parse,
                    dont_filter=True,
                    endpoint='execute',
                    args={'lua_source': script3})

person P. Guyan    schedule 05.11.2017    source источник
comment
пожалуйста, добавьте ответ, если вы нашли способ это сделать.   -  person J. Does    schedule 18.12.2017
comment
«Страница создается динамически. Потом я узнал, что мне нужен еще один инструмент, и установил для этого Splash ». На самом деле это распространенное заблуждение. См. docs.scrapy.org/en/latest/topics/dynamic-content .html   -  person Gallaecio    schedule 20.11.2019
comment
в основном я изменил концепцию и теперь использую селен, с которым он работает, как было предложено в предыдущем комментарии.   -  person P. Guyan    schedule 30.11.2019


Ответы (1)


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

person mrhaanraadts    schedule 11.12.2019