从csv url列表下载大量pdf文件



我有一个csv文件,它有95k个url链接,这些链接都是pdf文件。我使用selenium首先登录到页面,然后循环浏览文件以触发下载到我的文件中。

这是我的简单代码

download_dir=r"C:UsersMeDownloadspdfs"

chrome_options = Options()
chrome_options.add_experimental_option('prefs',  {
"download.default_directory": download_dir,
"download.prompt_for_download": False,
"download.directory_upgrade": True,
"plugins.always_open_pdf_externally": True
}
)
driver = webdriver.Chrome(executable_path=r"C:UsersMeDownloadschromedriver_win32chromedriver.exe",options = chrome_options)                     
driver.get('https://url.com/')
username = driver.find_element_by_id("email")
password = driver.find_element_by_id("password")
username.send_keys("email@domain.com")
password.send_keys("password")
driver.find_element_by_name("Login_Button").click()
driver.find_element_by_name("company").click()
driver.find_element_by_name("Continue_Button").click()
with open(r'C:UsersMeDocumentscsvTest.csv', newline='', encoding='utf-8-sig') as csvfile:
csv_reader = csv.reader(csvfile)

for row in csv_reader:
pdfUrl = row[0]
driver.get(pdfUrl)

目前,它正在一个接一个地执行,大约每小时1500个文件。我读过关于多处理的文章,但我不熟悉如何实现它,而且考虑到正在启动的单个驱动程序,我不确定是否有可能在这里实现它。有没有办法触发n个文件的批量下载?而不是一个接一个地下载。

大多数情况下,selenium在下载文件时是一种过度使用,尽管有时它是唯一有效的方法。

对我来说,最好使用的是requestsmultiprocessing。为此,创建一个函数来下载给定url的文件(如果需要,还可以下载目标文件(:

import requests
import time
def downloader(url):
filename = url.split('/')[-1]
if not os.path.exists(filename):
print('File already exists')
return
for _ in range(5):
try:
r = requests.get(url, stream=True)
break
except:
time.sleep(5)
else:
print ('Could not fetch file')
return
if r.status_code == 200:
with open(filename, 'wb') as f:
for chunk in r:
f.write(chunk)
return filename

然后创建线程并用url列表映射该函数:

from multiprocessing.pool import ThreadPool
n = 10 #Number of threads
results = ThreadPool(n).imap_unordered(downloader, urls)
for file in results:
print(file)

我相信这个过程可以大大加快速度。你可以在谷歌上找到更多的信息;python并行下载文件";。

您可能想了解线程,但您必须在多个函数上转换脚本(https://docs.python.org/3/library/threading.html,https://realpython.com/intro-to-python-threading/)

关于实现它,我认为你可以启动一个线程,只用于在不同的选项卡中打开url,其他线程下载信息,关闭选项卡并转到下一个。这样,我认为脚本可以执行得更快,你也可以禁用chrome GUI来增加一些额外的性能,使用:

options.add_argument('--headless')
options.add_argument("--disable-gpu")

最新更新