【发布时间】:2021-06-19 14:30:16
【问题描述】:
在此之前添加一个新人警告之类的东西。我目前正在尝试从 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
【问题讨论】:
标签: python html selenium beautifulsoup youtube