自動下載MarkDown格式會議論文的程式
近期師兄發給我一個壓縮包讓我整理文獻,而我發現壓縮包里的內容是這樣:
這樣:
和這樣的:
我大概看了一下,可能有270多篇文章是這種格式,俗話說的好,沒有困難的工作,只有勇敢的研究僧。所以決定用Python自己寫一個腳本。
儘管這個程式還有許多不足之處:1)對於文件很大的時候會只下載一個18kb左右的無法打開文件;2)程式中間出現網路或者文件異常,沒有對異常進行處理;3)因為md文件裡面的pdf文章地址,有的打開是網站、有的打開可以直接下載,有的打開是pdf文件……,所以還需要人工去分一下哪一類域名下的網址可以直接下載或是pdf文件,一共可能也就20種以內,列印一下選幾個關鍵詞判斷一下就行。
這個程式的主要思想:1)利用Python對文件夾和文件進行遍歷;2)讀取md文件內容並且根據# 標識識別文章標題,利用「pdf」和正則表達式識別出pdf下載的地址;3)使用urllib庫的urlretrieve對指定網址的資源文件進行下載到指定文件夾。
結果:實現173篇文章的自動下載,並將無法下載的文章名和網址保存在相關的文件內。最後希望能夠對你產生幫助,如果有幫助可以點個贊。
程式碼如下:
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:\User\Weiming\Desktop\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:\User\Weiming\Desktop\conference paper' # 可訪問的地址 access_strings=['aaai.org','dl.acm.org','playbiqdata','pasinit','platanios','muhaochen.github.io', '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) pdf_path=url[0][:-1] print('PDF DownPath: ',pdf_path) # 匹配到的第一個字元串,去除最後面的 ) exist=0 for sub_string in access_strings: if sub_string in pdf_path: exist=1 if exist==1: 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) 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()