Python3.6 - 在从 Internet 下载之前检查文件是否在本地文件夹中无法正常工作
Python3.6 - checking if file is in local folder before downloading from internet does not work properly
我编写了一个从 arxiv.org 下载 pdf 文件的程序。它不会是一个下载机器人,但我现在用它来让我的程序运行。如果我让它工作,它可以是一个通用代码。如果您打算使用该代码,请阅读 arxiv.org 上的机器人警告。他们参考亚马逊进行批量下载。
因为我不想下载同一个文件两次,所以我检查它是否已经在计算机上的 python 文件的文件夹中。问题是它不能正常工作,因为有时程序会识别硬盘上的文件而不会下载,但有时会再次下载文件。
这意味着我相信代码会做某事,但它会做其他事情。
代码如下:
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)
get_links
中的 for 循环删除本地文件,否则 return 全部 file_links
。我认为 get_links
应该 return 要下载的 pdf 列表(如果在磁盘上找不到)。示例:
file_links = list(set(file_links))
return [
link for link in file_links
if not os.path.isfile(os.getcwd()+'/'+link.split('/')[-1]+axx)
]
我编写了一个从 arxiv.org 下载 pdf 文件的程序。它不会是一个下载机器人,但我现在用它来让我的程序运行。如果我让它工作,它可以是一个通用代码。如果您打算使用该代码,请阅读 arxiv.org 上的机器人警告。他们参考亚马逊进行批量下载。
因为我不想下载同一个文件两次,所以我检查它是否已经在计算机上的 python 文件的文件夹中。问题是它不能正常工作,因为有时程序会识别硬盘上的文件而不会下载,但有时会再次下载文件。
这意味着我相信代码会做某事,但它会做其他事情。
代码如下:
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)
get_links
中的 for 循环删除本地文件,否则 return 全部 file_links
。我认为 get_links
应该 return 要下载的 pdf 列表(如果在磁盘上找不到)。示例:
file_links = list(set(file_links))
return [
link for link in file_links
if not os.path.isfile(os.getcwd()+'/'+link.split('/')[-1]+axx)
]