当前位置: 首页 > 知识库问答 >
问题:

python - 明明有这个文件为什么还报错?

吴浩皛
2024-12-18

image.png
image.png

import io
import random
from pathlib import Path
from time import sleep, perf_counter

import requests
from PIL import Image
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service as ChromeService

from bulk_rename import bulk_rename


def next_image() -> None:
    try:
        sleep(random.random())
        driver.execute_script("document.getElementsByClassName('_afxw')[0].click();")
        sleep(2 + random.random())
    except Exception as e:
        print(f'Exception: {e}')

def get_image_urls() -> list[str]:
    """Get all image urls in the current page"""
    return driver.execute_script(
        "let urls = []; \
        let n = document.getElementsByClassName('x5yr21d xu96u03 x10l6tqk x13vifvy x87ps6o xh8yej3'); \
        urls.push(n[0].getAttribute('src'), n[1].getAttribute('src'), n[2].getAttribute('src')); \
        return urls;"
    )

def download_image(url: str, name: str, download_path: str | Path) -> None:
    """Download image to the folder"""
    try:
        image_content = requests.get(url).content
        image_file = io.BytesIO(image_content)
        image = Image.open(image_file)
        file_path = Path(download_path, name)
        with open(file_path, 'wb') as f:
            image.save(f, 'JPEG')
    except Exception as e:
        print(f"Can't save image {name}, {url = }")
        print(f'Exception: {e}')

# Initialize Selenium
time_start = perf_counter()
options = webdriver.ChromeOptions() 
options.add_argument('--start-maximized')
driver = webdriver.Chrome(
    service=ChromeService(ChromeDriverManager().install()),
    options=options
)

# Make folder 'Downloaded' if not exist
folder_name = 'Downloaded'
download_folder = Path(folder_name)
if not download_folder.exists():
    download_folder.mkdir()

with open('urls.txt', 'r') as f:
    data = f.read()

urls = [url for url in data.splitlines() if url]

# Main program
bulk_rename(folder_name)  # Bulk-rename to prevent overwrite other images
name = len(list(download_folder.glob('*'))) + 1
for url in urls:
    image_urls_in_post = set()
    driver.get(url)
    sleep(random.random()*2 + 5)  # Wait for fully loaded
    n_images = driver.execute_script("return document.getElementsByClassName('_acnb').length;")

    try:
        sleep(random.random()*1 + 2)
        if n_images == 0:  # Handle when the post has 1 image only
            image_urls = get_image_urls()
            download_image(image_urls[0], f'{name}.jpg', download_folder)
            name += 1
        elif n_images <= 3:
            if n_images == 3:  # All images will be loaded if go to the next image
                next_image()

            image_urls = get_image_urls()
            for i in range(n_images):
                download_image(image_urls[i], f'{name+i}.jpg', download_folder)
            name += n_images 
        else:
            # TODO - Fix: sometimes downloaded irrelevent images
            image_urls_in_post = set()
            for i in range(n_images - 1):
                next_image()
                image_urls_in_post.update(get_image_urls())
            
            for url in image_urls_in_post:
                download_image(url, f'{name}.jpg', download_folder)
                name += 1

    except Exception as e:
        print(f'Exception: {e}')
        continue

print(f'Done, took {(perf_counter() - time_start) / 60:4} mins.')
driver.quit()

共有1个答案

冯亮
2024-12-18

你这个问题,有三种可能
第一种是绝对路径,个人建议可以把项目拷贝到指定盘目录,然后用英文不要用中文
C:\Users\a5735\OneDrive\桌面\python\instagram-downloader\urls.txt这个路径不太友好

with open(r'C:\Users\a5735\OneDrive\桌面\python\instagram-downloader\urls.txt', 'r') as f:

第二种的话是文件权限问题

确认程序有权限读取该文件。

第三种编码问题

with open('urls.txt', 'r', encoding='utf-8') as f:
 类似资料:
  • 问题内容: 我正在从我的一个类中执行Java二进制文件,并且抛出ClassNotFoundException: Geoline类位于/home/geo/Geoline.java。关键是,无论我位于文件系统中的哪个位置,如果我手动执行相同的命令,都将执行该类。使用Runtime.getRuntime()。exec执行二进制文件时,为什么不会发生相同的事情? 编辑:这是在verbose标记上生成的输出

  • [错误]COM的父POM不可解析。示例:DynamoWork:0.0.1-快照:无法传输项目org.springframework.boot:spring-boot-starter-parent:POM:2.1.0。从/到项目发布(https://repo.maven.apache.org/maven2/):sun.security.validator.validatorexception:PKI

  • 问题内容: 在JDK 1.7中,存在一个声明。 他们为什么要制造新的而不使用: 问题答案: 因为通过返回的 后盾 给定的数组。它包装该数组;数组的更改反映在中,反之亦然。 另外,因此,返回的此处具有固定大小。因此,它不能是因为可以增长或收缩。

  • 问题内容: public class SomeClass { private HashSet contents = new HashSet (); private Set contents2 = new HashSet (); } 有什么不同?最终它们都是不是吗?第二个对我来说似乎是错误的,但是我看到它经常被使用,接受和工作。 问题答案: 是一个接口,并且是实现该接口的类。 将变量声明为类型意味着

  • 当用户键入以下内容的答案时:system.out.println(“键入数字”); 它不会继续到我的代码的下一部分。

  • 问题内容: 我这里哪里错了? 上面的代码抛出一个。 问题答案: Python没有变量声明,因此它必须弄清楚变量本身的范围。它是通过一个简单的规则来做到这一点的:如果在函数内部对变量进行了赋值,则该变量被视为局部变量。[1] 因此, 隐式地使本地化不过,尝试执行此行将尝试在分配本地变量之前读取它的值,从而导致。[2] 如果是全局变量,则关键字将有所帮助。如果是局部函数和局部变量,则可以在Python

  • 问题内容: 我要选择不是特定类后代的跨度,我们称其为“否”。这是我的CSS: 这是HTML 两个问题: 为什么我的CSS同时适用于是1和否2? 如果切换到通用选择器,为什么整个过程都会中断? 问题答案: 元素的两个父元素都不具有class ,无论其他祖先是否都具有class :

  • 本文向大家介绍rgba()和opacity这两个的透明效果有什么区别呢?相关面试题,主要包含被问及rgba()和opacity这两个的透明效果有什么区别呢?时的应答技巧和注意事项,需要的朋友参考一下 1. 是属性,是函数,计算之后是个属性值; 2. 作用于元素和元素的内容,内容会继承元素的透明度,取值0-1; 3. 一般作为背景色 或者颜色 的属性值,透明度由其中的 值生效,取值0-1; 扩展: