Используя scrapy-splash нажатие кнопки - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь использовать Scrapy-splash , чтобы нажать кнопку на странице, которую я перенаправляю на .

Я протестировал ручное нажатие на страницу, и я перенаправлен на правильную страницу после нажатия кнопки, которая дает мое согласие. Я написал небольшой скрипт для нажатия кнопки, когда я перенаправлен на страницу, но это не работает.

Я включил фрагмент моего паука ниже - я что-то упустил в своем коде?:

from sys import path
import os

dir_path = os.path.dirname(os.path.realpath(__file__))
path.append(dir_path)

import scrapy
from scrapy_splash import SplashRequest

script="""
function main(splash)
    splash:wait(1)
    splash:runjs('document.querySelector("form.consent-form").submit()')
    splash:wait(1)
    return {
        html = splash:html(),
    }
end
"""


class FoobarSpider(scrapy.Spider):
    name = "foobar"          

    def start_requests(self):
        urls = ['https://uk.finance.yahoo.com/quote/ANTO.L?p=ANTO.L']

        for url in urls:
            yield SplashRequest(url=url, callback=self.parse,
                    endpoint='render.html',
                    args={'wait': 3},
                    meta = {'yahoo_url': url }
                )



    def parse(self, response):
        url = response.url

        with open('temp.html', 'wb') as f:
            f.write(response.body)

        if 'https://guce.' in url:
            print('About to attempt to authenticate ...')
            yield SplashRequest(
                                    url, 
                                    callback = self.get_price, 
                                    endpoint = 'execute',
                                    args = {'lua_source': script, 'timeout': 5},
                                    meta = response.meta 
                                )

        else:
            self.get_price(response)




    def get_price(self, response):    
        print("Get price called!")
        yahoo_price = None          

        try:
            # Get Price ...
            temp1 = response.css('div.D\(ib\).Mend\(20px\)')
            if temp1 and len(temp1) > 1:
                temp2 = temp1[1].css('span')
                if len(temp2) > 0:
                    yahoo_price = temp2[0].xpath('.//text()').extract_first().replace(',','') 

            if not yahoo_price:
                val = response.css('span.Trsdu\(0\.3s\).Trsdu\(0\.3s\).Fw\(b\).Fz\(36px\).Mb\(-4px\).D\(b\)').xpath('.//text()').extract_first().replace(',','')
                yahoo_price = val


        except Exception as err:
            pass           


        print("Price is: {0}".format(yahoo_price))


    def handle_error(self, failure):
        pass

Как мне исправить это, чтобы я мог правильно дать согласие, чтобы меня перенаправили на нужную страницу?

1 Ответ

0 голосов
/ 08 июля 2018

Вместо того, чтобы нажимать кнопку, попробуйте отправить форму:

document.querySelector("form.consent-form").submit()

Я попытался запустить команду JavaScript input.btn.btn-primary.agree").click() в своей консоли и получил сообщение об ошибке «К сожалению, что-то пошло не так», но страница загружается при использовании приведенного выше кода для отправки формы.

Поскольку я не в Европе, я не могу полностью воссоздать ваши настройки, но я верю, что это поможет вам справиться с этой проблемой. Я предполагаю, что этот скрипт мешает .click() методу.

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