自動下載MarkDown格式會議論文的程式

未名w發表於2021-11-13

近期師兄發給我一個壓縮包讓我整理文獻,而我發現壓縮包裡的內容是這樣:

 

 這樣:

 

 和這樣的:

 

 

 我大概看了一下,可能有270多篇文章是這種格式,俗話說的好,沒有困難的工作,只有勇敢的研究僧。所以決定用Python自己寫一個指令碼。

儘管這個程式還有許多不足之處

1)在部分網站對於檔案很大的時候,可能會只下載一個18kb左右的無法開啟檔案;

2)程式執行時可能會出現網路或者檔案異常,沒有對異常進行處理;

3)因為md檔案裡面的pdf文章地址,有的開啟是網站、有的開啟可以直接下載,有的開啟是pdf檔案......,所以還需要人工去分一下哪一類域名下的網址可以直接下載或是pdf檔案,一共可能也就20種以內,列印一下選幾個關鍵詞判斷一下就行。

這個程式的主要思想:

1)利用Python對資料夾和檔案進行遍歷;

2)讀取md檔案內容並且根據# 標識識別文章標題,利用“pdf”和正規表示式識別出pdf下載的地址;

3)使用urllib庫的urlretrieve對指定網址的資原始檔進行下載到指定資料夾。

結果:實現260+篇文章的自動下載,並將無法下載的文章名和網址儲存在相關的檔案內。最後希望能夠對你產生幫助,如果有幫助可以點個贊。

程式碼如下:

 

import os
import re
from urllib.request import urlretrieve
import ssl

from urllib import request
opener = request.build_opener()
opener.addheaders = ([('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36')])
request.install_opener(opener)

# 關閉證照驗證,方便下載
ssl._create_default_https_context = ssl._create_unverified_context
# md根路徑
ori_path=r'D:\conference_publication'
pattern = re.compile(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+')  # 網頁地址匹配模式
listdir=os.listdir(ori_path)
# print(listdir)
# 文章名和網頁地址
paper_title=''
pdf_path=''
# 文獻儲存路徑
save_dir=r'D:\conference paper'
# 可訪問的地址 # aclweb可以在手機熱點訪問
access_strings=['aaai.org','dl.acm.org','playbiqdata','pasinit','platanios','muhaochen.github.io','aclweb.org',
                            'arxiv.org','openreview.net','proceedings.mlr.press','semantic-web-journal.net','aidanhogan.com']

# 儲存下載失敗的地址
fail_file=os.path.join(save_dir,'fail_down.txt')
for son_path in listdir: # 遍歷每個會議資料夾
    new_dir=os.path.join(ori_path,son_path) # 生成會議資料夾路徑
    # print('會議資料夾路徑:',new_dir)
    son_listdir=os.listdir(os.path.join(ori_path,son_path)) # 會議資料夾下文章資料夾陣列
    # print('會議文章:',son_listdir)

    for new_son_path in son_listdir: # 遍歷 每個會議資料夾下,每個文章資料夾
        if new_son_path != 'README.md': # 不訪問會議資料夾下的README.md檔案
            file_dir = os.path.join(new_dir, new_son_path) # 生成文章資料夾路徑
            print('文章資料夾路徑:',file_dir)
            file_name=os.listdir(file_dir) # 獲取README檔名稱,發現有一些檔案命名不是很統一
            # print(file_name)
            # print(len(file_name))
            # 如果不是一個檔案,理論上是一個md檔案
            if len(file_name)>1:
                print('該資料夾下不止一個檔案?',file_dir)
            # 如果資料夾下沒有md檔案
            if len(file_name)==0:
                print('該資料夾下沒有檔案:',file_dir)
                continue
            md_file = os.path.join(file_dir, file_name[0])
            # print('文章README檔案路徑:',md_file)
            f=open(md_file,encoding='utf-8')
            for line in f:
                # print(line)
                if '# ' in line:
                    paper_title=line[2:]
                    print('Paper Title: ',paper_title) # 列印一下文章名
                if '**pdf**' in line:
                    url = re.findall(pattern, line)
                    if url[0][-1]=='f':
                        pdf_path=url[0]
                    else:
                        pdf_path=url[0][:-1]
                    print('PDF DownPath: ',pdf_path) # 匹配到的第一個字串,去除最後面的 )
            exist=False
            for sub_string in access_strings:
                if sub_string in pdf_path:
                    exist=True
            if 'ijcai.org' in pdf_path and 'pdf' in pdf_path:
                exist=True
            if 'ijcai.org' in pdf_path and 'pdf' not in pdf_path:
                exist=True
                tail_str=pdf_path[-3:]
                pdf_path=pdf_path[:-3]+'0'+tail_str+'.pdf'
                print('ijcai not pdf new path: ',pdf_path)
            if exist==True:
                paper_title=paper_title.rstrip()
                paper_title=paper_title.replace('\n','')
                paper_title=paper_title.replace(':','_').replace('?','_').replace('!','_').replace('/','_')
                save_file_path=save_dir+'\\'+str(son_path)+'_'+paper_title+'.pdf'
                # 判斷檔案是否存在:
                if os.path.exists(save_file_path) == True:
                    print('已存在')
                    continue
                request.urlretrieve(pdf_path,save_file_path) # 請求下載
            else:
                print('下載失敗...')
                print(paper_title,'  ',pdf_path)
                print(exist)
                failop = open(fail_file, 'a', encoding='utf-8')
                failop.write(paper_title.replace('\n',''))
                failop.write('\n')
                failop.write(pdf_path)
                failop.write('\n')
                failop.write('\n')
                failop.close()
            f.close()

 

相關文章