Python实现搜索Google Scholar论文信息的示例代码

 更新时间:2023年03月06日 09:04:59   作者:小锋学长生活大爆炸  
这篇文章主要为大家详细介绍了如何利用Python实现搜索Google Scholar论文信息的功能,文中的示例代码讲解详细,需要的可以参考一下

示例数据

示例代码

import requests
from bs4 import BeautifulSoup
from tqdm import tqdm
from pybtex.database import BibliographyData, Entry
from pybtex.database.input import bibtex
import pandas as pd
import time
import json
 
import random
 
 
def search_doi(doi):
    '''根据doi查论文详细信息'''
    url = f'https://api.crossref.org/works/{doi}'
    response = requests.get(url)
    result = None
    if response.status_code == 200:
        result = response.json()['message']
    else:
        print('Error occurred')
    return result
 
# doi = 'https://dl.acm.org/doi/abs/10.1145/3394486.3403237'
# result = search_doi(doi)
# print(f"Title: {result['title'][0]}:{result['subtitle'][0]}")
# print(f"Author(s): {', '.join(author['given'] + ' ' + author['family'] for author in result['author'])}")
# print(f"Journal: {result['container-title'][0]}")
# print(f"Publication Date: {result['published-print']['date-parts'][0][0]}")
 
 
def search_cite(atid):
    '''根据atid查cite'''
    url = f'https://scholar.google.com/scholar?q=info:{atid}:scholar.google.com/&output=cite&scirp=8&hl=zh-CN'
    resp = requests.get(url)
    soup = BeautifulSoup(resp.text, 'lxml')
    result = {}
    for item in soup.find_all('tr'):
        cith = item.find('th', class_='gs_cith').getText()
        citr = item.find('div', class_='gs_citr').getText()
        result[cith] = citr
    return result
 
# result = search_cite('_goqYZv1zjMJ')
# print(result)
 
 
 
# 更改节点配置
def change_clash_node(node_name=None):
    # Clash API的URL和密码
    url = 'http://127.0.0.1:15043/proxies/🔰国外流量'
    password = 'ee735f4e-59c6-4d60-a2ad-aabd075badb2'
    local_node_name = ['香港1-IEPL-倍率1.0', '香港2-IEPL-倍率1.0', '香港3-IEPL-倍率1.0', 
                       '台湾1-IEPL-倍率1.0', '台湾2-IEPL-倍率1.0', '台湾3-IEPL-倍率1.0',
                       '新加坡1-IEPL-倍率1.0', '新加坡2-IEPL-倍率1.0', '新加坡3-IEPL-倍率1.0'
                       ]
    node_name = node_name or random.choice(local_node_name)
    print(f'当前选择节点名称: {node_name}')
    
    headers = {'Authorization': password}
    data = {
        'name': 'Rule',
        'type': 'Selector',
        'now': node_name
    }
    response = requests.put(url, headers=headers, json=data)
    if response.status_code == 200:
        print('节点已更改为:', node_name)
    else:
        print('更改节点时出错:', response.text)
 
# 更改节点为my_node
# change_clash_node()
 
 
 
def proxy_requests(url):
    proxies = {
        'http': 'socks5://127.0.0.1:7890',
        'https': 'socks5://127.0.0.1:7890'
    }
    return requests.get(url, proxies=proxies)
 
 
def search(title='GNN', start=0):
    url = f'https://scholar.google.com/scholar?start={start}&q=allintitle:+{title}&hl=zh-CN&as_sdt=0,5'
    resp = proxy_requests(url)
    soup = BeautifulSoup(resp.text, 'lxml')
    try:
        papers_item = soup.find(id='gs_res_ccl_mid').find_all('div', class_='gs_scl')
    except:
        print(soup)
        if 'captcha-form' in soup:
            return -1
    papers_info = []
    for paper in papers_item:
        publisher = paper.find('div', class_='gs_or_ggsm').getText().split()[1].split('.')[0]
        href = paper.find('h3', class_='gs_rt').find('a').get('href')
        title = paper.find('h3', class_='gs_rt').find('a').getText()
        detail = paper.find('div', class_='gs_ri').find('div', class_='gs_a').getText()
        year = detail.split(',')[-1].strip()[:4]
        
        # atid = paper.find('h3', class_='gs_rt').find('a').get('data-clk-atid')
        # cite_info = search_cite(atid)['MLA']
        # cite_info_filter = list(filter(lambda x:x, map(lambda x:x.strip().strip('"').strip(), cite_info.strip().split('.'))))
        # author, title, publisher, year = cite_info_filter
        
        papers_info.append({'title':title, 'year':year, 'publisher':publisher, 'href':href})
    return papers_info
 
 
 
 
