HEX
Server: LiteSpeed
System: Linux s1296.sgp1.mysecurecloudhost.com 4.18.0-513.11.1.lve.el8.x86_64 #1 SMP Thu Jan 18 16:21:02 UTC 2024 x86_64
User: bishwesh (1878)
PHP: 7.4.33
Disabled: NONE
Upload Files
File: /home/bishwesh/researchgate.krishnaneupane.com/main.py
from flask import Flask, jsonify, request
from bs4 import BeautifulSoup
import requests
import json

app = Flask(__name__)

@app.route('/api', methods=['GET'])
def read_root():
    name = request.args.get('name')
    print(name)
    return jsonify(scrape_researchgate_profile(profile=name))

def scrape_researchgate_profile(profile: str):
    profile_data = {
        "basic_info": {},
        "about": {},
        "co_authors": [],
        "publications": [],
    }

    url = f"https://www.researchgate.net/profile/{profile}"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36"
    }
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.content, 'html.parser')

    name_element = soup.select_one('.nova-legacy-e-text.nova-legacy-e-text--size-xxl')
    profile_data["basic_info"]["name"] = name_element.get_text(strip=True) if name_element else "Name not found"

    institution_element = soup.select_one('.nova-legacy-v-institution-item__stack-item a')
    profile_data["basic_info"]["institution"] = institution_element.get_text(strip=True) if institution_element else "Institution not found"

    department_element = soup.select_one('.nova-legacy-e-list__item.nova-legacy-v-institution-item__meta-data-item:nth-child(1)')
    profile_data["basic_info"]["department"] = department_element.get_text(strip=True) if department_element else "Department not found"

    current_position_element = soup.select_one('.nova-legacy-e-list__item.nova-legacy-v-institution-item__info-section-list-item')
    profile_data["basic_info"]["current_position"] = current_position_element.get_text(strip=True) if current_position_element else "Current position not found"

    lab_element = soup.select_one('.nova-legacy-o-stack__item .nova-legacy-e-link--theme-bare b')
    profile_data["basic_info"]["lab"] = lab_element.get_text(strip=True) if lab_element else "Lab not found"

    about_info = soup.select('.nova-legacy-c-card__body .nova-legacy-o-grid__column')
    profile_data["about"]["number_of_publications"] = about_info[0].get_text(strip=True) if about_info and len(about_info) > 0 else "Number of publications not found"
    profile_data["about"]["reads"] = about_info[1].get_text(strip=True) if about_info and len(about_info) > 1 else "Reads not found"
    profile_data["about"]["citations"] = about_info[2].get_text(strip=True) if about_info and len(about_info) > 2 else "Citations not found"
    profile_data["about"]["introduction"] = soup.select_one('.nova-legacy-o-stack__item .Linkify').get_text(strip=True) if soup.select_one('.nova-legacy-o-stack__item .Linkify') else "Introduction not found"
    profile_data["about"]["skills"] = [skill.get_text(strip=True) for skill in soup.select('.nova-legacy-l-flex__item .nova-legacy-e-badge')]

    for co_author in soup.select('.nova-legacy-c-card--spacing-xl .nova-legacy-c-card__body--spacing-inherit .nova-legacy-v-person-list-item'):
        profile_data["co_authors"].append({
            "name": co_author.select_one('.nova-legacy-v-person-list-item__align-content .nova-legacy-e-link').get_text(strip=True) if co_author.select_one('.nova-legacy-v-person-list-item__align-content .nova-legacy-e-link') else "Name not found",
            "link": co_author.select_one('.nova-legacy-l-flex__item a')['href'] if co_author.select_one('.nova-legacy-l-flex__item a') else "Link not found",
            "avatar": co_author.select_one('.nova-legacy-l-flex__item .lite-page-avatar img')['data-src'] if co_author.select_one('.nova-legacy-l-flex__item .lite-page-avatar img') else "Avatar not found",
            "current_institution": co_author.select_one('.nova-legacy-v-person-list-item__align-content li').get_text(strip=True) if co_author.select_one('.nova-legacy-v-person-list-item__align-content li') else "Current institution not found"
        })

    for publication in soup.select('#publications+ .nova-legacy-c-card--elevation-1-above .nova-legacy-o-stack__item'):
        profile_data["publications"].append({
            "title": publication.select_one('.nova-legacy-v-publication-item__title .nova-legacy-e-link--theme-bare').get_text(strip=True) if publication.select_one('.nova-legacy-v-publication-item__title .nova-legacy-e-link--theme-bare') else "Title not found",
            "date_published": publication.select_one('.nova-legacy-v-publication-item__meta-data-item span').get_text(strip=True) if publication.select_one('.nova-legacy-v-publication-item__meta-data-item span') else "Date published not found",
            "authors": [author.get_text(strip=True) for author in publication.select('.nova-legacy-v-person-inline-item__fullname')],
            "publication_type": publication.select_one('.nova-legacy-e-badge--theme-solid').get_text(strip=True) if publication.select_one('.nova-legacy-e-badge--theme-solid') else "Publication type not found",
            "description": publication.select_one('.nova-legacy-v-publication-item__description').get_text(strip=True) if publication.select_one('.nova-legacy-v-publication-item__description') else "Description not found",
            "publication_link": publication.select_one('.nova-legacy-c-button-group__item .nova-legacy-c-button')['href'] if publication.select_one('.nova-legacy-c-button-group__item .nova-legacy-c-button') else "Publication link not found",
        })

    return profile_data

if __name__ == "__main__":
    app.run(debug=True)