javascript 创建的下载链接以打开链接而不是下载链接

kqhtkvqz  于 2022-12-25  发布在  Java
关注(0)|答案(1)|浏览(236)

我使用python selenium抓取chrome中的图片,为了下载图片,我使用下面的代码创建了下载链接:

script_js = 'var imageURL = document.getElementsByTagName("{select_tag}")[{num}].getAttribute("src");' \
            'var link = document.createElement("a"); ' \
            'link.download = "{image_name}";' \
            'link.href = imageURL;' \
            'link.innerHTML = "download";' \
            'document.body.appendChild(link);' \
            'link.click();' \
            'document.body.removeChild(link);' \
            'delete link;'.format(select_tag="img", num=0, image_name=f"{order+1}.jpg")
browser.execute_script(script_js)

我以前在其他网站上用这种方法成功下载过图片。但是这次,它不起作用。
当我创建下载链接并单击它时,浏览器在当前选项卡中打开图像,而不是下载它。
我试着获取页面中单个图像的url,并在新标签页中打开它,然后,我用同样的方法创建了下载链接,发现它起作用了。
我很好奇为什么不能在原始页面下载。既然这些图片需要登录才能查看,这是一种防刮擦方法吗?
有没有办法创建一个下载链接,下载成功,在原来的网页?
我很抱歉,我不能提供原来的网站,因为它需要登录。
哦,我忘了提到图像的src属性看起来像这样:“img/a175/321 F2061 A9895..."。所以,我认为图像是从同一个起源服务的。

e4yzc0pl

e4yzc0pl1#

如果你能看到它,你可以直接下载它,或者通过图片本身的截图下载它。你可以使用SeleniumBase(Python框架)来完成它。pip install seleniumbase,然后用pythonpytest运行下面的脚本。
第一个测试直接从网站下载图片,第二个测试只截取图片的小屏幕截图,然后保存。

"""Use SeleniumBase to download images and verify."""
import os
from seleniumbase import BaseCase

class DownloadImages(BaseCase):
    def test_download_images_directly(self):
        self.open("https://seleniumbase.io/help_docs/chart_maker/")
        img_elements_with_src = self.find_elements("img[src]")
        unique_src_values = []
        for img in img_elements_with_src:
            src = img.get_attribute("src")
            if src not in unique_src_values:
                unique_src_values.append(src)
        print()
        for src in unique_src_values:
            if src.split(".")[-1] not in ["png", "jpg", "jpeg"]:
                continue
            self.download_file(src)  # Goes to downloaded_files/
            filename = src.split("/")[-1]
            self.assert_downloaded_file(filename)
            folder = "downloaded_files"
            file_path = os.path.join(folder, filename)
            self._print(file_path)

    def test_download_images_via_screenshot(self):
        self.open("seleniumbase.io/error_page/")
        img_elements_with_src = self.find_elements("img[src]")
        unique_src_values = []
        for img in img_elements_with_src:
            src = img.get_attribute("src")
            if src not in unique_src_values:
                unique_src_values.append(src)
        print()
        count = 0
        for src in unique_src_values:
            self.open(src)
            if not self.headless and not self.headless2:
                self.highlight("img", loops=1)
            image = self.find_element("img")
            if src.startswith("data:") or ";base64" in src:
                # Special Cases: SVGs, etc. Convert to PNG.
                count += 1
                filename = "svg_image_%s.png" % count
            else:
                filename = src.split("/")[-1]
            folder = "downloaded_files"
            file_path = os.path.join(folder, filename)
            image.screenshot(file_path)
            self.assert_downloaded_file(filename)
            self._print(file_path)

if __name__ == "__main__":
    from pytest import main
    main([__file__])

这是它的当前输出:(如果这些网站发生变化,下载的图像也可能发生变化。)

downloaded_files/logo3c.png
downloaded_files/logo6.png
downloaded_files/sample_pie_chart.png
downloaded_files/sample_column_chart.png
downloaded_files/sample_bar_chart.png
downloaded_files/sample_line_chart.png
downloaded_files/sample_area_chart.png
downloaded_files/multi_series_chart.png
.
downloaded_files/svg_image_1.png
downloaded_files/svg_image_2.png
downloaded_files/svg_image_3.png
downloaded_files/svg_image_4.png
downloaded_files/svg_image_5.png
downloaded_files/svg_image_6.png
downloaded_files/svg_image_7.png
downloaded_files/svg_image_8.png
downloaded_files/svg_image_9.png
downloaded_files/svg_image_10.png
downloaded_files/svg_image_11.png

相关问题