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()
你这个问题,有三种可能
第一种是绝对路径,个人建议可以把项目拷贝到指定盘目录,然后用英文不要用中文
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; 扩展: