精华内容
下载资源
问答
  • 【kimol君的无聊小发明】—用python论文下载器

    万次阅读 多人点赞 2021-01-05 19:22:10
    【kimol君的无聊小发明】—用python论文下载器前言一、代码分析1. 搜索论文2. 下载论文二、完整代码写在最后 前言 某个夜深人静的夜晚,夜微凉风微扬,月光照进我的书房~ 当我打开文件夹以回顾往事之余,惊现许多...

    【kimol君的无聊小发明】—用python写论文下载器

    前言

    某个夜深人静的夜晚,夜微凉风微扬,月光照进我的书房~
    当我打开文件夹以回顾往事之余,惊现许多看似杂乱的无聊代码。我拍腿正坐,一个想法油然而生:“生活已然很无聊,不如再无聊些叭”。
    于是,我决定开一个专题,便称之为kimol君的无聊小发明
    妙…啊~~~

    一点点题外话:首先跟大家伙道个歉,由于kimol君最近一直忙着毕业的相关事情,距上一次更博已经过去10天有余,心中深感惭愧(手动捂脸)~

    在科研学习的过程中,我们难免需要查询相关的文献资料,而想必很多小伙伴都知道SCI-HUB,此乃一大神器,它可以帮助我们搜索相关论文并下载其原文。可以说,SCI-HUB造福了众多科研人员,用起来也是“美滋滋”。

    在这里插入图片描述
    然而,当师姐告诉我:“xx,可以帮我下载几篇文献嘛?”。乐心助人的我自当是满口答应了,心想:“这种小事就交给我叭~”

    于是乎,我收到了一个excel文档,66篇论文的列表安静地趟在里面(此刻心中碎碎念:“这尼玛,是几篇嘛…”)。我粗略算了一下,复制、粘贴、下载,一套流程走下来,每篇论文少说也得30秒,66篇的话…啊,这不能忍!

    很显然,一篇一篇的下载,不是我的风格。所以,我决定写一个论文下载器助我前行。

    在这里插入图片描述

    一、代码分析

    代码分析的详细思路跟以往依旧如此雷同,逃不过的还是:抓包分析->模拟请求->代码整合。由于一会儿kimol君还得去搬砖,今天就不详细展开了😇。

    1. 搜索论文

    通过论文的URL、PMID、DOI号或者论文标题等搜索到对应的论文,并通过bs4库找出PDF原文的链接地址,代码如下:

    def search_article(artName):
        '''
        搜索论文
        ---------------
        输入:论文名
        ---------------
        输出:搜索结果(如果没有返回"",否则返回PDF链接)
        '''
        url = 'https://www.sci-hub.ren/'
        headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0',
                   'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
                   'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
                   'Accept-Encoding':'gzip, deflate, br',
                   'Content-Type':'application/x-www-form-urlencoded',
                   'Content-Length':'123',
                   'Origin':'https://www.sci-hub.ren',
                   'Connection':'keep-alive',
                   'Upgrade-Insecure-Requests':'1'}
        data = {'sci-hub-plugin-check':'',
                'request':artName}
        res = requests.post(url, headers=headers, data=data)
        html = res.text
        soup = BeautifulSoup(html, 'html.parser')
        iframe = soup.find(id='pdf')
        if iframe == None: # 未找到相应文章
            return ''
        else:
            downUrl = iframe['src']
            if 'http' not in downUrl:
                downUrl = 'https:'+downUrl
            return downUrl
    

    2. 下载论文

    得到了论文的链接地址之后,只需要通过requests发送一个请求,即可将其下载:

    def download_article(downUrl):
        '''
        根据论文链接下载文章
        ----------------------
        输入:论文链接
        ----------------------
        输出:PDF文件二进制
        '''
        headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0',
                   'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
                   'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
                   'Accept-Encoding':'gzip, deflate, br',
                   'Connection':'keep-alive',
                   'Upgrade-Insecure-Requests':'1'}
        res = requests.get(downUrl, headers=headers)
        return res.content
    

    二、完整代码

    将上述两个函数整合之后,我的完整代码如下:

    # -*- coding: utf-8 -*-
    """
    Created on Tue Jan  5 16:32:22 2021
    
    @author: kimol_love
    """
    import os
    import time
    import requests
    from bs4 import BeautifulSoup
    
    def search_article(artName):
        '''
        搜索论文
        ---------------
        输入:论文名
        ---------------
        输出:搜索结果(如果没有返回"",否则返回PDF链接)
        '''
        url = 'https://www.sci-hub.ren/'
        headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0',
                   'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
                   'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
                   'Accept-Encoding':'gzip, deflate, br',
                   'Content-Type':'application/x-www-form-urlencoded',
                   'Content-Length':'123',
                   'Origin':'https://www.sci-hub.ren',
                   'Connection':'keep-alive',
                   'Upgrade-Insecure-Requests':'1'}
        data = {'sci-hub-plugin-check':'',
                'request':artName}
        res = requests.post(url, headers=headers, data=data)
        html = res.text
        soup = BeautifulSoup(html, 'html.parser')
        iframe = soup.find(id='pdf')
        if iframe == None: # 未找到相应文章
            return ''
        else:
            downUrl = iframe['src']
            if 'http' not in downUrl:
                downUrl = 'https:'+downUrl
            return downUrl
            
    def download_article(downUrl):
        '''
        根据论文链接下载文章
        ----------------------
        输入:论文链接
        ----------------------
        输出:PDF文件二进制
        '''
        headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0',
                   'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
                   'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
                   'Accept-Encoding':'gzip, deflate, br',
                   'Connection':'keep-alive',
                   'Upgrade-Insecure-Requests':'1'}
        res = requests.get(downUrl, headers=headers)
        return res.content
    
    def welcome():
        '''
        欢迎界面
        '''
        os.system('cls')
        title = '''
                   _____  _____ _____      _    _ _    _ ____  
                  / ____|/ ____|_   _|    | |  | | |  | |  _ \ 
                 | (___ | |      | |______| |__| | |  | | |_) |
                  \___ \| |      | |______|  __  | |  | |  _ < 
                  ____) | |____ _| |_     | |  | | |__| | |_) |
                 |_____/ \_____|_____|    |_|  |_|\____/|____/
                    
    
                '''
        print(title)
        
    if __name__ == '__main__':
        while True:
            welcome()
            request = input('请输入URL、PMID、DOI或者论文标题:')
            print('搜索中...')
            downUrl = search_article(request)
            if downUrl == '':
                print('未找到相关论文,请重新搜索!')
            else:
                print('论文链接:%s'%downUrl)
                print('下载中...')
                pdf = download_article(downUrl)
                with open('%s.pdf'%request, 'wb') as f:
                    f.write(pdf)
                print('---下载完成---')
            time.sleep(0.8)
    

    不出所料,代码一跑,我便轻松完成了师姐交给我的任务,不香嘛?

    写在最后

    当然,我的代码仅供参考,小伙伴们完全可以根据自己的需要进行相应的调整和改动,这样才能更多地发挥其价值。

    我是kimol君,咋们下次再会~
    在这里插入图片描述
    创作不易,大侠请留步… 动起可爱的双手,来个赞再走呗 (๑◕ܫ←๑)

    展开全文
  • 我已经修复了它的错误,并在论文“通过快速搜索并找到密度峰进行聚类”中重现了Alex Rodriguez和Alessandro Laio的出色工作。 亚历克斯·罗德里格斯(Alex Rodriguez)和亚历山德罗·莱奥(Alessandro Laio)的...
  • 使用Pytorch实现搜索MobileNetV3论文
  • 实现论文Auto-DeepLab分层神经架构搜索语义图像分割
  • 使用 Python 开发的基于 NLP 技术, 自动化提取论文仓库核心内容搜索服务,以便大家快速定位对自己有用的论文
  • Python爬取CNKI论文信息

    千次阅读 2019-11-04 14:26:18
    Python爬取CNKI论文信息 记第一次爬虫实践,拜读了几篇高质量的文章后,自己动手写点东西。 使用Python爬取关键词下的论文信息:标题、链接地址、摘要、出版单位、论文类型、出版年份、下载次数、引用次数。以上信息...

    Python爬取CNKI论文信息

    记第一次爬虫实践,拜读了几篇高质量的文章后,自己动手写点东西。
    使用Python爬取关键词下的论文信息:标题、链接地址、摘要、出版单位、论文类型、出版年份、下载次数、引用次数。以上信息存放在Excel表格中。
    笔者使用的链接的接口是:知识搜索 http://search.cnki.net/SearchFruitless.aspx
    网上给出的其他接口有:远见搜索—站得更高,看得更远! http://yuanjian.cnki.com.cn/
    CNKI接口图
    具体代码如下:

    #!/usr/bin/python3
    # -*- coding: utf-8 -*- 
    import requests
    from bs4 import BeautifulSoup
    from openpyxl import workbook  # 写入Excel表所用
    #from openpyxl import load_workbook  # 读取Excel表所用
    
    
    if __name__=="__main__":
        #  创建Excel表并写入数据
        ws = []  # 全局工作表对象
        wb = workbook.Workbook()  # 创建Excel对象
        ws = wb.active  # 获取当前正在操作的表对象
        ws.append(['标题名', '链接地址', '摘要', '单位—类型—年份—下载次数-被引次数'])     # 往表中写入标题行,以列表形式写入!
    
    
        keywords='移动通信' ### 查询的主题 ,引号内容根据需要修改
        target='http://search.cnki.net/search.aspx?q='+str(keywords)+'&rank=relevant&cluster=all&val=CJFDTOTAL&p={}'
        user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'
        headers = {'User-Agent':user_agent}
        for i in range(10):
            i=i*15 #每页有15篇论文
            target=target.format(i) #翻页,是在p={}中修改页数链接
            req=requests.get(url=target)
            html=req.text
            html=html.replace('<br>',' ').replace('<br/>',' ').replace('/>','>')
            bf=BeautifulSoup(html,"html.parser")
            texts=bf.find('div',class_='articles')#查看页面对应的审查元素,标签为articles
            texts_div=texts.find_all('div',class_='wz_content')#查看页面对应的审查元素,标签为wz_content
            for item in texts_div:
                item_name=item.find('a').text #标题
                item_href=item.find('a')['href']#链接网址
                item_abstract = item.find('span', class_='text').text#摘要
                item_refer = item.find('span', class_='year-count').text#发表单位、发表类型、发表年份、下载次数_引用次数
    
                #print('{} {} {} {}\n'.format(item_name,item_href,item_refer3,item_refer2))测试能否正常输出
                ws.append([item_name,item_href,item_abstract,item_refer]) #向表格中添加需要的信息
    
        wb.save('mobile_communication_paper.xlsx')
        print("已完成")
    

    输出结果如下图所示:
    CNKI爬取结果生成图

    展开全文
  • 该存储库包含MESMOC的python实现,即论文“”。 要求 该代码在Python中实现,并且需要以下软件包: 引文 如果您在学术工作中使用此代码,请引用我们的论文:“最大值熵搜索带约束的多目标贝叶斯优化”,Syrine ...
  • 今天为大家整理了32个Python爬虫项目。整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心。所有链接指向GitHub,祝大家玩的愉快~O(∩_∩)OWechatSogou [1]- 微信公众号爬虫。基于搜狗微信搜索的...

    今天为大家整理了32个Python爬虫项目。

    整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心。所有链接指向GitHub,祝大家玩的愉快~O(∩_∩)O

    WechatSogou [1]- 微信公众号爬虫。基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典。

    DouBanSpider [2]- 豆瓣读书爬虫。可以爬下豆瓣读书标签下的所有图书,按评分排名依次存储,存储到Excel中,可方便大家筛选搜罗,比如筛选评价人数>1000的高分书籍;可依据不同的主题存储到Excel不同的Sheet ,采用User Agent伪装为浏览器进行爬取,并加入随机延时来更好的模仿浏览器行为,避免爬虫被封。

    zhihu_spider [3]- 知乎爬虫。此项目的功能是爬取知乎用户信息以及人际拓扑关系,爬虫框架使用scrapy,数据存储使用mongo

    bilibili-user [4]- Bilibili用户爬虫。总数据数:20119918,抓取字段:用户id,昵称,性别,头像,等级,经验值,粉丝数,生日,地址,注册时间,签名,等级与经验值等。抓取之后生成B站用户数据报告。

    SinaSpider [5]- 新浪微博爬虫。主要爬取新浪微博用户的个人信息、微博信息、粉丝和关注。代码获取新浪微博Cookie进行登录,可通过多账号登录来防止新浪的反扒。主要使用 scrapy 爬虫框架。

    distribute_crawler [6]- 小说下载分布式爬虫。使用scrapy,Redis, MongoDB,graphite实现的一个分布式网络爬虫,底层存储MongoDB集群,分布式使用Redis实现,爬虫状态显示使用graphite实现,主要针对一个小说站点。

    CnkiSpider [7]- 中国知网爬虫。设置检索条件后,执行src/CnkiSpider.py抓取数据,抓取数据存储在/data目录下,每个数据文件的第一行为字段名称。

    LianJiaSpider [8]- 链家网爬虫。爬取北京地区链家历年二手房成交记录。涵盖链家爬虫一文的全部代码,包括链家模拟登录代码。

    scrapy_jingdong [9]- 京东爬虫。基于scrapy的京东网站爬虫,保存格式为csv。

    QQ-Groups-Spider [10]- QQ 群爬虫。批量抓取 QQ 群信息,包括群名称、群号、群人数、群主、群简介等内容,最终生成 XLS(X) / CSV 结果文件。

    wooyun_public[11]-乌云爬虫。 乌云公开漏洞、知识库爬虫和搜索。全部公开漏洞的列表和每个漏洞的文本内容存在MongoDB中,大概约2G内容;如果整站爬全部文本和图片作为离线查询,大概需要10G空间、2小时(10M电信带宽);爬取全部知识库,总共约500M空间。漏洞搜索使用了Flask作为web server,bootstrap作为前端。

    spider[12]- hao123网站爬虫。以hao123为入口页面,滚动爬取外链,收集网址,并记录网址上的内链和外链数目,记录title等信息,windows7 32位上测试,目前每24个小时,可收集数据为10万左右

    findtrip [13]- 机票爬虫(去哪儿和携程网)。Findtrip是一个基于Scrapy的机票爬虫,目前整合了国内两大机票网站(去哪儿 + 携程)。

    163spider [14] - 基于requests、MySQLdb、torndb的网易客户端内容爬虫

    doubanspiders[15]- 豆瓣电影、书籍、小组、相册、东西等爬虫集 writen by Python

    QQSpider [16]- QQ空间爬虫,包括日志、说说、个人信息等,一天可抓取 400 万条数据。

    baidu-music-spider [17]- 百度mp3全站爬虫,使用redis支持断点续传。

    tbcrawler[18]- 淘宝和天猫的爬虫,可以根据搜索关键词,物品id来抓去页面的信息,数据存储在mongodb。

    stockholm [19]- 一个股票数据(沪深)爬虫和选股策略测试框架。根据选定的日期范围抓取所有沪深两市股票的行情数据。支持使用表达式定义选股策略。支持多线程处理。保存数据到JSON文件、CSV文件。

    Spider[21]-社交数据爬虫。支持微博,知乎,豆瓣。

    proxy pool[22]-Python爬虫代理IP池(proxy pool)。

    music-163[23]-爬取网易云音乐所有歌曲的评论。

    SinaSpider[30]-动态IP解决新浪的反爬虫机制,快速抓取内容。

    ProxySpider[32]-爬取西刺上的代理IP,并验证代理可用性

    2018.8.2更新:

    webspider[33]-本系统是一个主要使用python3, celery和requests来爬取职位数据的爬虫,实现了定时任务,出错重试,日志记录,自动更改Cookies等的功能,并使用ECharts + Bootstrap 来构建前端页面,来展示爬取到的数据。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • 文献搜索对于广大学子来说真的是个麻烦事,如果你的学校购买的论文下载权限不够多,或者你不在校园网覆盖的范围内,想必会令你非常头痛。幸好,我们有Python制作的这个论文搜索工具,简化了我们学...

    文献搜索对于广大学子来说真的是个麻烦事,如果你的学校购买的论文下载权限不够多,或者你不在校园网覆盖的范围内,想必会令你非常头痛。

    幸好,我们有Python制作的这个论文搜索工具,简化了我们学习的复杂性

    更新日志:

    2020-05-28补充:已用最新的scihub提取网,目前项目可用,感谢@lisenjor的分享。

    2020-06-25补充:增加关键词搜索,批量下载论文功能。

    2021-01-07补充:增加异步下载方式,加快下载速度;加强下载稳定性,不再出现文件损坏的情况。

    2021-04-08补充:由于sciencedirect增加了机器人检验,现在搜索下载功能需要先在HEADERS中填入Cookie才可爬取,详见第4步。

    2021-04-25补充:搜索下载增加百度学术、publons渠道。

    本文完整源代码可在 GitHub 找到:

    https://github.com/Ckend/scihub-cn

    1. 什么是Scihub

    首先给大家介绍一下Sci-hub这个线上数据库,这个数据库提供了约8千万篇科学学术论文和文章下载。由一名叫亚历珊卓·艾尔巴金的研究生建立,她过去在哈佛大学从事研究时发现支付所需要的数百篇论文的费用实在是太高了,因此就萌生了创建这个网站,让更多人获得知识的想法

    后来,这个网站越来越出名,逐渐地在更多地国家如印度、印度尼西亚、中国、俄罗斯等国家盛行,并成功地和一些组织合作,共同维护和运营这个网站。到了2017年的时候,网站上已有81600000篇学术论文,占到了所有学术论文的69%,基本满足大部分论文的需求,而剩下的31%是研究者不想获取的论文。

    2. 为什么我们需要用Python工具下载

    在起初,这个网站是所有人都能够访问的,但是随着其知名度的提升,越来越多的出版社盯上了他们,在2015年时被美国法院封禁后其在美国的服务器便无法被继续访问,因此从那个时候开始,他们就跟出版社们打起了游击战

    游击战的缺点就是导致scihub的地址需要经常更换,所以我们没办法准确地一直使用某一个地址访问这个数据库。当然也有一些别的方法可让我们长时间访问这个网站,比如说修改DNS,修改hosts文件,不过这些方法不仅麻烦,而且也不是长久之计,还是存在失效的可能的。

    3. 新姿势:用Python写好的API工具超方便下载论文

    这是一个来自github的开源非官方API工具,下载地址为:
    https://github.com/zaytoun/scihub.py

    但由于作者长久不更新,原始的下载工具已经无法使用,Python实用宝典修改了作者的源代码,适配了中文环境的下载器,并添加了异步批量下载等方法:
    https://github.com/Ckend/scihub-cn

    欢迎给我一个Star,鼓励我继续维护这个仓库。如果你访问不了GitHub,请在 Python实用宝典 公众号后台回复 scihub,下载最新可用代码。

    解压下载的压缩包后,使用CMD/Terminal进入这个文件夹,输入以下命令(默认你已经安装好了Python)安装依赖:

    pip install -r requirements.txt

    然后我们就可以准备开始使用啦!

    这个工具使用起来非常简单,有两种方式,第一种方式你可以先在 Google 学术(搜索到论文的网址即可)或ieee上找到你需要的论文,复制论文网址如:

    http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=1648853

    ieee文章

    然后在scihub-cn文件夹里新建一个文件叫 my_test.py 输入以下代码:

    from scihub import SciHub
    
    sh = SciHub()
    
    # 第一个参数输入论文的网站地址
    # path: 文件保存路径
    result = sh.download('http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=1648853', path='paper.pdf')

    进入该文件夹后在cmd/terminal中运行:

    python my_test.py

    你就会发现文件成功下载到你的当前目录啦,名字为paper.pdf如果不行,有可能是网络问题,多试几次。实在不行可以在下方留言区询问哦。

    上述是第一种下载方式,第二种方式你可以通过在知网或者百度学术上搜索论文拿到DOI号进行下载,比如:

    将DOI号填入download函数中:

    from scihub import SciHub
    sh = SciHub()
    result = sh.download('10.1016/j.compeleceng.2020.106640', path='paper2.pdf')

    下载完成后就会在文件夹中出现该文献:

    除了这种最简单的方式,我们还提供了 论文关键词搜索批量下载 及 论文关键词批量异步下载 两种高级的下载方法。

    我们在下文将会详细地讲解这两种方法的使用,大家可以看项目内的  test.py 文件,你可以了解到论文搜索批量下载的方法。

    进一步的高级方法在download.py 中可以找到,它可以实现论文搜索批量异步下载,大大加快下载速度。具体实现请看后文。

    4. 基于关键词的论文批量下载

    支持使用搜索的形式批量下载论文,比如说搜索关键词 端午节(Dragon Boat Festival):

    from scihub import SciHub
    sh = SciHub()
    
    # 搜索词
    keywords = "Dragon Boat Festival"
    # 搜索该关键词相关的论文,limit为篇数
    result = sh.search(keywords, limit=10)
    print(result)
    
    for index, paper in enumerate(result.get("papers", [])):
        # 批量下载这些论文
        sh.download(paper["doi"], path=f"files/{keywords.replace(' ', '_')}_{index}.pdf")

    默认会使用百度学术进行论文搜索,拿到DOI号后再通过scihub下载,运行成功:

    2021-04-25 更新:

    由于读者们觉得Sciencedirect的搜索实在太难用了,加上Sciencedirect现在必须要使用Cookie才能正常下载,因此我新增了百度学术和publons这2个检索渠道。

    由于 Web of Science 有权限限制,很遗憾我们无法直接使用它来检索,不过百度学术作为一个替代方案也是非常不错的。

    现在默认的 search 函数调用了百度学术的接口进行搜索,大家不需要配置任何东西,只需要拉一下最新的代码,使用上述例子中的代码就可以正常搜索下载论文。

    其他两个渠道的使用方式如下:

    sciencedirect渠道:

    由于 sciencedirect 加强了他们的爬虫防护能力,增加了机器人校验机制,所以现在必须在HEADER中填入Cookie才能进行爬取。

    操作如下:

    1.获取Cookie

    2.使用sciencedirect搜索时,需要用 search_by_science_direct 函数,并将cookie作为参数之一传入:

    from scihub import SciHub
    
    sh = SciHub()
    
    # 搜索词
    keywords = "Dragon Boat Festival"
    
    # 搜索该关键词相关的论文,limit为篇数
    result = sh.search_by_science_direct(keywords, cookie="你的cookie", limit=10)
    
    print(result)
    
    for index, paper in enumerate(result.get("papers", [])):
        # 批量下载这些论文
        sh.download(paper["doi"], path=f"files/{keywords.replace(' ', '_')}_{index}.pdf")

    这样大概率就能顺利通过sciencedirect搜索并下载文献了。

    publons渠道:

    其实有了百度学术的默认渠道,大部分文献我们都能覆盖到了。但是考虑到publons的特殊性,这里还是给大家一个通过publons渠道搜索下载的选项。

    使用publons渠道搜索下载其实很简单,你只需要更改搜索的函数名即可,不需要配置Cookie:

    from scihub import SciHub
    
    sh = SciHub()
    
    # 搜索词
    keywords = "Dragon Boat Festival"
    
    # 搜索该关键词相关的论文,limit为篇数
    result = sh.search_by_publons(keywords, limit=10)
    
    print(result)
    
    for index, paper in enumerate(result.get("papers", [])):
        # 批量下载这些论文
        sh.download(paper["doi"], path=f"files/{keywords.replace(' ', '_')}_{index}.pdf")

    5. 异步下载优化,增加超时控制

    这个开源代码库已经运行了几个月,经常有同学反馈搜索论文后下载论文的速度过慢、下载的文件损坏的问题,这几天刚好有时间一起解决了。

    下载速度过慢是因为之前的版本使用了串行的方式去获取数据和保存文件,事实上对于这种IO密集型的操作,最高效的方式是用 asyncio 异步的形式去进行文件的下载。

    而下载的文件损坏则是因为下载时间过长,触发了超时限制,导致文件传输过程直接被腰斩了。

    因此,我们将在原有代码的基础上添加两个方法:1.异步请求下载链接,2.异步保存文件。

    此外增加一个错误提示:如果下载超时了,提示用户下载超时并不保存损坏的文件,用户可自行选择调高超时限制。

    首先,新增异步获取scihub直链的方法,改为异步获取相关论文的scihub直链:

    async def async_get_direct_url(self, identifier):
        """
        异步获取scihub直链
        """
        async with aiohttp.ClientSession() as sess:
            async with sess.get(self.base_url + identifier) as res:
                logger.info(f"Fetching {self.base_url + identifier}...")
                # await 等待任务完成
                html = await res.text(encoding='utf-8')
                s = self._get_soup(html)
                iframe = s.find('iframe')
                if iframe:
                    return iframe.get('src') if not iframe.get('src').startswith('//') \
                        else 'http:' + iframe.get('src')
                else:
                    return None

    这样,在搜索论文后,调用该接口就能获取所有需要下载的scihub直链,速度很快:

    def search(keywords: str, limit: int):
        """
        搜索相关论文并下载
    
        Args:
            keywords (str): 关键词
            limit (int): 篇数
        """
    
        sh = SciHub()
        result = sh.search(keywords, limit=limit)
        print(result)
    
        loop = asyncio.get_event_loop()
        # 获取所有需要下载的scihub直链
        tasks = [sh.async_get_direct_url(paper["doi"]) for paper in result.get("papers", [])]
        all_direct_urls = loop.run_until_complete(asyncio.gather(*tasks))
        print(all_direct_urls)

    获取直链后,需要下载论文,同样也是IO密集型操作,增加2个异步函数:

    async def job(self, session, url, destination='', path=None):
        """
        异步下载文件
        """
        file_name = url.split("/")[-1].split("#")[0]
        logger.info(f"正在读取并写入 {file_name} 中...")
        # 异步读取内容
        try:
            url_handler = await session.get(url)
            content = await url_handler.read()
        except:
            logger.error("获取源文件超时,请检查网络环境或增加超时时限")
            return str(url)
        with open(os.path.join(destination, path + file_name), 'wb') as f:
            # 写入至文件
            f.write(content)
        return str(url)
    
    async def async_download(self, loop, urls, destination='', path=None):
        """
        触发异步下载任务
        如果你要增加超时时间,请修改 total=300
        """
        async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=300)) as session:
            # 建立会话session
            tasks = [loop.create_task(self.job(session, url, destination, path)) for url in urls]
            # 建立所有任务
            finished, unfinished = await asyncio.wait(tasks)
            # 触发await,等待任务完成
            [r.result() for r in finished]

    最后,在search函数中补充下载操作:

    import asyncio
    from scihub import SciHub
    
    
    def search(keywords: str, limit: int):
        """
        搜索相关论文并下载
    
        Args:
            keywords (str): 关键词
            limit (int): 篇数
        """
    
        sh = SciHub()
        result = sh.search(keywords, limit=limit)
        print(result)
    
        loop = asyncio.get_event_loop()
        # 获取所有需要下载的scihub直链
        tasks = [sh.async_get_direct_url(paper["doi"]) for paper in result.get("papers", [])]
        all_direct_urls = loop.run_until_complete(asyncio.gather(*tasks))
        print(all_direct_urls)
    
        # 下载所有论文
        loop.run_until_complete(sh.async_download(loop, all_direct_urls, path=f"files/"))
        loop.close()
    
    
    if __name__ == '__main__':
        search("quant", 5)

    一个完整的下载过程就OK了:



    比以前的方式舒服太多太多了... 如果你要增加超时时间,请修改async_download函数中的 total=300,把这个请求总时间调高即可。

    最新代码前往GitHub上下载:
    https://github.com/Ckend/scihub-cn

    或者从Python实用宝典公众号后台回复 scihub 下载。

    6.工作原理

    这个API的源代码其实非常好读懂

    6.1、找到sci-hub目前可用的域名

    首先它会在这个网址里找到sci-hub当前可用的域名,用于下载论文:

    https://whereisscihub.now.sh/

    可惜的是,作者常年不维护,该地址已经失效了,我们就是在这里修改了该域名,使得项目得以重新正常运作:

    6.2、对用户输入的论文地址进行解析,找到相应论文

    1. 如果用户输入的链接不是直接能下载的,则使用sci-hub进行下载

    2. 如果scihub的网址无法使用则切换另一个网址使用,除非所有网址都无法使用。

    3.值得注意的是,如果用户输入的是论文的关键词,我们将调用sciencedirect的接口,拿到论文地址,再使用scihub进行论文的下载。

    6.3、下载

    1. 拿到论文后,它保存到data变量中

    2. 然后将data变量存储为文件即可

    此外,代码用到了一个retry装饰器,这个装饰器可以用来进行错误重试,作者设定了重试次数为10次,每次重试最大等待时间不超过1秒。

    希望大家能妥善使用好此工具,不要批量下载,否则一旦网站被封,学生党们又要哭了。

    我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注Python实用宝典。

    有任何问题,可以在公众号后台回复:加群,回答相应红字验证信息,进入互助群询问。

    原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

    点击下方阅读原文可获得更好的阅读体验

    Python实用宝典 (pythondict.com)
    不只是一个宝典
    欢迎关注公众号:Python实用宝典

    展开全文
  • Python语言程序设计课程论文

    千次阅读 2020-06-17 14:23:57
    本系统后端通过Python爬取腾讯以及百度热网页的数据,将数据解析并且落盘到MySQL;前端通过Ajax发送请求,Python从MySQL获取数据并传输到前端,通过Echarts组件进行渲染的一系列过程。 关键字: 爬取MySQL Ajax ...
  • Python实现一个论文下载器

    千次阅读 多人点赞 2021-01-15 10:00:03
    在科研学习的过程中,我们难免需要查询相关的文献资料,而想必很多小伙伴都知道SCI-HUB,此乃一大神器,它可以帮助我们搜索相关论文并下载其原文。可以说,SCI-HUB造福了众多科研人员,用起来也是“美滋滋”。 ...
  • 文献搜索对于广大学子来说真的是个麻烦事,如果你的学校购买的论文下载权限不够多,或者不在校园内,那就很头痛了。幸好,我们有Python制作的这个论文搜索工具,简化了我们学习的复杂性2020...
  • 幸好,我们有Python制作的这个论文搜索工具,简化了我们学习的复杂性。 Scihub 首先给大家介绍一下sci-hub这个线上数据库,这个数据库提供了 81,600,000 篇科学学术论文和文章下载。起初由一名叫 亚...
  • 文献搜索对于广大学子来说真的是个麻烦事,如果你的学校购买的论文下载权限不够多,或者不在校园内,那就很头痛了。幸好,我们有Python制作的这个论文搜索工具,简化了我们学习的复杂性2020...
  • 论文爬虫(python

    2021-03-17 23:02:56
    为了论文爬虫,在mac上装了visual studio code. scrapy beautifulsoup 等 各种爬虫库 学习scrapy .css .xpath 搜索网站标签及内容的方法 爬取springer网站题目与摘要的程序 好不容易调好的! import requests from ...
  • 本文介绍了可用于从SEC档案中提取数据的Python代码。 Python程序Web进行爬网以获取公司报告所需报告(例如10-K)的URL路径。 然后,程序将执行文本分析,并对归档中反映出例如不确定性(或研究人员指定的任何其他...
  • 一、需求描述大家好,我是早起。在之前的文章 批量翻译文档 中,我们介绍了如何调用百度翻译API完成实际的文档翻译需求。如果是科研、深度学习等需要经常阅读大量论文的工作,批量翻译就能大大提高...
  • 在科研学习的过程中,我们难免需要查询相关的文献资料,而想必很多小伙伴都知道SCI-HUB,此乃一大神器,它可以帮助我们搜索相关论文并下载其原文。可以说,SCI-HUB造福了众多科研人员,用起来也是“美滋滋”。 一、...
  • 假期,老师给布置了 Python 爬虫中国知网论文的任务,目前实现了登录和搜索功能,先写一下遇到的坑和解决办法吧。 Python 爬虫中国知网论文过程中遇到的坑及解决办法(上)一. selenium 模块1. 浏览器驱动程序下载...
  • Python实现微博热推送

    千次阅读 2018-01-18 19:45:26
    写在前面的话 最近项目忙得差不多了,要开始准备毕业论文了,所以我想把一些国外论文的pdf,以及一些英语相关的新闻推送到我的pad上面,这样就不用到处找了,直接保存就行。当然不能光看论文啊,也要放松一下啊(说...
  • 接上一篇,Python爬虫——爬取知网论文数据(一) 上一篇谈到了如何爬取知网的论文标题和论文作者,这一篇讲一下如何爬取多页,以及如何爬取作者的详细信息。 1. 换页 同样的,我们在搜索结果页按下F12查看网页源...
  • 文献搜索对于广大学子来说真的是个麻烦事,如果你的学校购买的论文下载权限不够多,或者不在校园内,那就很头痛了。幸好,我们有Python制作的这个论文搜索工具,简化了我们学习的复杂性Scih...
  • bibcheck.py是一个简单的python类/命令行实用程序,用于使用Google学术搜索进行自动文献搜索。 它以BibTeX参考书目(.bib)文件为输入,并输出可能与该参考书目中包含的论文相关的论文列表。 从命令行使用时,程序...
  • Selective Search for Object Detection  ...https://www.learnopencv.com/selective-search-for-object-detection-cpp-python/ 论文参考:Efficient Graph-Based Image Segmentation #!/u...
  • 读完之后发现其中的原理并不十分复杂,但是方法对噪音的健壮性却非常好,出于好奇决定自己用python自己实现了一个简单的音乐搜索工具—— Song Finder, 它的核心功能被封装在SFEngine 中,第三方依赖方面只使用到了 ...
  • 其中所提到的文章又将我引向了关于shazam的一篇论文及另外一篇博客。读完之后发现其中的原理并不十分复杂,但是方法对噪音的健壮性却非常好,出于好奇决定自己用python自己实现了一个简单的音乐搜索工具—— Song ...
  • Python 代码实现在线答题的自动搜索

    万次阅读 2018-01-18 10:34:26
    这算是一个小插曲吧,即使mobilenet V2论文公布了,还是抵挡不了答题致富的幻想,,哈哈哈 。。 言归正传。因为一些答题外挂延迟太高,故自己操刀写了一个Python代码来实现自动搜索。算法的主要流程是:先对手机...
  • query_log_proprocess 这是我的毕业论文“基于日志挖掘的网络用户搜索策略识别”的数据预处理代码,数据源为搜狗公开查询日志,语言为Python

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 347
精华内容 138
关键字:

python搜论文

python 订阅