使用 CSV 文件和 python 的多图像下载器

multiple image downloader using CSV file and python

我遇到此代码错误。任何人都可以帮助我,以便我可以自动下载包含所有图像 URL 的 CSV 文件中的所有图像吗?

我得到的错误是:

        URLError                                  Traceback (most recent call last)
      <ipython-input-320-dcd87f841181> in <module>
         19         urlShort = re.search(filejpg, str(r)).group()
         20         print(urlShort)
    ---> 21         download(x, f'{di}/{urlShort}')
         22         print(type(x))
         URLError: <urlopen error unknown url type: {'https>

这是我使用的代码:

from pathlib import Path
from shutil import rmtree as delete
from urllib.request import urlretrieve as download
from gazpacho import get, Soup
import re
import pandas as pd
import numpy as np


#import data
df = pd.read_csv('urlReady1.csv')
df.shape
#locate folder
di = 'Dubai'
Path(di).mkdir(exist_ok=True)

#change data to dict
dict_copy = df.to_dict('records')

#iterate over every row of the data and download the jpg file
for r in dict_copy:
    if r == 'urlready':
        print("header")
    else:
        x = str(r)
        filejpg = "[\d]{1,}\.jpg"
        urlShort = re.search(filejpg, str(r)).group()
        print(urlShort)
        download(x, f'{di}/{urlShort}')
        print(type(x))

我看不到你的数据集,但我认为 pandas to_dict('records') 正在返回给你一个字典列表(你存储为 dict_copy)。然后,当您使用 for r in dict_copy: 遍历它时,r 不是 URL,而是以某种方式包含 URL 的字典。所以 str(r) 将该字典 {<stuff>} 转换为 '{<stuff>}',然后您将其作为 URL.

发送

我认为这就是您看到错误的原因 URLError: <urlopen error unknown url type: {'https>

在 df 转储之后(print(dict_copy)dict_copy = df.to_dict('records') 之后)和迭代开始时(print(r)for r in dict_copy: 之后)将帮助您了解正在发生的事情以及 test/confirm 我的假设。

感谢您添加示例数据!所以 dict_copy 类似于 [{'urlReady': 'mobile.****.***.**/****/43153.jpg'}, {'urlReady': 'mobile.****.***.**/****/46137.jpg'}]

所以是的,dict_copy 是一个字典列表,看起来像 'urlReady' 作为键,URL 字符串作为值。因此,您想使用该键从每个字典中检索 url 。最好的方法可能取决于诸如数据中是否有没有有效 URLs 的东西等。但这可以帮助您入门并提供一些数据视图以查看是否有任何异常:

for r in dict_copy:
    urlstr = r.get('urlReady', '') # .get with default return of '' means you know you can use string methods to validate data
    print('\nurl check: type is', type(urlstr), 'url is', urlstr)
    if type(urlstr) == str and '.jpg' in urlstr: # check to make sure the url has a jpg, you can replace with `if True` or another check if it makes sense
        filejpg = "[\d]{1,}\.jpg"
        urlShort = re.search(filejpg, urlstr).group()
        print('downloading from', urlstr, 'to', f'{di}/{urlShort}')
        download(urlstr, f'{di}/{urlShort}')
    else:
        print('bad data! dict:', r, 'urlstr:', urlstr)