Использование Node JS для парсинга веб-страниц Google Finance

Использование Node JS для парсинга веб-страниц Google Finance

14 января 2023 г.

Введение

Финансовая страница Google – это страница с богатыми данными, позволяющая трейдерам и инвесторам получать доступ к международным биржам, финансовым новостям в режиме реального времени и финансовому анализу, чтобы быть в курсе текущей ситуации на рынке.

Этот тип веб-сайта с много данных всегда имеет несколько преимуществ:

  1. Он помогает трейдерам и инвесторам анализировать цены.
  2. Финансовые данные компании могут помочь людям решить, какие акции покупать в будущем.
  3. Технические индикаторы и анализ используются для изучения тенденций прошлых цен на акции и прогнозирования будущих тенденций цен на акции.

Web Scraping Google Finance With Node JS 1

Требования:

Веб-анализ с помощью селекторов CSS

Поиск тегов в HTML-файлах — это не только сложная задача, но и трудоемкий процесс. Лучше использовать гаджет CSS-селекторов, чтобы выбрать идеальные теги, которые упростят поиск в Интернете.

Этот гаджет может помочь вам создать идеальный селектор CSS для ваших нужд. Вот ссылка на руководство, которое научит вас использовать этот гаджет для выбора лучших селекторов CSS в соответствии с вашими потребностями.

Агенты пользователя

User-Agent используется для идентификации приложения, операционной системы, поставщика и версии запрашивающего пользовательского агента, что может помочь при ложном посещении Google под видом реального пользователя.

Вы также можете чередовать пользовательские агенты, подробнее об этом читайте в этой статье: Как подделывать и чередовать пользовательские агенты с помощью Python 3.

Если вы хотите дополнительно защитить свой IP-адрес от блокировки Google, вы можете попробовать эти 10 советов, которых следует избегать. получение блокировки при очистке данных Google.

Установить библиотеки

Чтобы начать парсинг результатов Google Финансов, нам нужно установить некоторые библиотеки NPM, чтобы мы могли двигаться дальше.

  1. JS-узел
  2. Юнирест
  3. Чирио

Поэтому, прежде чем начать, мы должны убедиться, что мы настроили наш проект Node JS и установили оба пакета - Unirest JS и Cheerio JS. Вы можете установить оба пакета по приведенной выше ссылке.

Цель:

Web Scraping Google Finance With Node JS 2

Процесс:

Давайте начнем парсинг страницы Google Finance. Мы будем использовать Unirest JS для извлечения необработанных данных HTML и анализа этих данных с помощью Cheerio JS.

Скопируйте эту ссылку и откройте ее в своем браузере, чтобы мы могли начать выбирать теги для анализа необходимых данных.

https://www.google.com/finance/?hl=en

