Эта статья научит нас очищать страницы результатов Google Scholar с помощью Node JS, используя Unirest и Cheerio.

Логотип Академии Google


Оглавление

  1. Требования
  2. Парсинг результатов Google Organic Scholar
  3. Очистка профилей Google Scholar
  4. Скрапинг результатов Google Scholar Cite
  5. Очистка профиля автора Google Scholar
  6. Вывод
  7. Дополнительные ресурсы


Требования:


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

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

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


Пользовательские агенты

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

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


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

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

  1. Он присоединился к JS
  2. Cheerio JS

Или вы можете ввести следующие команды в терминале вашего проекта, чтобы установить библиотеки:

npm i unirest
npm i cheerio
Войти в полноэкранный режим

Выйти из полноэкранного режима

Для извлечения наших данных HTML мы будем использовать Unirest JS, а для анализа данных HTML мы будем использовать Cheerio JS.


Парсинг результатов Google Organic Scholar:

Органические результаты Google Scholar

Мы будем очищать заголовок, ссылку заголовка, идентификатор, отображаемую ссылку, фрагмент и другие ссылки сайта.
Вот полный код для очистки результатов Google Organic Scholar 👇🏻:

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


const getScholarData = async() => {
try
{
const url = "

return unirest
.get(url)
.headeras({
    "User-Agent":
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36"
})
.then((response) => {
    let $ = cheerio.load(response.body);

let scholar_results = [];

$(".gs_ri").each((i,el) => {
    scholar_results.push({
    title: $(el).find(".gs_rt").text(),
    title_link: $(el).find(".gs_rt a").attr("href"),
    id: $(el).find(".gs_rt a").attr("id")
    displayed_link: $(el).find(".gs_a").text(),
    snippet: $(el).find(".gs_rs").text().replace("\n", ""),
    cited_by_count: $(el).find(".gs_nph+ a").text(),
    cited_link: " + $(el).find(".gs_nph+ a").attr("href"),
    versions_count: $(el).find("a~ a+ .gs_nph").text(),
    versions_link: $(el).find("a~ a+ .gs_nph").text() ? " + $(el).find("a~ a+ .gs_nph").attr("href") : "",
    })
})

for (let i = 0; i < scholar_results.length; i++) {
    Object.keys(scholar_results[i]).forEach(key => scholar_results[i][key] === "" || scholar_results[i][key] === undefined ? delete scholar_results[i][key] : {});  
}

console.log(scholar_results)
})
}
catch(e)
{
    console.log(e);
}
}
getScholarData();                                       
Войти в полноэкранный режим

Выйти из полноэкранного режима

Наш результат должен выглядеть так 👇🏻:

