簡體   English   中英

Python Selenium 使用 ChromeDriver 下載圖像(jpeg、png)或 PDF

[英]Python Selenium download images (jpeg, png) or PDF using ChromeDriver

我有一個 Python 中的 Selenium 腳本(在 Windows 上使用 ChromeDriver),它從頁面中獲取各種附件(不同文件類型)的下載鏈接,然后打開這些鏈接以下載附件。 這適用於 ChromeDriver 默認下載時無法預覽的文件類型。 但是默認情況下會預覽圖像(JPEG、PNG)和 PDF,因此不會自動下載。

我目前使用的 ChromeDriver 選項(適用於不可預覽的文件):

chrome_options = webdriver.ChromeOptions()
prefs = {'download.default_directory' : 'custom_download_dir'}
chrome_options.add_experimental_option('prefs', prefs)
driver = webdriver.Chrome("./chromedriver.exe", chrome_options=chrome_options)

這會將文件下載到“custom_download_dir”,沒有問題。 但是可以預覽的文件只是在 ChromeDriver 實例中預覽而不是下載。

是否有任何 ChromeDriver 設置可以禁用此預覽行為並直接下載所有文件而不管擴展程序如何?

如果沒有,例如可以使用 Firefox 來完成嗎?

我將使用圖像 url 來實現更通用的解決方案,而不是依賴特定的瀏覽器/驅動程序選項來執行下載。

您可以使用類似的代碼獲取圖像 URL:

driver.find_element_by_id("your-image-id").get_attribute("src")

然后我會使用例如 urllib 下載圖像。

這是 Python2 的一些偽代碼:

import urllib

url = driver.find_element_by_id("your-image-id").get_attribute("src")
urllib.urlretrieve(url, "local-filename.jpg")

Python3 也是如此:

import urllib.request

url = driver.find_element_by_id("your-image-id").get_attribute("src")
urllib.request.urlretrieve(url, "local-filename.jpg")

在評論后編輯,這是另一個關於如何在知道其 URL 后下載文件的示例:

import requests
from PIL import Image
from io import StringIO

image_name = 'image.jpg'
url = 'http://example.com/image.jpg'

r = requests.get(url)

i = Image.open(StringIO(r.content))
i.save(image_name)

使用selenium-wire庫,可以通過ChromeDriver下載圖像。

我定義了以下函數來解析每個請求,並在必要時將請求正文保存到文件中。

import os
from mimetypes import guess_extension
from seleniumwire import webdriver

def download_assets(requests, asset_dir="temp", default_fname="untitled", exts=[".png", ".jpeg", ".jpg", ".svg", ".gif", ".pdf", ".ico"]):
    asset_list = {}
    for req_idx, request in enumerate(requests):
        # request.headers
        # request.response.body is the raw response body in bytes
        ext = guess_extension(request.response.headers['Content-Type'].split(';')[0].strip())
        if ext is None or ext not in exts:
            #Don't know the file extention, or not in the whitelist
            continue

        # Construct a filename
        fname = os.path.basename(request.url.split('?')[0])
        fname = "".join(x for x in fname if (x.isalnum() or x in "._- "))
        if fname == "":
            fname = f"{default_fname}_{req_idx}"
        if not fname.endswith(ext):
            fname = f"{fname}{ext}"
        fpath = os.path.join(asset_dir, fname)

        # Save the file
        print(f"{request.url} -> {fpath}")
        asset_list[fpath] = request.url
        with open(fpath, "wb") as file:
            file.write(request.response.body)
    return asset_list

讓我們從谷歌主頁下載一些圖像到temp文件夾。

# Create a new instance of the Chrome/Firefox driver
driver = webdriver.Chrome()

# Go to the Google home page
driver.get('https://www.google.com')

# Download content to temp folder
asset_dir = "temp"
os.makedirs(asset_dir, exist_ok=True)
download_assets(driver.requests, asset_dir=asset_dir)

driver.close()

請注意,可以改進該功能,以便也可以保留目錄結構。

這是另一種簡單的方法,但上面@Pitto 的回答稍微簡潔一些。

import requests

webelement_img = ff.find_element(By.XPATH, '//img')
url = webelement_img.get_attribute('src') or 'https://someimages.com/path-to-image.jpg'
data = requests.get(url).content
local_filename = 'filename_on_your_computer.jpg'

with open (local_filename, 'wb') as f:
    f.write(data)

暫無
暫無

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

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