Теперь мы сделаем запрос GET к нашему целевому URL-адресу, используя Unirest JS для извлечения данных HTML.

  const unirest = require("unirest");
    const cheerio = require("cheerio");

    const getFinanceData = async () => {

    const url = "https://www.google.com/finance/?hl=en";
    const response = await unirest
    .get(url)
    .header({"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"})
    const $ = cheerio.load(response.body);  

Пошаговое объяснение:

  1. В шестой строке мы сделали запрос GET к целевому URL.
  2. В следующей строке мы передали User-Agent в качестве заголовка с URL-адресом, чтобы наш бот мог имитировать реального обычного пользователя.
  3. Затем мы загружаем ответ в переменную экземпляра cheerio.

Теперь мы подготовим наш синтаксический анализатор, выполнив поиск тегов с помощью гаджета выбора CSS, указанного выше в разделе Требования. Скрапинг веб-страниц Google Финансы с помощью Node JS 3

Как видите, указанные выше вкладки находятся под тегом .H8Chl .SxcTic. Итак, его парсер будет выглядеть так:

 let interested_top = [];

    $(".H8Ch1 .SxcTic").each((i,el) => {
    interested_results.push({
    stock_name: $(el).find(".ZvmM7").text(),
    price: $(el).find(".YMlKec").text(),
    change_in_price: $(el).find(".P2Luy").text(),
    change_in_percentage: $(el).find(".JwB6zf").text()
        })
    })         
interested_results.push({     stock_name: $(el).find(".ZvmM7").text(),     price: $(el).find(".YMlKec").text(),     change_in_price: $(el).find(".P2Luy").text(),     change_in_percentage: $(el).find(".JwB6zf").text()         })     })`                                  

Теперь мы проанализируем результаты финансовых новостей.

Web Scraping Google Finance With Node JS 4

Итак, мы нашли тег для результатов финансовых новостей. Вот как мы это анализируем:

    let financial_news = [];

    $(".yY3Lee").each((i,el) => {
    financial_news.push({
    title: $(el).find(".Yfwt5").text(),
    link: $(el).find("a").attr("href"),
    source: $(el).find(".sfyJob").text(),
    time: $(el).find(".Adak").text()
        })
    })

Точно так же, если мы будем следовать тому же процессу для поиска тегов других блоков и вкладок, весь наш синтаксический анализатор будет выглядеть следующим образом:

    let interested_top = [];

    $(".H8Ch1 .SxcTic").each((i,el) => {
    interested_top.push({
    stock_name: $(el).find(".ZvmM7").text(),
    price: $(el).find(".YMlKec").text(),
    change_in_price: $(el).find(".P2Luy").text(),
    change_in_percentage: $(el).find(".JwB6zf").text()
        })
    })

    let financial_news = [];

    //sometimes the scraper may return you empty news, so you have to
    //run the program once again
    $(".yY3Lee").each((i,el) => {
    financial_news.push({
    title: $(el).find(".Yfwt5").text(),
    link: $(el).find("a").attr("href"),
    source: $(el).find(".sfyJob").text(),
    time: $(el).find(".Adak").text()
        })
    })

    let market_trends = [];

    $(".gR2U6").each((i,el) => {
    market_trends[i] = $(el).text();
    })

    let interested_bottom = [];

    $(".tOzDHb").each((i,el) => {
    interested_bottom.push({
    stock_name: $(el).find(".RwFyvf").text(),
    price: $(el).find(".YMlKec").text(),
    change_in_percentage: $(el).find(".JwB6zf").text()
        })
    })

    let calendar_results = [];

    $(".kQQz8e").each((i,el) => {
    calendar_results.push({
    stock_name: $(el).find(".qNqwJf").text(),
    date_and_time: $(el).find(".fbt0Xc").text(),
    link: $(el).find("a").attr("href")
        })
    })

    let most_followed_on_google = [];

    $(".NaLFgc").each((i,el) => {
    most_followed_on_google.push({
    stock_name: $(el).find(".TwnKPb").text(),
    following: $(el).find(".Iap8Fc").text().replace(" following", ""),
    change_in_percentage: $(el).find(".JwB6zf").text(),
    link: $(el).find("a").attr("href")
        })
    })

    console.log("interested_top:", interested_top)
    console.log("financial_news:" ,financial_news)
    console.log("market_trends:", market_trends)
    console.log("interested_bottom:", interested_bottom)
    console.log("calendar_results:", calendar_results)
    console.log("most_followed_on_google:", most_followed_on_google) 

И вот результаты:

 interested_top: [
    {
        stock_name: 'BSE Ltd',
        price: '₹586.75',
        change_in_price: '-₹14.25',
        change_in_percentage: '2.37%'
    },
    {
        stock_name: 'ITC Ltd',
        price: '₹360.70',
        change_in_price: '+₹7.20',
        change_in_percentage: '2.04%'
    },
    {
        stock_name: 'S&P 500',
        price: '3,766.18',
        change_in_price: '-61.93',
        change_in_percentage: '1.62%'
    },
    {
        stock_name: 'Dow Jones Industrial Average',
        price: '32,648.88',
        change_in_price: '-511.95',
        change_in_percentage: '1.54%'
    },
    {
        stock_name: 'NuStar Energy L.P.',
        price: '$16.27',
        change_in_price: '-$0.22',
        change_in_percentage: '1.33%'
    },
    {
        stock_name: 'Reliance Industries Ltd',
        price: '₹2,593.70',
        change_in_price: '-₹12.90',
        change_in_percentage: '0.49%'
    }
    ]
    financial_news: [
    {
        title: 'Why has Facebook parent Meta fired employees',
        link: 'https://indianexpress.com/article/explained/meta-to-fire-11000-people-why-facebook-parent-is-cutting-jobs-what-next-8259364/',
        source: 'The Indian Express',
        time: '4 hours ago'
    },
    {
        title: `"Just Killed It": Elon Musk On Twitter's 'Official' Tag, Hours After Launch`,
        link: 'https://www.ndtv.com/world-news/twitter-will-do-lots-of-dumb-things-elon-musk-after-official-tag-vanishes-3505913',
        source: 'NDTV.com',
        time: '30 minutes ago'
    },
    {
        title: 'Tata Motors Q2 Results: Firm sees higher-than-expected net loss of ₹945 cr; n' +
        'revenue jumps 30% | Mint',
        link: 'https://www.livemint.com/companies/company-results/tata-motors-q2-results-firm-sees-higher-than-expected-net-loss-of-rs-945-cr-revenue-jumps-30-11667983557507.html',
        source: 'Mint',
        time: '8 hours ago'
    },
    {
        title: "Govt to sell SUUTI's 1.55% stake in Axis Bank via OFS on November 10-11",
        link: 'https://www.moneycontrol.com/news/business/govt-to-sell-1-5-stake-in-axis-bank-via-ofs-on-nov-10-11-9484291.html',
        source: 'Moneycontrol',
        time: '3 hours ago'
    },
    {
        title: 'Large and mega deals dry up for TCS, Infosys, Wipro, HCL Tech',
        link: 'https://www.moneycontrol.com/news/business/large-and-mega-deals-dry-up-for-tcs-infosys-wipro-hcl-tech-9474901.html',
        source: 'Moneycontrol',
        time: '14 hours ago'
    },
    {
        title: 'HRtech platform Keka raises $57M in Series A round',
        link: 'https://yourstory.com/2022/11/hrtech-platform-keka-raises-series-a-westbridge-capital',
        source: 'YourStory',
        time: '13 hours ago'
    },
    {
        title: 'Mobile plans of Amazon Prime, Hotstar, Netflix and others: How much they n' +
        'cost, benefits and other details',
        link: 'https://www.gadgetsnow.com/slideshows/mobile-plans-of-amazon-prime-hotstar-netflix-and-others-how-much-they-cost-benefits-and-other-details/photolist/95386786.cms',
        source: 'Gadgets Now',
        time: '16 hours ago'
    },
    {
        title: 'Royal Enfield at EICMA 2022',
        link: 'https://www.youtube.com/watch?v=V-CvJs4ZZVU',
        source: 'YouTube',
        time: '1 day ago'
    },
    {
        title: 'In an interaction with Yash Bhuva, Marketing Head, Sheetal Cool Products Ltd',
        link: 'https://www.dsij.in/dsijarticledetail/in-an-interaction-with-yash-bhuva-marketing-head-sheetal-cool-products-ltd-27207-1',
        source: 'Dalal Street',
        time: '1 day ago'
    }
    ]
    market_trends: [ 'Market indexes', 'Climate leaders', 'Crypto', 'Currencies' ]
    interested_bottom: [
    {
        stock_name: 'BSE SENSEX',
        price: '61,033.55',
        change_in_percentage: '0.25%'
    },
    {
        stock_name: 'NIFTY 50',
        price: '18,157.00',
        change_in_percentage: '0.25%'
    },
    {
        stock_name: 'Dow Jones Industrial Average',
        price: '32,648.88',
        change_in_percentage: '1.54%'
    },
    {
        stock_name: 'BSE Ltd',
        price: '₹586.75',
        change_in_percentage: '2.37%'
    },
    {
        stock_name: 'S&P 500',
        price: '3,766.18',
        change_in_percentage: '1.62%'
    },
    {
        stock_name: 'Reliance Industries Ltd',
        price: '₹2,593.70',
        change_in_percentage: '0.49%'
    },
    {
        stock_name: 'Yes Bank Limited',
        price: '₹16.55',
        change_in_percentage: '0.00%'
    },
    {
        stock_name: 'State Bank of India',
        price: '₹614.60',
        change_in_percentage: '0.073%'
    },
    {
        stock_name: 'ITC Ltd',
        price: '₹360.70',
        change_in_percentage: '2.04%'
    },
    {
        stock_name: 'NuStar Energy L.P.',
        price: '$16.27',
        change_in_percentage: '1.33%'
    },
    {
        stock_name: 'Mahindra And Mahindra Ltd',
        price: '₹1,334.70',
        change_in_percentage: '1.23%'
    },
    {
        stock_name: 'Future Retail Ltd',
        price: '₹3.35',
        change_in_percentage: '4.69%'
    },
    {
        stock_name: 'Vodafone Idea Ltd',
        price: '₹8.50',
        change_in_percentage: '1.80%'
    },
    {
        stock_name: 'OFS Capital Corp',
        price: '$10.48',
        change_in_percentage: '0.73%'
    },
    { stock_name: 'VIX', price: '26.13', change_in_percentage: '2.31%' },
    {
        stock_name: 'NCC Ltd',
        price: '₹72.05',
        change_in_percentage: '0.14%'
    },
    {
        stock_name: 'Indusind Bank Ltd',
        price: '₹1,149.00',
        change_in_percentage: '0.42%'
    },
    {
        stock_name: 'Nasdaq Composite',
        price: '10,391.74',
        change_in_percentage: '2.11%'
    }
    ]
    calendar_results: [
    {
        stock_name: 'PI Industries Ltd.',
        date_and_time: 'Nov 9, 2022, 2:30 PM',
        link: 'https://www.google.com/finance/quote/PIIND:NSE'
    },
    {
        stock_name: 'Tata Motors',
        date_and_time: 'Nov 9, 2022, 6:30 PM',
        link: 'https://www.google.com/finance/quote/TATAMOTORS:NSE'
    },
    {
        stock_name: 'Occidental Petroleum',
        date_and_time: 'Nov 9, 2022, 11:30 PM',
        link: 'https://www.google.com/finance/quote/OXY:NYSE'
    },
    {
        stock_name: 'Adani Green Energy',
        date_and_time: 'Nov 10, 2022, 12:08 PM',
        link: 'https://www.google.com/finance/quote/ADANIGREEN:NSE'
    },
    {
        stock_name: 'Hindalco Industries',
        date_and_time: 'Nov 11, 2022, 4:00 PM',
        link: 'https://www.google.com/finance/quote/HINDALCO:NSE'
    },
    {
        stock_name: 'Zomato',
        date_and_time: 'Nov 11, 2022, 5:00 PM',
        link: 'https://www.google.com/finance/quote/ZOMATO:NSE'
    }
    ]
    most_followed_on_google: [
    {
        stock_name: 'Reliance Industries Ltd',
        following: '306K',
        change_in_percentage: '0.49%',
        link: 'https://www.google.com/finance/quote/RELIANCE:NSE'
    },
    {
        stock_name: 'State Bank of India',
        following: '272K',
        change_in_percentage: '0.07%',
        link: 'https://www.google.com/finance/quote/SBIN:NSE'
    },
    {
        stock_name: 'Yes Bank Limited',
        following: '228K',
        change_in_percentage: '0.00%',
        link: 'https://www.google.com/finance/quote/YESBANK:NSE'
    },
    {
        stock_name: 'Tata Motors Limited Fully Paid Ord. Shrs',
        following: '197K',
        change_in_percentage: '0.44%',
        link: 'https://www.google.com/finance/quote/TATAMOTORS:NSE'
    },
    {
        stock_name: 'Infosys Ltd',
        following: '164K',
        change_in_percentage: '0.14%',
        link: 'https://www.google.com/finance/quote/INFY:NSE'
    },
    {
        stock_name: 'Tata Consultancy Services Limited',
        following: '156K',
        change_in_percentage: '0.73%',
        link: 'https://www.google.com/finance/quote/TCS:NSE'
    }
    ]