index_start = 0
index_end = 500
index_gap = 10
papers_store = []
bar = tqdm(total=index_end-index_start, desc=f'From {index_start} to {index_end}')
# for start in range(index_start, index_end, index_gap):
while index_start < index_end:
    try:
        papers_info = search(title='GNN', start=index_start)
        if papers_info == -1:
            print('需要验证码,更换节点后2秒内重试')
            change_clash_node()
            time.sleep(2)
            continue
        papers_store.extend(papers_info)
    except AttributeError as e:
        print(e)
        break
        
    index_start += index_gap
    bar.update(index_gap)
    bar.refresh()
    time.sleep(0.1)
bar.close()
 
df = pd.DataFrame(papers_info)
print(df)
df.to_csv('data.csv', index=False)

以上就是Python实现搜索Google Scholar论文信息的示例代码的详细内容,更多关于Python搜索Google Scholar论文信息的资料请关注脚本之家其它相关文章!

相关文章

  • python之基数排序的实现

    python之基数排序的实现

    这篇文章主要介绍了python之基数排序的实现,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • python 生成正态分布数据,并绘图和解析

    python 生成正态分布数据,并绘图和解析

    这篇文章主要介绍了python 生成正态分布数据,并绘图和解析,帮助大家更好的利用python进行数据分析,感兴趣的朋友可以了解下
    2020-12-12
  • Anaconda修改默认虚拟环境安装位置的方案分享

    Anaconda修改默认虚拟环境安装位置的方案分享

    新安装Anaconda后,在创建环境时环境自动安装在C盘,但是C盘空间有限,下面这篇文章主要给大家介绍了关于Anaconda修改默认虚拟环境安装位置的相关资料,需要的朋友可以参考下
    2023-01-01
  • python中(负数)整除和取模运算方式

    python中(负数)整除和取模运算方式

    Python中的取模运算符是%,它与其他语言中的取余符号相同,整除运算符是//,表示向下取整,在Python中,正数的取余和取模结果相同,但负数的取余和取模结果有所不同,取余运算在计算时向0方向舍弃小数位,而取模运算向负无穷方向舍弃小数位
    2024-10-10
  • Python中按指定数量分割列表字符串的两种方法

    Python中按指定数量分割列表字符串的两种方法

    处理列表数据时,有时我们需要将一个包含长字符串的列表分割成按照特定长度的小字符串的多个列表,本文主要介绍了Python中按指定数量分割列表字符串,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Python描述符descriptor使用原理解析

    Python描述符descriptor使用原理解析

    这篇文章主要介绍了Python 描述符descriptor使用原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • python退出命令是什么?详解python退出方法

    python退出命令是什么?详解python退出方法

    在本篇内容中我们给学习python编程的朋友们整理了关于python退出的命令和方法,需要的学习下。
    2018-12-12
  • pymilvus offset参数不生效解决示例

    pymilvus offset参数不生效解决示例

    这篇文章主要为大家介绍了pymilvus offset参数不生效解决示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 使用Python实现ELT统计多个服务器下所有数据表信息

    使用Python实现ELT统计多个服务器下所有数据表信息

    这篇文章主要介绍了使用Python实现ELT统计多个服务器下所有数据表信息,ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程,需要的朋友可以参考下
    2023-07-07
  • python3中替换python2中cmp函数的实现

    python3中替换python2中cmp函数的实现

    这篇文章主要介绍了python3替换python2中cmp函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08

最新评论