使用 BeautifulSoup 将网站上的所有图像下载到指定文件夹的 Python 脚本

Posted

技术标签:

【中文标题】使用 BeautifulSoup 将网站上的所有图像下载到指定文件夹的 Python 脚本【英文标题】:Python script to download all images from a website to a specified folder with BeautifulSoup 【发布时间】:2018-12-06 18:09:21 【问题描述】:

我找到this post 并想稍微修改脚本以将图像下载到特定文件夹。我编辑的文件如下所示:

import re
import requests
from bs4 import BeautifulSoup
import os

site = 'http://pixabay.com'
directory = "pixabay/" #Relative to script location

response = requests.get(site)

soup = BeautifulSoup(response.text, 'html.parser')
img_tags = soup.find_all('img')

urls = [img['src'] for img in img_tags]

for url in urls:
    #print(url)
    filename = re.search(r'/([\w_-]+[.](jpg|gif|png))$', url)

    with open(os.path.join(directory, filename.group(1)), 'wb') as f:
        if 'http' not in url:
            url = ''.format(site, url)
        response = requests.get(url)
        f.write(response.content)

这似乎适用于 pixabay,但如果我尝试不同的网站,如 imgurheroimages,它似乎并不适用工作。 如果我将网站声明替换为

site = 'http://heroimages.com/portfolio'

没有下载任何内容。打印语句(未注释时)不打印任何内容,所以我猜它没有找到任何图像标签?我不确定。

另一方面,如果我将网站替换为

site = 'http://imgur.com'

我有时会得到一个

AttributeError: 'NoneType' object has no attribute 'group'

或者,如果图像确实下载,我什至无法打开它们,因为我收到以下错误:

另外值得注意的是,现在脚本要求目录指定的文件夹存在。我计划在将来更改它,以便脚本创建目录,如果它不存在的话。

【问题讨论】:

【参考方案1】:

您需要等待 javascript 加载页面,我认为这是问题所在,如果您愿意,可以使用 selenium

# your imports
...
from selenium import webdriver

site = 'http://heroimages.com/portfolio'
directory = "pixabay/" #Relative to script location

driver = webdriver.Chrome('/usr/local/bin/chromedriver')

driver.get(site)

soup = BeautifulSoup(driver.page_source, 'html.parser')
img_tags = soup.find_all('img')

urls = [img['src'] for img in img_tags]

for url in urls:
    print(url)
    # your code
    ...

输出

# from `http://heroimages.com/portfolio`
https://ssl.c.photoshelter.com/img-get2/I00004gQScPHUm5I/sec=wdtsdfoeflwefms1440ed201806304risXP3bS2xDXil/fill=350x233/361-03112.jpg
https://ssl.c.photoshelter.com/img-get2/I0000h9YWTlnCxXY/sec=wdtsdfoeflwefms1440ed20180630Nq90zU4qg6ukT5K/fill=350x233/378-01449.jpg
https://ssl.c.photoshelter.com/img-get2/I0000HNg_JtT_QrQ/sec=wdtsdfoeflwefms1440ed201806304CZwwO1L641maB9/fill=350x233/238-1027-hro-3552.jpg
https://ssl.c.photoshelter.com/img-get2/I00000LWwYspqXuk/sec=wdtsdfoeflwefms1440ed201806302BP_NaDsGb7udq0/fill=350x233/258-02351.jpg
# and many others images

还有检查目录是否存在的脚本,如果不存在则创建它。

...
directory = os.path.dirname(os.path.realpath(__file__)) + '/pixabay/'    
if not os.path.exists(directory):
    os.makedirs(directory)
...                  

【讨论】:

我曾经使用过 Requests,但它不适用于 JS “延迟”创建的内容,即我会记得查看 selenium :) 你需要什么requests?) 我还添加了检查文件夹是否存在的脚本,如果不存在则创建它。

以上是关于使用 BeautifulSoup 将网站上的所有图像下载到指定文件夹的 Python 脚本的主要内容,如果未能解决你的问题,请参考以下文章

python爬虫beautifulsoup4系列3

如何使用python和beautifulsoup4循环抓取网站中多个页面的数据

使用 BeautifulSoup 查找网页上的特定文本

python爬虫beautifulsoup4系列3转载

如何使用 BeautifulSoup 从网站中获取所有标题?

如何使用 beautifulSoup 从网站中提取和下载所有图像?