簡體   English   中英

從 csv url 列表下載大量 pdf 文件

[英]Download large amount of pdf files from csv url list

我有一個 csv 文件,其中包含 95k url 鏈接,這些鏈接都是 pdf 文件。 我使用 selenium 首先登錄到頁面,然后循環通過文件觸發下載到我的文件中。

這是我的簡單代碼

download_dir=r"C:\Users\Me\Downloads\pdfs"
    
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:\Users\Me\Downloads\chromedriver_win32\chromedriver.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:\Users\Me\Documents\csvTest.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在下載文件時是一種過度殺傷力,盡管有時它是唯一有效的方法。

對我來說最好使用的是requests with multiprocessing 為此,請創建一個 function 下載給定 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 列表創建線程和 map 即 function:

from multiprocessing.pool import ThreadPool
n = 10 #Number of threads

results = ThreadPool(n).imap_unordered(downloader, urls)
for file in results:
    print(file)

我相信這個過程可以大大加快速度。 您可以通過谷歌搜索“python 並行下載文件”找到更多信息。

You might wanna take a look at threading, but you would have to transform the script on multiple functions ( https://docs.python.org/3/library/threading.html , https://realpython.com/intro-to -python線程/

關於實現它,我認為您可以啟動一個線程,僅用於在不同的選項卡和其他線程中打開 URL 以下載信息,關閉選項卡和 go 到下一個。 這樣,我認為腳本可以執行得更快,您還可以禁用 chrome GUI 以添加一些額外的性能:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM