Селекторы scrapy xpath не возвращают ничего - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь переписать код, который я создал с помощью библиотеки requests- html. Из-за дополнительных функций, необходимых для проекта, я сейчас использую scrapy.

У меня проблемы с получением паука scrapy / spla sh для получения xpaths. Каждый раз, когда я запускаю код, я ничего не получаю.

С запросами- html xpaths возвращает желаемые данные.

запросы- html код:

from requests_html import AsyncHTMLSession, HTMLSession

asession = AsyncHTMLSession()

async def get_page():
    code = 'NASDAQ-MDB'
    r = await asession.get(f'https://www.tradingview.com/symbols/{code}/')
    await r.html.arender(wait=4)
    return r

results = asession.run(get_page)
for result in results:
    enterprise_value_sel = "(//span[@class='tv-widget-fundamentals__value apply-overflow-tooltip'])[2]"
    total_shares_outstanding_sel = "(//span[@class='tv-widget-fundamentals__value apply-overflow-tooltip'])[4]"

    enterprise_value = result.html.xpath(enterprise_value_sel, first=True).text
    total_shares_outstanding = result.html.xpath(total_shares_outstanding_sel, first=True).text
    print(enterprise_value, total_shares_outstanding)

scrapy_splash_code:

import scrapy
from scrapy_splash import SplashRequest
import json
from tradingview.items import *
import datetime
import os

class TradingviewsigsSpider(scrapy.Spider):
    name ='tradingviewsigs'

    script = """
            function main(splash, args)
                assert(splash:go(args.url))
                assert(splash:wait(5.5))
                local scroll_to =splash:jsfunc("window.scrollTo")
                scroll_to(0, 800)
                return {
                    html =splash:html(),
                    png =splash:png(),
                    har =splash:har(),
                }
        end
    """
    start_urls =['https://tradingview.com/symbols/NASDAQ-MDB/']

    def start_requests(self):

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

    def parse(self, response):
        url = response.url
        print('Crawling: < {} >'.format(url))

        financials = TradingviewItem()
        financials['enterprise_val_sel'] = response.xpath("(//span[@class='tv-widget-fundamentals__value apply-overflow-tooltip'])[2]/text()").extract_first()
        financials['total_shares_outstanding_sel'] = response.xpath("(//span[@class='tv-widget-fundamentals__value apply-overflow-tooltip'])[4]/text()").extract_first()
        yield financials

Что мне нужно сделать, чтобы xpaths был совместим со scrapy?

1 Ответ

1 голос
/ 27 мая 2020

Вам необходимо соответствующим образом исправить свой XPath (используйте () и [position], чтобы выбрать то, что вам нужно):

(//span[@class='tv-widget-fundamentals__value apply-overflow-tooltip'])[2]
(//span[@class='tv-widget-fundamentals__value apply-overflow-tooltip'])[4]

Вывод: 9,334B - 57,566M

...