2017-05-23 4 views
1

Ich habe ein Programm geschrieben, um pdf-Dateien von arxiv.org herunterzuladen. Es wird kein Download-Bot sein, aber ich benutze es im Moment, um mein Programm zum Laufen zu bringen. Wenn ich es zum Laufen bekomme, kann es ein generischer Code sein. Bitte lesen Sie die Bot-Warnung auf arxiv.org, wenn Sie beabsichtigen, den Code zu verwenden. Sie beziehen sich auf Amazon für den Massen-Download.Python3.6 - Überprüfen, ob die Datei im lokalen Ordner ist, bevor der Download aus dem Internet funktioniert

Da ich nicht die gleiche Datei zweimal herunterladen möchte, überprüfe ich, ob es sich bereits auf dem Computer im Ordner der Python-Datei befindet. Das Problem ist, dass es nicht richtig funktioniert, weil das Programm manchmal Dateien auf der Festplatte erkennt und nicht herunterlädt, aber manchmal lädt es die Dateien erneut herunter.

Es bedeutet, ich glaube der Code etwas zu tun, aber es tut etwas anderes.

Der folgende Code:

import requests 
from bs4 import BeautifulSoup 
import re 
import os 
import os.path 

axx= '.pdf' 

# specify the URL of the archive here 
archive_url = "https://arxiv.org/list/quant-ph/new" 
def get_links(): 

    # create response object 
    r = requests.get(archive_url) 

    # create beautiful-soup object 
    soup = BeautifulSoup(r.content,'html5lib') 

    # find all links on web-page 
    links = soup.findAll('a', attrs = {'title' : 'Download PDF'}) 
    #take out the numbering of pdf-files on arxiv. 
    #links = re.findall(('\d+'+'.'+'\d+'), links) 
    # filter the link sending with .mp4 or other file type 
    '''' 
    source 1 
    https://arxiv.org/list/math/new 
    html = a href="/pdf/1705.04681" title="Download PDF">pdf</a> 

    source 2 
    ''' 
    #_links = [archive_url + link['href'] for link in links if link['href'].endswith('mp4')] 
    file_links = ['https://arxiv.org'+link['href'] for link in links if link['href']+axx] 

    #rinse duplicates fomr list if file already is on harddrive 
    file_links = list(set(file_links)) 


    for link in file_links: 
     if os.path.isfile(os.getcwd()+'/'+link.split('/')[-1]+axx) == True: 
          file_links.remove(link)    
     else: 
      return file_links 

def download_series(file_links): 
    for link in file_links: 

     # obtain filename by splitting url and getting 
     # last string 
     file_name = (link.split('/')[-1]+axx) 
     print("Downloading file:%s"%file_name) 

     # create response object 
     r = requests.get(link, stream = True) 

     # download started 
     with open(file_name, 'wb') as f: 
      for chunk in r.iter_content(chunk_size = 2048*2048): 
       if chunk: 
        f.write(chunk) 

     print("%s downloaded!\n"%file_name) 
    print("All files downloaded!") 
    return 


if __name__ == "__main__": 
    # getting all pdf links 
    file_links = get_links() 
    # download all pdfs 
    download_series(file_links) 

Antwort

1

Die for-Schleife in get_links entfernt lokale Dateien, kehrt sonst alle file_links. Ich denke, get_links sollte eine Liste von pdfs zum Download zurückgeben (wenn nicht auf der Festplatte gefunden). Beispiel:

file_links = list(set(file_links)) 
return [ 
    link for link in file_links 
    if not os.path.isfile(os.getcwd()+'/'+link.split('/')[-1]+axx) 
] 
Verwandte Themen