美汤刮"lazy faded"图片



我正在寻找一种方法来解析网页上的图像。关于这个主题已经有很多帖子了,我受到了许多帖子的启发,特别是:如何用Python从网站下载图片

在这篇文章中呈现的脚本工作得很好,但我遇到了一种类型的图像,我不能自动保存。在网站上,检查网页给了我:

<img class="lazy faded" data-src="Uploads/Media/20220315/1582689.jpg" src="Uploads/Media/20220315/1582689.jpg">

当我用Beautifulsoup4解析页面时,我得到这个(fonts.gstatic.com源部分内容):

<a class="ohidden" data-size="838x1047" href="Uploads/Media/20220315/1582689.jpg" itemprop="contentUrl">
<img class="lazy" data-src="Uploads/Media/20220315/1582689.jpg" />
</a>

给定的URL不是可用于从任何地方下载图像的批量web URL,而是指向"来源"的链接。网页的一部分(网页上的CTRL + MAJ + I),图像在其中。

当我把鼠标放在网站源代码的src链接上时,我可以在"当前源"下得到真正的批量url。这些信息位于DevTools的元素/属性(网页上的CTRL + MAJ + I)中,但我不知道如何自动保存图像,要么直接使用链接访问网页源,要么访问批量地址下载图像。你有什么主意吗?

PS:我找到了这篇关于懒惰褪色图像的文章,但是我的html知识不足以找到解决我的问题的方法(https://davidwalsh.name/lazyload-image-fade)

我不太熟悉网页抓取及其好处。然而,我在这里找到了这篇文章,你可以参考,我希望它能帮助!参考

然而,这里是代码和所有你需要的东西在一个地方。

首先你必须找到你想要下载图片的网页,这是你的决定。

现在我们必须获得图像的url,创建一个空列表,打开它,选择它们,循环遍历它们,然后附加它们。

url = ""
link_list[]
response = urllib.request.urlopen(url)
soup = BeautifulSoup(response, "html.parser")
image_list = soup.select('div.boxmeta.clearfix > h2 > a')
for image_link in image_list:
link_url = image_link.attrs['href']
link_list.append(link_url)

这理论上应该寻找任何链接图像到网站的href标签,然后将它们附加到该列表中。

现在我们必须得到图像文件的标签。

for page_url in link_list:
page_html = urllib.request.urlopen(page_url)
page_soup = BeautifulSoup(page_html, "html.parser")
img_list = page_soup.select('div.seperator > a > img')

这应该找到所有与主div类分离的div标签,寻找一个a标签,然后是img标签。

for img in img_list:
img_url = (img.attrs['src'])
file_name = re.search(".*/(.*png|.*jpg)$", img_url)
save_path = output_folder.joinpath(filename.group(1))

现在我们将尝试使用try except方法下载该数据。

try:
image = requests.get(img_url)
open(save_path, 'wb').write(image.content)
print(save_path)
except ValueError:
print("ValueError!")

我想你说的是相对路径和绝对路径。

Uploads/Media/20220315/1582689.jpg这样的东西是相对路径。

绝对路径和相对路径的主要区别在于绝对url总是包含http://www站点的域名。相对链接显示文件的路径或引用文件本身。相对URL在站点内用于在同一域内将用户从一点转移到另一点。——ref。

那么在你的情况下,试试这个:

import requests
from bs4 import BeautifulSoup
from PIL import Image
URL = 'YOUR_URL_HERE'
r = requests.get(URL)
soup = BeautifulSoup(r.text, 'html.parser')
for img in soup.find_all("img"):

# Get the image absolute path url
absolute_path = requests.compat.urljoin(URL, img.get('data-src'))

# Download the image
image = Image.open(requests.get(absolute_path, stream=True).raw)
image.save(absolute_path.split('/')[-1].split('?')[0])

最新更新