zoukankan      html  css  js  c++  java
  • Python自动化批量下载网上的论文

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

    一、代码分析

    代码分析的详细思路跟以往依旧如此雷同,逃不过的还是:抓包分析->模拟请求->代码整合。

    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
     

    很多人学习python,不知道从何学起。
    很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
    很多已经做案例的人,却不知道如何去学习更加高深的知识。
    那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
    QQ群:568668415

    二、完整代码

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

    # -*- 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)

    写在最后

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

    以下内容无用,为本篇博客被搜索引擎抓取使用
    (* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)
    python 是干什么的 零基础学 python 要多久 python 为什么叫爬虫
    python 爬虫菜鸟教程 python 爬虫万能代码 python 爬虫怎么挣钱
    python 基础教程 网络爬虫 python python 爬虫经典例子
    python 爬虫
    (* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)
    以上内容无用,为本篇博客被搜索引擎抓取使用

  • 相关阅读:
    python切片操作
    python中的内存管理
    python中x,y交换值的问题
    leetcode6:Zigzag Conversion@Python
    Leetcode4:Median of Two Sorted Arrays@Python
    Leetcode3:Longest Substring Without Repeating Characters@Python
    Leetcode2:Add Two Numbers@Python
    LeetCode344:Reverse String@Python
    支付宝 芝麻信用分过600,你不知道的八个特权
    穷爸爸富爸爸里面说的“现金流游戏”靠谱吗?
  • 原文地址:https://www.cnblogs.com/shuchongzeishuai/p/14299248.html
Copyright © 2011-2022 走看看