[
    {
        title: 'Use of Digital Information Resources and Services by the Students of IIT Mumbai Central Library: A Study.',
        title_link: '
        id: 'TPhPjzP8H_MJ',
        displayed_link: 'SK Gupta, S Sharma - International Journal of Information …, 2015 - search.ebscohost.com',
        snippet: "The rapid advancement in information technology has changed the resources and services of a library. Now day's libraries are not confined only to print resources and traditional library …",
        cited_by_count: 'Cited by 19',
        cited_link: '
        versions_count: 'All 5 versions',
        versions_link: '
    },
    {
        title: '[PDF][PDF] Design of Solar powered vehicle. project III, Industrial Design Center, IIT Mumbai',
        title_link: '
        id: '_w_nBYVUe8AJ',
        displayed_link: 'UA Athavankar, SR Singh - 2016 - dsource.in',
        snippet: 'The greatest problem that faces the world today is Global warming. It is more apparent here in India than anywhere else, specially Rajasthan where temperatures over the last few years …',
        cited_by_count: 'Cited by 2',
        cited_link: '
    },
    ....
Войти в полноэкранный режим

Выйти из полноэкранного режима


Очистка профилей Google Scholar

Результаты авторов Google Scholar

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

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

const getScholarProfiles = async() => {

try
{
const url = "

return unirest
.get(url)
.headeras({
    "User-Agent":
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36"
})
.then((response) => {
    let $ = cheerio.load(response.body);

let scholar_profiles = [];

$(".gsc_1usr").each((i,el) => {
    scholar_profiles.push({
    name: $(el).find(".gs_ai_name").text(),
    name_link: " + $(el).find(".gs_ai_name a").attr("href"),
    position: $(el).find(".gs_ai_aff").text(),
    email: $(el).find(".gs_ai_eml").text(),
    departments: $(el).find(".gs_ai_int").text(),
    cited_by_count: $(el).find(".gs_ai_cby").text().split(" ")[2],
    })
})

for (let i = 0; i < scholar_profiles.length; i++) {
    Object.keys(scholar_profiles[i]).forEach(key => scholar_profiles[i][key] === "" || scholar_profiles[i][key] === undefined ? delete scholar_profiles[i][key] : {});  
}

console.log(scholar_profiles)
});

}
catch(e)
{
    console.log(e);
}
}
getScholarProfiles();
Войти в полноэкранный режим

Выйти из полноэкранного режима

Наши результаты должны выглядеть так 👇🏻:


  [
    {
        name: 'Piyali Banerjee',
        name_link: '
        position: 'Postdoctoral Researcher in Physics, IIT Bombay',
        email: 'Verified email at iitb.ac.in',
        departments: 'Experimental High Energy Physics Phenomenology ',
        cited_by_count: '230769'
    },
    {
        name: 'Archana Pai',
        name_link: '
        position: 'IIT Bombay',
        email: 'Verified email at phy.iitb.ac.in',
        departments: 'Gravitational Wave Astronomy Statistical Signal Processing Multimessenger astronomy ',
        cited_by_count: '70703'
    },
    {
        name: 'Krithi Ramamritham',
        name_link: '
        position: 'Sai University, Chennai, India (retired from IIT Bombay)',
        email: 'Verified email at iitb.ac.in',
        departments: 'databases real-time systems ICT based  solutions for society ',
        cited_by_count: '23765'
    },
    ....
Enter fullscreen mode

Exit fullscreen mode



Scraping Google Scholar Cite Results

Google Scholar Cite Results<br>

The below block of code will scrape the cite result of an organic scholar search result.

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

const getData = async () => {
    try {
    const url =
        "

    return unirest
        .get(url)
        .headers({})
        .then((response) => {
        let $ = cheerio.load(response.body);

        let cite_results = [];  $("#gs_citt tr").each((i, el) => { cite_results.push({ title: $(el).find(".gs_cith").text(), фрагмент: $(el). найти(".gs_citr").text(), }); });  пусть ссылки = [];  $("#gs_citi .gs_citi").each((i, el) => { links.push({ имя: $(el).text(), ссылка: $(el).attr("href"), }); });  console.log(cite_results);  console.log(ссылки);  });  } поймать (e) { console.log(e);  } };  получить данные();                                
Войти в полноэкранный режим

Выйти из полноэкранного режима

Если вы посмотрите на целевой URL, после Информацияя использовал строку, которая представляет собой не что иное, как идентификатор, который мы получили в результате очистки Google Scholar Organic Results.
Наш результат должен выглядеть так 👇🏻:


  [
    {
        title: 'MLA',
        snippet: 'Gupta, Sanjay Kumar, and Sanjeev Sharma. "Use of Digital Information Resources and Services by the Students of IIT Mumbai Central Library: A Study." International Journal of Information Dissemination & Technology 5.1 (2015).'
    },
    {
        title: 'APA',
        snippet: 'Gupta, S. K., & Sharma, S. (2015). Use of Digital Information Resources and Services by the Students of IIT Mumbai Central Library: A Study. International Journal of Information Dissemination & Technology, 5(1).'
    },
    {
        title: 'Chicago',
        snippet: 'Gupta, Sanjay Kumar, and Sanjeev Sharma. "Use of Digital Information Resources and Services by the Students of IIT Mumbai Central Library: A Study." International Journal of Information Dissemination & Technology 5, no. 1 (2015).'
    },
    {
        title: 'Harvard',
        snippet: 'Gupta, S.K. and Sharma, S., 2015. Use of Digital Information Resources and Services by the Students of IIT Mumbai Central Library: A Study. International Journal of Information Dissemination & Technology, 5(1).'
    },
    {
        title: 'Vancouver',
        snippet: 'Gupta SK, Sharma S. Use of Digital Information Resources and Services by the Students of IIT Mumbai Central Library: A Study. International Journal of Information Dissemination & Technology. 2015 Jan 1;5(1).'
    }
  ]
  [
    {
        name: 'BibTeX',
        link: '
    },
    {
        name: 'EndNote',
        link: '
    },
    {
        name: 'RefMan',
        link: '
    },
    {
        name: 'RefWorks',
        link: '
    }
  ]

Войти в полноэкранный режим

Выйти из полноэкранного режима


Очистка профиля автора Google Scholar

Профиль автора Академии Google

Теперь мы будем работать над очисткой профиля автора Google Scholar.
Сначала мы очистим имя автора, должность, адрес электронной почты и отдел.

Профиль Академии Google

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

const getAuthorProfileData = async () => {
try {
    const url = "

    return unirest.get(url)
    .headers({
    "User-Agent":
    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
    })
    .then((response) => {
    const $ = cheerio.load(response.body)                                
    let author_results = {};

    author_results.name = $("#gsc_prf_in").text();
    author_results.position = $("#gsc_prf_inw+ .gsc_prf_il").text();
    author_results.email = $("#gsc_prf_ivh").text();
    author_results.departments = $("#gsc_prf_int").text();

    console.log(author_results);
})
} catch (e) {
    console.log(e);
}
};
getAuthorProfileData();
Войти в полноэкранный режим

Выйти из полноэкранного режима

Наш результат должен выглядеть так 👇🏻:

  {
    name: 'Piyali Banerjee',
    position: 'Postdoctoral Researcher in Physics, IIT Bombay',
    email: 'Verified email at iitb.ac.in',
    departments: 'Experimental High Energy PhysicsPhenomenology'
  }

Войти в полноэкранный режим

Выйти из полноэкранного режима

Теперь мы соберем статьи, написанные автором, из его профиля. Статьи профиля автора Google Scholar

$(".gsc_a_t").each((i,el) => {
    articles.push({
        title: $(el).find(".gsc_a_at").text(),
        link: " + $(el).find(".gsc_a_at a").attr("href"),
        authors: $(el).find(".gsc_a_at+ .gs_gray").text(),
        publication: $(el).find(".gs_gray+ .gs_gray").text()
    })
}) 

for (let i = 0; i < articles.length; i++) {
    Object.keys(articles[i]).forEach((key) =>
        articles[i][key] === "" || articles[i][key] === undefined
        ? delete articles[i][key]
        : {}
    );
    }
Войти в полноэкранный режим

Выйти из полноэкранного режима

И результаты должны выглядеть так:

 [
  {
    title: 'Observation of a new particle in the search for the Standard Model Higgs boson with the ATLAS detector at the LHC',
    link: '
    authors: 'G Aad, T Abajyan, B Abbott, J Abdallah, SA Khalek, AA Abdelalim, ...',
    publication: 'Physics Letters B 716 (1), 1-29, 2012'
  },
  {
    title: 'The ATLAS simulation infrastructure',
    link: '
    authors: 'G Aad, B Abbott, J Abdallah, AA Abdelalim, A Abdesselam, B Abi, ...',
    publication: 'The European Physical Journal C 70 (3), 823-874, 2010'
  },

Enter fullscreen mode

Exit fullscreen mode

Now, we will scrape the Google Scholar Author profile Cited By results in which we will cover citation, h-index, and the i10-index since 2017.Google Scholar cited by resultsHere is the code 👇🏻:

let cited_by = {};

cited_by.table = [];  процитировано_по.таблице[0] знак равно  процитировано_по.таблице[0].цитаты = {};  процитировано_по.таблице[0].citations.all = $("tr:nth-child(1) .gsc_rsb_sc1+ .gsc_rsb_std").text();  процитировано_по.таблице[0].citations.since_2017 = $("tr:nth-child(1) .gsc_rsb_std+ .gsc_rsb_std").text();  процитировано_по.таблице[1] знак равно  процитировано_по.таблице[1].h_index = {};  процитировано_по.таблице[1].h_index.all = $("tr:nth-child(2) .gsc_rsb_sc1+ .gsc_rsb_std").text();  процитировано_по.таблице[1].h_index.since_2017 = $("tr:nth-child(2) .gsc_rsb_std+ .gsc_rsb_std").text();  процитировано_по.таблице[2] знак равно  процитировано_по.таблице[2].i_index = {};  процитировано_по.таблице[2].i_index.all = $("tr~ tr+ tr .gsc_rsb_sc1+ .gsc_rsb_std").text();  процитировано_по.таблице[2].i_index.since_2017 = $("tr~ tr+ tr .gsc_rsb_std+ .gsc_rsb_std").text();
Войти в полноэкранный режим

Выйти из полноэкранного режима

И результат для него будет выглядеть так 👇🏻:

{
  [
    { citations: { all: '230769', since_2017: '105070' } },
    { h_index: { all: '185', since_2017: '133' } },
    { i_index: { all: '1154', since_2017: '706' } }
  ]
}
Войти в полноэкранный режим

Выйти из полноэкранного режима

Вот полный код для полной очистки страницы профиля автора Google 👇🏻:

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

    const getAuthorProfileData = async () => {
    try {
    const url = "

    return unirest
    .get(url)
    .headers({
        "User-Agent":
            "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
    })
    .then((response) => {
        let $ = cheerio.load(response.body);

        let author_results = {};
        let articles = {};

        author_results.name = $("#gsc_prf_in").text();
        author_results.position = $("#gsc_prf_inw+ .gsc_prf_il").text();
        author_results.email = $("#gsc_prf_ivh").text();
        author_results.departments = $("#gsc_prf_int").text();

        $("#gsc_a_b .gsc_a_t").each((i, el) => {
            articles.push({
                title: $(el).find(".gsc_a_at").text(),
                link: " + $(el).find(".gsc_a_at").attr("href"),
                authors: $(el).find(".gsc_a_at+ .gs_gray").text(),
                publication: $(el).find(".gs_gray+ .gs_gray").text()
            })
        })

        for (let i = 0; i < articles.length; i++) {
            Object.keys(articles[i]).forEach((key) =>
                articles[i][key] === "" || articles[i][key] === undefined
                    ? delete articles[i][key]
                    : {}
            );
        }

        let cited_by = {};

        cited_by.table = [];
        cited_by.table[0] = {};
        cited_by.table[0].citations = {};
        cited_by.table[0].citations.all = $("tr:nth-child(1) .gsc_rsb_sc1+ .gsc_rsb_std").text();
        cited_by.table[0].citations.since_2017 = $("tr:nth-child(1) .gsc_rsb_std+ .gsc_rsb_std").text();
        cited_by.table[1] = {};
        cited_by.table[1].h_index = {};
        cited_by.table[1].h_index.all = $("tr:nth-child(2) .gsc_rsb_sc1+ .gsc_rsb_std").text();
        cited_by.table[1].h_index.since_2017 = $("tr:nth-child(2) .gsc_rsb_std+ .gsc_rsb_std").text();
        cited_by.table[2] = {};
        cited_by.table[2].i_index = {};
        cited_by.table[2].i_index.all = $("tr~ tr+ tr .gsc_rsb_sc1+ .gsc_rsb_std").text();
        cited_by.table[2].i_index.since_2017 = $("tr~ tr+ tr .gsc_rsb_std+ .gsc_rsb_std").text();

        console.log(author_results);
        console.log(articles);
        console.log(cited_by.table);
    })

    } catch (e) {
    console.log(e);
    }
    };
    getAuthorProfileData();
Войти в полноэкранный режим

Выйти из полноэкранного режима


Вывод:

В этом руководстве мы научились очищать результаты Google Scholar с помощью Node JS. Не стесняйтесь Сообщи мне если я что-то пропустил или что-то вам нужно разъяснение. Следуй за мной на Твиттер Спасибо за чтение!


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

  1. Очистить результаты органического поиска Google
  2. Очистить результаты изображений Google
  3. Очистить результаты новостей Google
  4. Собрать отзывы Google Maps


Автор:

Меня зовут Даршан, и я основатель serpdog.io.