我是否可以在查看预览时加载原始大小的预览图像(BeautifulSoup Python)



用一个新家伙警告之类的话作为开头。我目前正试图从youtube上为一个个人挑战项目抓取图片,特别是某些频道的社区标签中的图片。我想制作一个能够下载社区选项卡中使用的每个图像的脚本。到目前为止,我遇到了一些问题,但目前我有一些功能代码可以从屏幕上下载前几张图像(我知道我可以从selenium实现滚动功能,但我还没有专注于此(。

我已经设法刮去了页面上图像的所有URL,但结果发现它们都是600x600像素,而不是原始图像。我不确定这些图片的确切术语是什么,但我只想把它们称为预览图片。不幸的是,我在bs4中没有看到任何简单的选项来找到原始图像,但我有几个想法,我只是很确定如何实现。

第一个想法是,如果我点击页面上的图像,它会将我加载到另一个带有原始图像的url,我会获取url并下载它,这没有问题。唯一的问题是,我似乎找不到一种方法让我的代码打开页面下载原始文件,因为我在html中找不到它的链接。然而,这是我第二天尝试浏览html,所以我很可能会错过一些简单的东西。如果可以的话,我想实现到我当前的代码中会很容易,因为我只需要循环浏览每个图像。

其次,我有一个名为";Hoverzoom";用于我的浏览器,当我将光标悬停在预览上时,它会显示原始图像。这有点离谱,但我认为如果这个插件可以做到的话,有某种方法可以直接从预览中找到原始图像,但我对任何可以做到这一点的库或代码都不知所措。

在下面附上我的代码,任何帮助都将不胜感激!我知道我的一些代码有点奇怪,但我找不到更简单的方法来下载图像,因为有时提取的url会缺少";https:";我不确定如何以优雅的方式修复它。如果你知道我该怎么解决这个问题,我会很喜欢的!再次感谢!

import os
from bs4 import BeautifulSoup
from selenium import webdriver
import urllib.request as req
site = 'https://www.youtube.com/c/tolariancommunity/community'
directory = os.path.dirname(os.path.realpath(__file__)) + '/pictures/'
if not os.path.exists(directory):
os.makedirs(directory)
driver = webdriver.Chrome('./chromedriver.exe')
driver.get(site)
soup = BeautifulSoup(driver.page_source, 'html.parser')
img_tags = soup.find_all('img',{"src":True})
urls = [img['src'] for img in img_tags]
defective_urls = []
res = []
for i in urls:
if i not in res:
res.append(i)
urls = res
for i in urls:
if i.startswith("https://"):
pass
else:
defective_urls = defective_urls + [i]
urls.remove(i)
defective_urls[:] = [s.replace('//', 'https://') for s in defective_urls]
urls = urls + defective_urls
count = 1
for i in urls:
req.urlretrieve(i, "%s.png" % count)
count = count + 1

以此图像为例:

https://yt3.ggpht.com/hyDJwLOZcpo5QJQCCrg8FxCZvV7LsMK1G43SibcPzP8eqshsSkSCB5s44CtKXZJrZhh8zFGOSaMD=s679-c-fcrop64=1421a0000bfb2ffff nd

它打开一个679 x679

您似乎可以使用URL中=之后的内容来控制大小。

s679-c-fcrop64=1,421a0000bfb2ffff-nd

你可以把它缩小到:s679,你就会得到同样的图像。

如果将679更改为2000,例如

https://yt3.ggpht.com/hyDJwLOZcpo5QJQCCrg8FxCZvV7LsMK1G43SibcPzP8eqshsSkSCB5s44CtKXZJrZhh8zFGOSaMD=s2000

您得到的图像相同,但大小为1384 x 679像素。

因此,看起来使用了这个s值,并且它返回了大小最接近的匹配。

最新更新