Вот полный код:

  const unirest = require("unirest");
    const cheerio = require("cheerio");

    const getFinanceData = async () => {
        const url = "https://www.google.com/finance/?hl=en";


        const response = await unirest
        .get(url)
        .header({"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"})


        const $ = cheerio.load(response.body);


        let interested_top = [];
        $(".H8Ch1 .SxcTic").each((i,el) => {
        interested_top.push({
            stock_name: $(el).find(".ZvmM7").text(),
            price: $(el).find(".YMlKec").text(),
            change_in_price: $(el).find(".P2Luy").text(),
            change_in_percentage: $(el).find(".JwB6zf").text()
        })
        })

        let financial_news = [];
        $(".yY3Lee").each((i,el) => {
        financial_news.push({
            title: $(el).find(".Yfwt5").text(),
            link: $(el).find("a").attr("href"),
            source: $(el).find(".sfyJob").text(),
            time: $(el).find(".Adak").text()
        })
        })

        let market_trends = [];

        $(".gR2U6").each((i,el) => {
        market_trends[i] = $(el).text();
        })

        let interested_bottom = [];

        $(".tOzDHb").each((i,el) => {
        interested_bottom.push({
            stock_name: $(el).find(".RwFyvf").text(),
            price: $(el).find(".YMlKec").text(),
            change_in_percentage: $(el).find(".JwB6zf").text()
        })
        })

        let calendar_results = [];

        $(".kQQz8e").each((i,el) => {
        calendar_results.push({
            stock_name: $(el).find(".qNqwJf").text(),
            date_and_time: $(el).find(".fbt0Xc").text(),
            link: $(el).find("a")?.attr("href").replace(".","https://www.google.com/finance")
        })
        })

        let most_followed_on_google = [];

        $(".NaLFgc").each((i,el) => {
        most_followed_on_google.push({
            stock_name: $(el).find(".TwnKPb").text(),
            following: $(el).find(".Iap8Fc")?.text().replace(" following", ""),
            change_in_percentage: $(el).find(".JwB6zf").text(),
            link: $(el)?.attr("href").replace(".","https://www.google.com/finance")
        })
        })

        console.log("interested_top:", interested_top)
        console.log("financial_news:" ,financial_news)
        console.log("market_trends:", market_trends)
        console.log("interested_bottom:", interested_bottom)
        console.log("calendar_results:", calendar_results)
        console.log("most_followed_on_google:", most_followed_on_google)

    };

    getFinanceData();

Вывод:

В этом руководстве мы узнали, почему парсинг фондового рынка важен, каковы преимущества этих данных и обсудили, как мы можем их парсить с помощью Node JS.

Не стесняйтесь сообщить мне, если я что-то пропустил. Подпишитесь на меня в Твиттере. Спасибо за прочтение!

Дополнительные ресурсы

  1. Скрапинг веб-страниц Google с помощью Node JS: полное руководство
  2. Скрапинг Google без блокировки
  3. Очистить результаты обычного поиска Google
  4. Очистить результаты Google Покупок
  5. Очистить отзывы Google Карт

Также опубликовано здесь


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE