精华内容
下载资源
问答
  • ') I.append('0') else: print('论文链接:%s' % downUrl) print('下载中...') pdf = download_article(downUrl) #文献存储目录 D:\doc_E\papers\ with open('D:\doc_E\papers\%s.pdf' % title, 'wb') as f: f.write...
    # -*- coding: utf-8 -*-
    """
    Created on  Mar  10 21:22:22 2021
    @author: kimol_love & solar2030
    >>>>>>>> This code is designed based on kimol_love's code in his blog, https://blog.csdn.net/kimol_justdo/article/details/112996678?spm=1001.2014.3001.5501     Say thanks to him. Here, a 【for】 command was used so that we can downloading a series of papers by on-click. All we need to prepare is a text file including the lists of paper titles. And at the same time, I solved a bug related to '/' in paper titles. It can trouble troubles because '/' cannot be used in filenames. Using 【str.replace】command, we can replace '/'s with '_', for example, the bug then can be fixed.
    >>>>>>>> 
    """
    import os
    import time
    import requests
    from bs4 import BeautifulSoup
    from tkinter.filedialog import askopenfilename
    import matplotlib.pyplot as plt
    import numpy as np
    
    path_and_name = askopenfilename(title='Paper lists: title or doi', filetypes=[('TXT', '*.txt')],
                                    initialdir='D:\\')
    data = []
    with open(path_and_name)as txt_file:
        line = txt_file.readlines()
        for i, rows in enumerate(line):
            if i in range(0, len(line)):
                data.append(rows)
    print(data[0])
    
    
    
    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:
         I=[]
         for ii in range(len(data)):
            welcome()
            #request = input('请输入URL、PMID、DOI或者论文标题:')
            request = data[ii].strip()
            title=request.replace("/", "_")
            str1=str(ii)+'-'
            title1=str1+title
            print('搜索中...')
            downUrl = search_article(request)
            if downUrl == '':
                print('未找到相关论文,请重新搜索!')
                I.append('0')
            else:
                print('论文链接:%s' % downUrl)
                print('下载中...')
                pdf = download_article(downUrl)
                #文献存储目录   D:\doc_E\papers\
                with open('D:\doc_E\papers\%s.pdf' % title1, 'wb') as f:
                    f.write(pdf)
                print('---下载完成---')
                I.append('1')
    
    
            time.sleep(0.8)
         print('下载完成统计: %s', I)
    展开全文
  • python批量下载cnki知网文献

    千次阅读 2020-10-23 12:58:12
    python批量下载cnki知网caj文献github项目地址代码工作方式相关库分解代码requests初始化webdriver初始化使用selenium获取登录cookies读取excel文件里的内容读取已经完成的任务序号使用requests搜索文献并分析结果...

    github项目地址

    感谢支持.
    https://github.com/xz454867105/cnki_download.

    代码工作方式

    1. 使用selenium库登录知网后获取登录信息
    2. 将登录信息保存为cookie形式
    3. 读取本地文件中需要下载的文献名列表
    4. 使用requests库和cookie进行搜索
    5. 使用requests库下载文献并命名保存

    相关库

    import requests
    from selenium import webdriver
    import re
    import time
    import os
    from requests.cookies import RequestsCookieJar
    import json
    from selenium.webdriver.chrome.options import Options
    from bs4 import BeautifulSoup
    import xlrd
    from random import uniform
    

    分解代码

    requests初始化

        def session_init(self):
            self.time_cost = 0
            self.job_done = 0
            self.headers = {
                'Host': 'login.cnki.net',
                'Referer': 'https://www.cnki.net/',
                'Sec-Fetch-Mode': 'no-cors',
                'Sec-Fetch-Site': 'same-site',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
                'Accept': '*/*',
                'Accept-Encoding': 'gzip, deflate, br',
                'Accept-Language': 'zh-CN,zh;q=0.9',
                'Connection': 'keep-alive',
            }
            self.session = requests.session()
    

    webdriver初始化

        def chrome_init(self):
            self.options = Options()
            self.options.add_argument('blink-settings=imagesEnabled=true')
            self.options.add_argument('--disable-extensions')
            self.options.add_argument('--disable-gpu')
    
            self.options.add_argument('--no-sandbox')
            self.options.add_argument('--disable-dev-shm-usage')
            prefs = {
                'profile.default_content_setting_values': {
                    'images': 2,
                    'permissions.default.stylesheet': 2,
                    'profile.default_content_settings.popups': 0,
                }
            }
            self.options.add_experimental_option('prefs', prefs)
            self.options.add_argument('--mute-audio')
            self.driver = webdriver.Chrome(options=self.options)
    

    使用selenium获取登录cookies

        def get_jar_from_file(self):
            jar = requests.cookies.RequestsCookieJar()
            with open("cookies.txt", "r") as fp:
                cookies = json.load(fp)
                self.uid = cookies[3]['value']
                for cookie in cookies:
                    jar.set(cookie['name'], cookie['value'])
            return jar
        def save_jar_from_chrome(self):
            self.driver.get('https://login.cnki.net/login/?platform=kns&ForceReLogin=1&ReturnURL=https://www.cnki.net/')
            input('请在登录完成后输入任意内容')
            cookies = self.driver.get_cookies()
            with open("cookies.txt", "w") as fp:
                json.dump(cookies, fp)
            self.driver.quit()
    

    读取excel文件里的内容

        def get_xlrd(self):
            passage_list = []
            for column in [0,4,8,12,16,20]:
                self.column = column
                wb = xlrd.open_workbook('20.xlsx')
                ws = wb.sheets()[0]
                rows = ws.nrows
                sheets = 1
                for row in range(2, rows):
                    passage_dict = {}
                    if ws.cell_value(row, column):
                        tmp = str(ws.cell_value(row, column + 1))
                        result = re.findall('(.*?)\.', tmp)[2]
                        if result:
                            passage_dict['name'] = str(result).replace('\t','').replace('\\','').replace(':',',').replace('<',',').replace('>',',').replace('?','')
                            try:
                                passage_dict['num'] = str(column) + '-' + str(int(ws.cell_value(row, column)))
                            except:
                                passage_dict['num'] = str(column) + '-' + str(column+int(re.findall('\[(.*?)\]',(ws.cell_value(row, column)))[0]))
                            passage_list.append(passage_dict)
            return passage_list
    

    这段内容需要根据自己的具体情况进行对应的修改,根据自己保存的方式,通过这个方法返回一个内含字典的列表,字典中有两个键,‘name’’num’,分别代表文献名和文献序号(用于断点下载),且全部通过str形式保存。

    读取已经完成的任务序号

        def get_done_jobs(self):
            f = open('log.txt','r')
            num = f.read()
            f.close()
            num = re.findall('-(.*)-',num)[0]
            return num
    

    使用requests搜索文献并分析结果

        def search(self,jar,keyword):
            url = 'https://kns.cnki.net/KNS8/Brief/GetGridTableHtml'
            form_Data = {
                        'CurrSortField': '%e7%9b%b8%e5%85%b3%e5%ba%a6%2f(ffd%2c%27rank%27)',
                        'IsSearch': 'true',
                        'QueryJson': '{"Platform":"","DBCode":"SCDB","KuaKuCode":"CJFQ,CDMD,CIPD,CCND,CISD,SNAD,BDZK,CJFN,CCJD","QNode":{"QGroup":[{"Key":"Subject","Title":"","Logic":1,"Items":[{"Title":"主题","Name":"SU","Value":"'+keyword+'","Operate":"%=","BlurType":""}],"ChildItems":[]}]}}',
                        'PageName': 'DefaultResult',
                        'DBCode': 'SCDB',
                        'KuaKuCodes': 'CJFQ,CDMD,CIPD,CCND,CISD,SNAD,BDZK,CJFN,CCJD',
                        'CurPage': '1',
                        'RecordsCntPerPage': '10',
                        'CurDisplayMode': 'listmode',
                        'CurrSortFieldType': 'desc',
                        'IsSentenceSearch': 'false',
                        'Subject': '',
                        }
            resq = self.session.post(url,cookies = jar,headers = self.headers,data = form_Data)
            content = resq.text
            return content
        def analysis_web_content(self,content):
            info_list = []
            soup = BeautifulSoup(content, 'html.parser')
            amount = soup.find_all('div', class_='result-con-r')
            if amount:
                amount = re.findall('共找到(.*?)条结果', amount[0].text)[0]
                amount = int(('').join(amount.split(',')))
                # print('共找到结果',amount,'个')
                if amount != '0':
                    result = soup.find_all('a', class_='fz14')
                    downloadlink = soup.find_all('a', class_='downloadlink')
                    for name, link in zip(result, downloadlink):
                        info_dict = {}
                        if name and link:
                            info_dict['name'] = name.text.replace('\n','')
                            info_dict['link'] = link['href']
                            info_list.append(info_dict)
                    # print(downloadlink)
                    # print(info_list[0])
                    return info_list
                else:
                    return 0
            else:return 0
    

    这个方法将会返回一个内含字典的列表,字典中有两个键,‘name’’link’,分别代表文献名和文献下载路径。

    使用requests下载文献

        def download(self,info_list,num,keyword):
            url = 'https://kns.cnki.net'+info_list[0]['link']
            resq = self.session.get(url)
            time.sleep(uniform(5,15))
            if len(resq.content) > 2000:
                f = open('files/-{}-{}.caj'.format(num,info_list[0]['name'].replace('\t','').replace('\\','').replace(':',',').replace('<',',').replace('>',',').replace('?','').replace('\r','').replace(' ','').replace(' ','')),'wb')
                f.write(resq.content)
                f.close()
                print('已下载',info_list[0]['name'],'------',keyword)
            else:
                if '<title>403'in resq.content.decode('utf-8'):
                    time.sleep(60)
                    print('*'*30)
                else:
                    # print(info_list[0]['name'])
                    print(resq.content)
                    if '贵单位没有订购该产品' in resq.content.decode('utf-8'):
                        print('贵单位没有订购该产品')
                    else:
                        f = open('error.txt','a')
                        f.write(resq.content)
                        f.close()
                        input('出现异常错误,请查看记录文件error.txt检查无误后输入任何内容回车')
    
    

    主程序

        def main(self):
            job_done = self.get_done_jobs()
            passage_list = self.get_xlrd()
            self.session_init()
            a = time.time()
            self.chrome_init()
            self.save_jar_from_chrome()
            jar = self.get_jar_from_file()
            print('剩余任务:',len(passage_list)-int(job_done),'个')
            for i in range(int(job_done),len(passage_list)):
                content = self.search(jar,passage_list[i]['name'])
                result = self.analysis_web_content(content)
                if result:
                    self.download(result,passage_list[i]['num'],passage_list[i]['name'])
                    f = open('log.txt', 'w')
                    f.write('-{}-'.format(passage_list.index(passage_list[i])))
                    f.close()
                b = time.time()
                time_used = int(b - a)
                if time_used >= 1500:
                    print('时间到,请重新登录')
                    break
    

    代码执行

    a = Download_file_From_CNKI()
    a.main()
    

    完整代码

    import requests
    from selenium import webdriver
    import re
    import time
    import os
    from requests.cookies import RequestsCookieJar
    import json
    from selenium.webdriver.chrome.options import Options
    from bs4 import BeautifulSoup
    import xlrd
    from random import uniform
    
    class Download_file_From_CNKI():
        def session_init(self):
            self.time_cost = 0
            self.job_done = 0
            self.headers = {
                'Host': 'login.cnki.net',
                'Referer': 'https://www.cnki.net/',
                'Sec-Fetch-Mode': 'no-cors',
                'Sec-Fetch-Site': 'same-site',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
                'Accept': '*/*',
                'Accept-Encoding': 'gzip, deflate, br',
                'Accept-Language': 'zh-CN,zh;q=0.9',
                'Connection': 'keep-alive',
            }
            self.session = requests.session()
        def chrome_init(self):
            self.options = Options()
            self.options.add_argument('blink-settings=imagesEnabled=true')
            self.options.add_argument('--disable-extensions')
            self.options.add_argument('--disable-gpu')
    
            self.options.add_argument('--no-sandbox')
            self.options.add_argument('--disable-dev-shm-usage')
            prefs = {
                'profile.default_content_setting_values': {
                    'images': 2,
                    'permissions.default.stylesheet': 2,
                    'profile.default_content_settings.popups': 0,
                }
            }
            self.options.add_experimental_option('prefs', prefs)
            self.options.add_argument('--mute-audio')
            self.driver = webdriver.Chrome(options=self.options)
        def get_jar_from_file(self):
            jar = requests.cookies.RequestsCookieJar()
            with open("cookies.txt", "r") as fp:
                cookies = json.load(fp)
                self.uid = cookies[3]['value']
                for cookie in cookies:
                    jar.set(cookie['name'], cookie['value'])
            return jar
        def save_jar_from_chrome(self):
            self.driver.get('https://login.cnki.net/login/?platform=kns&ForceReLogin=1&ReturnURL=https://www.cnki.net/')
            input('请在登录完成后输入任意内容')
            cookies = self.driver.get_cookies()
            with open("cookies.txt", "w") as fp:
                json.dump(cookies, fp)
            self.driver.quit()
        def search(self,jar,keyword):
            url = 'https://kns.cnki.net/KNS8/Brief/GetGridTableHtml'
            form_Data = {
                        'CurrSortField': '%e7%9b%b8%e5%85%b3%e5%ba%a6%2f(ffd%2c%27rank%27)',
                        'IsSearch': 'true',
                        'QueryJson': '{"Platform":"","DBCode":"SCDB","KuaKuCode":"CJFQ,CDMD,CIPD,CCND,CISD,SNAD,BDZK,CJFN,CCJD","QNode":{"QGroup":[{"Key":"Subject","Title":"","Logic":1,"Items":[{"Title":"主题","Name":"SU","Value":"'+keyword+'","Operate":"%=","BlurType":""}],"ChildItems":[]}]}}',
                        'PageName': 'DefaultResult',
                        'DBCode': 'SCDB',
                        'KuaKuCodes': 'CJFQ,CDMD,CIPD,CCND,CISD,SNAD,BDZK,CJFN,CCJD',
                        'CurPage': '1',
                        'RecordsCntPerPage': '10',
                        'CurDisplayMode': 'listmode',
                        'CurrSortFieldType': 'desc',
                        'IsSentenceSearch': 'false',
                        'Subject': '',
                        }
            resq = self.session.post(url,cookies = jar,headers = self.headers,data = form_Data)
            content = resq.text
            return content
        def analysis_web_content(self,content):
            info_list = []
            soup = BeautifulSoup(content, 'html.parser')
            amount = soup.find_all('div', class_='result-con-r')
            if amount:
                amount = re.findall('共找到(.*?)条结果', amount[0].text)[0]
                amount = int(('').join(amount.split(',')))
                # print('共找到结果',amount,'个')
                if amount != '0':
                    result = soup.find_all('a', class_='fz14')
                    downloadlink = soup.find_all('a', class_='downloadlink')
                    for name, link in zip(result, downloadlink):
                        info_dict = {}
                        if name and link:
                            info_dict['name'] = name.text.replace('\n','')
                            info_dict['link'] = link['href']
                            info_list.append(info_dict)
                    # print(downloadlink)
                    # print(info_list[0])
                    return info_list
                else:
                    return 0
            else:return 0
        def download(self,info_list,num,keyword):
            url = 'https://kns.cnki.net'+info_list[0]['link']
            resq = self.session.get(url)
            time.sleep(uniform(5,15))
            if len(resq.content) > 2000:
                f = open('files/-{}-{}.caj'.format(num,info_list[0]['name'].replace('\t','').replace('\\','').replace(':',',').replace('<',',').replace('>',',').replace('?','').replace('\r','').replace(' ','').replace(' ','')),'wb')
                f.write(resq.content)
                f.close()
                print('已下载',info_list[0]['name'],'------',keyword)
            else:
                if '<title>403'in resq.content.decode('utf-8'):
                    time.sleep(60)
                    print('*'*30)
                else:
                    # print(info_list[0]['name'])
                    print(resq.content)
                    if '贵单位没有订购该产品' in resq.content.decode('utf-8'):
                        print('贵单位没有订购该产品')
                    else:
                        f = open('error.txt')
                        f.write(resq.content)
                        f.close()
                        input('出现异常错误,请查看记录文件error.txt检查无误后输入任何内容回车')
    
        def get_xlrd(self):
            passage_list = []
            for column in [0,4,8,12,16,20]:
                self.column = column
                wb = xlrd.open_workbook('20.xlsx')
                ws = wb.sheets()[0]
                rows = ws.nrows
                sheets = 1
                for row in range(2, rows):
                    passage_dict = {}
                    if ws.cell_value(row, column):
                        tmp = str(ws.cell_value(row, column + 1))
                        result = re.findall('(.*?)\.', tmp)[2]
                        if result:
                            passage_dict['name'] = str(result).replace('\t','').replace('\\','').replace(':',',').replace('<',',').replace('>',',').replace('?','')
                            try:
                                passage_dict['num'] = str(column) + '-' + str(int(ws.cell_value(row, column)))
                            except:
                                passage_dict['num'] = str(column) + '-' + str(column+int(re.findall('\[(.*?)\]',(ws.cell_value(row, column)))[0]))
                            passage_list.append(passage_dict)
            return passage_list
    
        def get_done_jobs(self):
            f = open('log.txt','r')
            num = f.read()
            f.close()
            num = re.findall('-(.*)-',num)[0]
            return num
        def main(self):
            job_done = self.get_done_jobs()
            passage_list = self.get_xlrd()
            self.session_init()
            a = time.time()
            self.chrome_init()
            self.save_jar_from_chrome()
            jar = self.get_jar_from_file()
            print('剩余任务:',len(passage_list)-int(job_done),'个')
            for i in range(int(job_done),len(passage_list)):
                content = self.search(jar,passage_list[i]['name'])
                result = self.analysis_web_content(content)
                time.sleep(2)
                if result:
                    self.download(result,passage_list[i]['num'],passage_list[i]['name'])
                    f = open('log.txt', 'w')
                    f.write('-{}-'.format(passage_list.index(passage_list[i])))
                    f.close()
                b = time.time()
                time_used = int(b - a)
                if time_used >= 1500:
                    print('时间到,请重新登录')
                    break
    
    
    
    a = Download_file_From_CNKI()
    a.main()
    
    
    

    注意!!!

    请勿直接运行所有代码,请务必根据自身情况修改read_xlrd部分内容后再运行,可以使用任何方法读取任何文件,只要最后return的对象是包含字典的列表,字典包含两个键’name’和‘num’即可

    cnki的cookie expiry时间设定为30分钟,为保险起见,我设定了每25分钟需要手动重新登录一次

    建议每日下载总量低于700篇,经使用发现每天下载大于700篇有被封禁一天ip的风险

    请勿将download方法中time.sleep的uniform参数修改的小于5秒,否则将有被检测到的风险

    仅用于需要大量文献的学习活动,禁止用于非法活动

    展开全文
  • python批量管理文献

    2021-04-03 10:18:08
    目前硕士搬砖,老师给了个任务,下载700篇相关文献,并且把每篇文献按照 **年份-期刊名称-文章题目**格式来重命名,未处理之前如图: 处理完成之后如图: 对于700篇的文献整理,每一篇要依次点开,寻找对应 ...
       目前硕士搬砖,老师给了个任务,下载700篇相关文献,并且把每篇文献按照  *年份-期刊名称-文章题目* 格式来重命名,未处理之前如图:
    

    在这里插入图片描述

    处理完成之后如图:
    在这里插入图片描述
    对于700篇的文献整理,每一篇要依次点开,寻找对应 “年份 期刊名称 文章题目” ;这个工作量显然是灾难, 且重复操作没有营养,想写一个程序自动完成。

    第一步:获取每一篇文献的相关信息。若用程序直接读取pdf文件,寻找信息是相当困难的,因为我的这700篇文献中“年份 期刊名称 文章题目”出现位置极不规律,可以说一篇一个样,随便贴两张图:
    在这里插入图片描述
    在这里插入图片描述
    可以看出,*“年份 期刊名称 文章题目”*出现很不一样,无法通过一种固定的方法获取,在“哥们”的帮助之下,获得了一个神奇的软件:Zotero,下载链接(https://www.zotero.org/download/),把文章导入之后可以自动获得一系列信息,如图:

    在这里插入图片描述
    通过导入的操作,可以获得每一篇的相关信息,此软件可以将这些信息输出为.csv文件,如图:
    在这里插入图片描述
    第二步:从这里选择需要的信息,然后再通过python代码,就可以批量命名啦,源程序直接上:

    import os,csv
    path = "C:/Users/e2164\Desktop/2"+"/"  #文献文件所在位置
    new_name = csv.reader(open(r'C:\Users\e2164\Desktop\wenxin.csv', encoding='utf-8'))  #导出的excel文件所在位置
    New=[]
    for i in new_name: #获取表格想要信息,我这里选择的是  “年份 期刊名称 文章题目“
        name=i[0]+'-'+i[1]+'-'+i[2]  #这是把这些信息整合在一起
        New.append(name)
    print('导入完成')
    # 获取该目录下所有文件,存入列表中
    f = os.listdir(path)
    print(len(f))
    
    print(f[0])
    
    n = 0
    i = 0
    j = 1
    for i in f:
        # 设置旧文件名(就是路径+文件名)
        oldname = f[n]
    
        # 设置新文件名
        newname = New[n]+'.pdf'
        # 用os模块中的rename方法对文件改名
        try:
            os.rename(path+oldname, path+newname)
            print(oldname, '======>', newname)  #命名成功的
        except:
            os.rename(path + oldname, path + 'error'+str(j)+'.pdf')
            print(j)
            j += 1   #命名失败的
    
        n += 1
    

    注意:
    1、有些文献的题目中含有“/ \ < > * ? : ”,这样的字符是不允许出现的,所以在表格中把这些符号预先替换掉,从而大大提高成功率。
    2、excel文件中的文献排列顺序要和文献文件顺序排列一致,否则出现“张冠李戴”。

    展开全文
  • 查看DOI所在列(我的在BC列)二、利用python批量下载Excel表中文献2.代码总结 前言 利用web of science 批量获取doi至表格,之后通过运行python代码,自动批量下载文献 提示:其中,python代码是根据WuGenQiang...

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


    前言

    利用web of science 批量获取doi至表格,之后通过运行python代码,自动批量下载文献
    我用的python3.7,在Anaconda里运行的


    提示:其中,python代码是根据WuGenQiang(《通过doi下载单个文献pdf》)的代码修改的(本人python没学多少,所以代码不规范,见谅)。

    一、将选择的文献用excel导出

    1.文献按Excel导出

    在web of science内检索完自己想要的文献后,选择自己需要的文献,然后点击<将记录导出至Excel>,记录内容改为<全纪录>,点导出

    在这里插入图片描述

    2. 将DOI另存在一个excel中,存为xlsx格式

    直接用导出的excel,会出错,可能是我调用excel的类型不对?只能读取xlsx?不太清楚,懒得试了,有兴趣的小伙伴可以自己试试
    在这里插入图片描述

    二、利用python批量下载Excel表中文献

    将代码保存至F:\doi_download.py(也可设为其他),将excel挪到F盘,将下面代码的doi所在列改成A列,然后运行就行了。

    2.代码

    # -*- coding: utf-8 -*-
    """
    Created on Sun Jun  6 21:09:44 2021
    
    @author: dell
    """
    
    
    """
    这是原作者的信息
    @File: version_1.1_doi_to_get_pdf.py
    @Time: 2021/4/20 10:10 下午
    @Author: genqiang_wu@163.com
    @desc: 通过doi号下载文献pdf
    """
    
    import requests
    import re
    import os
    import urllib.request
    import openpyxl
    
    # headers 保持与服务器的会话连接
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36',
    }
    
    '''
    根据doi,找到文献的pdf,然后下载到本地
    '''
    
    
    def getPaperPdf(url):
        pattern = '/.*?\.pdf'
        content = requests.get(url, headers=headers)
        download_url = re.findall(pattern, content.text)
        # print(download_url)
        download_url[1] = "https:" + download_url[1]
        print(download_url[1])
        path = r"papers"
        if os.path.exists(path):
            pass
        else:
            os.makedirs(path)
    
        # 使用 urllib.request 来包装请求
        req = urllib.request.Request(download_url[1], headers=headers)
        # 使用 urllib.request 模块中的 urlopen方法获取页面
        u = urllib.request.urlopen(req, timeout=5)
    
        file_name = download_url[1].split('/')[-2] + '%' + download_url[1].split('/')[-1]
        f = open(path + '/' + file_name, 'wb')
    
        block_sz = 8192
        while True:
            buffer = u.read(block_sz)
            if not buffer:
                break
            f.write(buffer)
        f.close()
        print("Sucessful to download" + " " + file_name)
    '''
    将表格放在代码保存和运行的路径内,将wb变量内的'n0606.xlsx'改为自己的excel文件名,
    最后下载的论文在该路径下新建的papers文件夹内
    '''
    wb = openpyxl.load_workbook('n0606.xlsx')
    #doi在sheet1中
    sheet1 = wb.get_sheet_by_name('Sheet1')
    #读取第A列
    
    '''
    修改代码内,excel中DOI所在列,我的在BC,所以col_range变量后面的字符改为了‘BC’
    '''
    col_range = sheet1['A']
    # 读取其中的第几行:row_range = sheet1[2:6]
    fails=[]
    
    
     #以下代码加入了我找的其他SCI-hub网址,不需要可以删除一些
    for col in col_range: # 打印BC两列单元格中的值内容
        doi=col.value
        print (doi)
        if __name__ == '__main__':
            sci_Hub_Url = "https://sci-hub.ren/"
            paper_url = sci_Hub_Url + doi
            print(paper_url)
            nmm=0
            try:
                getPaperPdf(paper_url)  # 通过文献的url下载pdf
                continue
            except Exception:
                nmm=1
                print("Failed to get pdf 1"           
            if nmm==1:
                try :
                    sci_Hub_Url_2 = "https://sci-hub.se/"
                    paper_url_2 = sci_Hub_Url_2 + doi
                    getPaperPdf(paper_url_2)
                    
                    continue
                except Exception:
                    print("Failed to get pdf 2")
            if nmm==1:
                try :
                    sci_Hub_Url_3 = "https://sci-hub.st/"
                    paper_url_3 = sci_Hub_Url_3 + doi
                    getPaperPdf(paper_url_3)
                    continue
                except Exception:
                    print("Failed to get pdf 3")
            if nmm==1:
                try :
                    sci_Hub_Url_4 = "https://sci-hub.shop/"
                    paper_url_4 = sci_Hub_Url_4 + doi
                    getPaperPdf(paper_url_4)
                    continue
                except Exception:
                    print("Failed to get pdf 4")
            if nmm==1:
                try :
                    sci_Hub_Url_5 = "https://sci-hub.shop/"
                    paper_url_5 = sci_Hub_Url_5 + doi
                    getPaperPdf(paper_url_5)
                    continue
                except Exception:
                    print("Failed to get pdf 5")          
            if nmm==1:
                try :
                    sci_Hub_Url_7 = "https://sci-hub.do/"
                    paper_url_7 = sci_Hub_Url_7 + doi
                    getPaperPdf(paper_url_7)
                    continue
                except Exception:
                    print("Failed to get pdf 7")    
            if nmm==1:
                try :
                    sci_Hub_Url_6 = "https://libgen.ggfwzs.net/"
                    paper_url_6 = sci_Hub_Url_6 + doi
                    getPaperPdf(paper_url_6)
                    continue
                except Exception:
                    print("Failed to get pdf 6")
                    fails.append(doi)
                    
    #获取下载失败的doi
    print (fails)
    
    

    结果展示图在这里。
    在这里插入图片描述

    总结

    根据上面写的就可以根据excel的DOI批量下载论文了,不过有一些会失败,那种可能就要手动了,我自己感觉还可以,大家可以试试。
    另:python实在不行,所以根据别人代码改的(强调!!!),我加的那些让代码看起来很啰嗦,有更好的写法,欢迎大家告诉我,感恩

    展开全文
  • 利用Python自制批量下载文献程序

    千次阅读 2020-12-12 10:42:22
    批量下载文献1、导入库2、打开网站并设置网页初始选项3、关键词搜索4、选择下载格式及批量下载到几页5、开始批量下载 打包后的PyCNKi.exe程序同步佐佑思维公众号二维码如下: 1、导入库 from selenium import ...
  • 于是就想试着写个脚本批量下载。一个高手看起来巨简单的的程序,我在官网上看了N久的库文献加上N多google代码片段,断断续续写了3天才出来,不过总算稍微入点门了⋯⋯代码如下,看那一堆注释就知道每一步我都要调试...
  • 最近在学习蒙特卡洛方法相关的理论知识,在证明置信概率与打靶次数的关系时用到了Hoeffding不等式,于是查了一部分文献,发现一篇论文的引用是一个讲义的资源网站,有很多PDF形式的讲义,因此想批量下载下来。...
  • 我知道用python爬虫可以批量下载,不过之前没有接触过。今天下午找了下资料,终于成功搞定,免去了手动下载的烦恼。 由于我搭建的python版本是3.5,我学习了上面列举的参考文献2中的代码,这里的版本为2.7,有些...
  • 相信 Entrez 的强大是有目共睹的,BioPython 将它几乎所有操作都封装为方法,使我们可以...我想你的心情不会和下载一条序列时那么平静,那么,接下来通过BioPython提供的接口来实现快速的自动化序列下载。 一、自...

空空如也

空空如也

1 2 3
收藏数 49
精华内容 19
关键字:

python批量下载文献

python 订阅