近期師兄發給我一個壓縮包讓我整理文獻,而我發現壓縮包裡的內容是這樣:
這樣:
和這樣的:
我大概看了一下,可能有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()