programing

urlib 및 python을 통한 사진 다운로드

goodsources 2022. 9. 5. 23:20
반응형

urlib 및 python을 통한 사진 다운로드

그래서 저는 웹툰을 다운로드해서 바탕화면의 폴더에 넣는 Python 스크립트를 만들려고 합니다.비슷한 일을 하는 비슷한 프로그램을 몇 개 찾았지만, 제가 필요한 것과 비슷한 것은 없었습니다.가장 비슷한 것을 발견한 것은 바로 여기(http://bytes.com/topic/python/answers/850927-problem-using-urllib-download-images))입니다.이 코드를 사용해 보았습니다.

>>> import urllib
>>> image = urllib.URLopener()
>>> image.retrieve("http://www.gunnerkrigg.com//comics/00000001.jpg","00000001.jpg")
('00000001.jpg', <httplib.HTTPMessage instance at 0x1457a80>)

그 후 컴퓨터에서 "00000001.jpg" 파일을 검색했지만 캐시된 사진만 발견했습니다.내 컴퓨터에 파일을 저장했는지도 모르겠어.파일을 다운로드 받는 방법을 알게 되면 나머지는 어떻게 처리해야 할지 알 것 같아요.기본적으로 for loop을 사용하여 00000000.'.jpg'에서 문자열을 분할하고 00000000을 최대값까지 늘리면 됩니다.이것은 어떻게든 판단해야 할 것입니다.이를 위한 최선의 방법 또는 파일을 올바르게 다운로드하는 방법에 대한 권장 사항이 있습니까?

감사합니다!

10년 6월 15일 편집

여기 완성된 스크립트가 있습니다.선택한 디렉토리에 파일을 저장합니다.이상한 이유인지 파일을 다운로드하지 않고 다운로드만 했어요.어떻게 치울지 제안해주시면 감사하겠습니다.어느 정도의 예외가 발생한 후에 프로그램을 종료하지 않고 최신 만화만 입수할 수 있도록 사이트에 많은 만화가 있는지 알아보는 방법을 현재 고민하고 있습니다.

import urllib
import os

comicCounter=len(os.listdir('/file'))+1  # reads the number of files in the folder to start downloading at the next comic
errorCount=0

def download_comic(url,comicName):
    """
    download a comic in the form of

    url = http://www.example.com
    comicName = '00000000.jpg'
    """
    image=urllib.URLopener()
    image.retrieve(url,comicName)  # download comicName at URL

while comicCounter <= 1000:  # not the most elegant solution
    os.chdir('/file')  # set where files download to
        try:
        if comicCounter < 10:  # needed to break into 10^n segments because comic names are a set of zeros followed by a number
            comicNumber=str('0000000'+str(comicCounter))  # string containing the eight digit comic number
            comicName=str(comicNumber+".jpg")  # string containing the file name
            url=str("http://www.gunnerkrigg.com//comics/"+comicName)  # creates the URL for the comic
            comicCounter+=1  # increments the comic counter to go to the next comic, must be before the download in case the download raises an exception
            download_comic(url,comicName)  # uses the function defined above to download the comic
            print url
        if 10 <= comicCounter < 100:
            comicNumber=str('000000'+str(comicCounter))
            comicName=str(comicNumber+".jpg")
            url=str("http://www.gunnerkrigg.com//comics/"+comicName)
            comicCounter+=1
            download_comic(url,comicName)
            print url
        if 100 <= comicCounter < 1000:
            comicNumber=str('00000'+str(comicCounter))
            comicName=str(comicNumber+".jpg")
            url=str("http://www.gunnerkrigg.com//comics/"+comicName)
            comicCounter+=1
            download_comic(url,comicName)
            print url
        else:  # quit the program if any number outside this range shows up
            quit
    except IOError:  # urllib raises an IOError for a 404 error, when the comic doesn't exist
        errorCount+=1  # add one to the error count
        if errorCount>3:  # if more than three errors occur during downloading, quit the program
            break
        else:
            print str("comic"+ ' ' + str(comicCounter) + ' ' + "does not exist")  # otherwise say that the certain comic number doesn't exist
print "all comics are up to date"  # prints if all comics are downloaded

파이썬 2

urlib.urretrieve 사용

import urllib
urllib.urlretrieve("http://www.gunnerkrigg.com//comics/00000001.jpg", "00000001.jpg")

파이썬 3

urlib.request.urretrieve 사용(Python 3의 레거시 인터페이스 중 일부이며 동작은 동일)

import urllib.request
urllib.request.urlretrieve("http://www.gunnerkrigg.com//comics/00000001.jpg", "00000001.jpg")

Python 2:

import urllib
f = open('00000001.jpg','wb')
f.write(urllib.urlopen('http://www.gunnerkrigg.com//comics/00000001.jpg').read())
f.close()

Python 3:

import urllib.request
f = open('00000001.jpg','wb')
f.write(urllib.request.urlopen('http://www.gunnerkrigg.com//comics/00000001.jpg').read())
f.close()

참고로 요청 라이브러리를 사용합니다.

import requests
f = open('00000001.jpg','wb')
f.write(requests.get('http://www.gunnerkrigg.com//comics/00000001.jpg').content)
f.close()

단, requests.get() 오류를 확인해야 합니다.

Python 3을 Import해야 .import urllib.request:

import urllib.request 

urllib.request.urlretrieve(url, filename)

자세한 내용은 링크를 참조하십시오.

Python 3 버전의 @DiGMi의 답변:

from urllib import request
f = open('00000001.jpg', 'wb')
f.write(request.urlopen("http://www.gunnerkrigg.com/comics/00000001.jpg").read())
f.close()

나는 이 을 찾았고 더 신뢰할 수 있는 방법으로 그것을 편집한다.

def download_photo(self, img_url, filename):
    try:
        image_on_web = urllib.urlopen(img_url)
        if image_on_web.headers.maintype == 'image':
            buf = image_on_web.read()
            path = os.getcwd() + DOWNLOADED_IMAGE_PATH
            file_path = "%s%s" % (path, filename)
            downloaded_image = file(file_path, "wb")
            downloaded_image.write(buf)
            downloaded_image.close()
            image_on_web.close()
        else:
            return False    
    except:
        return False
    return True

다운로드 중에는 다른 리소스나 예외가 나타나지 않습니다.

게 쉬워요..read()응답의 일부 또는 전체를 읽은 후 정상 위치에서 연 파일에 씁니다.

이 것을 있는 .dir웹 사이트의sitefilename_01.jpg, ..., filename_10.jpg의 형식을 가진 후 모두 다운로드합니다.

import requests

for x in range(1, 10):
    str1 = 'filename_%2.2d.jpg' % (x)
    str2 = 'http://site/dir/filename_%2.2d.jpg' % (x)

    f = open(str1, 'wb')
    f.write(requests.get(str2).content)
    f.close()

'사용자 에이전트'가 필요할 수 있습니다.

import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36')]
response = opener.open('http://google.com')
htmlData = response.read()
f = open('file.txt','w')
f.write(htmlData )
f.close()

다음에 대한 문서를 읽어보라고 제안하는 것 말고도retrieve()(http://docs.python.org/library/urllib.html#urllib.URLopener.retrieve), 실제로 전화하는 것을 추천합니다.read()응답 내용에 대한 정보를 입력한 후 작성한 내용을 가져오는 임시 파일에 저장하지 않고 원하는 파일에 저장합니다.

위의 모든 코드는 원본 이미지 이름을 유지할 수 없습니다. 경우에 따라 이 이름이 필요할 수 있습니다.그러면 이미지를 로컬 드라이브에 저장하여 원래 이미지 이름을 유지하는 데 도움이 됩니다.

    IMAGE = URL.rsplit('/',1)[1]
    urllib.urlretrieve(URL, IMAGE)

자세한 것은, 이것을 사용해 주세요.

python 3를 사용했을 때 효과가 있었습니다.

csv 파일에서 URL 목록을 가져와 폴더에 다운로드하기 시작합니다.컨텐츠나 이미지가 존재하지 않는 경우는, 그 예외를 받아들여 마법을 계속합니다.

import urllib.request
import csv
import os

errorCount=0

file_list = "/Users/$USER/Desktop/YOUR-FILE-TO-DOWNLOAD-IMAGES/image_{0}.jpg"

# CSV file must separate by commas
# urls.csv is set to your current working directory make sure your cd into or add the corresponding path
with open ('urls.csv') as images:
    images = csv.reader(images)
    img_count = 1
    print("Please Wait.. it will take some time")
    for image in images:
        try:
            urllib.request.urlretrieve(image[0],
            file_list.format(img_count))
            img_count += 1
        except IOError:
            errorCount+=1
            # Stop in case you reach 100 errors downloading images
            if errorCount>100:
                break
            else:
                print ("File does not exist")

print ("Done!")

Urlib을 사용하면 이 작업을 즉시 완료할 수 있습니다.

import urllib.request

opener=urllib.request.build_opener()
opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')]
urllib.request.install_opener(opener)

urllib.request.urlretrieve(URL, "images/0.jpg")

보다 간단한 해법은 다음과 같습니다(피톤 3).

import urllib.request
import os
os.chdir("D:\\comic") #your path
i=1;
s="00000000"
while i<1000:
    try:
        urllib.request.urlretrieve("http://www.gunnerkrigg.com//comics/"+ s[:8-len(str(i))]+ str(i)+".jpg",str(i)+".jpg")
    except:
        print("not possible" + str(i))
    i+=1;

urlib.request.urretrieve - Python 3.9.2 설명서에 따르면 함수는 Python 2 모듈에서 포트됩니다.urllib(과 반대로)urllib2)는, 장래의 시점에서 폐지될 가능성이 있습니다.

따라서 requests.get(url, params=None, **kwargs)을 사용하는 것이 좋습니다.여기 MWE가 있습니다.

import requests
 
url = 'http://example.com/example.jpg'

response = requests.get(url)

with open(filename, "wb") as f:
    f.write(response.content)

Selenium WebDriver로 스크린샷 촬영을 통해 Download Google의 WebP 이미지를 참조하십시오.

이건 어때?

import urllib, os

def from_url( url, filename = None ):
    '''Store the url content to filename'''
    if not filename:
        filename = os.path.basename( os.path.realpath(url) )

    req = urllib.request.Request( url )
    try:
        response = urllib.request.urlopen( req )
    except urllib.error.URLError as e:
        if hasattr( e, 'reason' ):
            print( 'Fail in reaching the server -> ', e.reason )
            return False
        elif hasattr( e, 'code' ):
            print( 'The server couldn\'t fulfill the request -> ', e.code )
            return False
    else:
        with open( filename, 'wb' ) as fo:
            fo.write( response.read() )
            print( 'Url saved as %s' % filename )
        return True

##

def main():
    test_url = 'http://cdn.sstatic.net/stackoverflow/img/favicon.ico'

    from_url( test_url )

if __name__ == '__main__':
    main()

프록시 지원이 필요한 경우 다음을 수행할 수 있습니다.

  if needProxy == False:
    returnCode, urlReturnResponse = urllib.urlretrieve( myUrl, fullJpegPathAndName )
  else:
    proxy_support = urllib2.ProxyHandler({"https":myHttpProxyAddress})
    opener = urllib2.build_opener(proxy_support)
    urllib2.install_opener(opener)
    urlReader = urllib2.urlopen( myUrl ).read() 
    with open( fullJpegPathAndName, "w" ) as f:
      f.write( urlReader )

또 다른 방법은 Fastai 라이브러리를 사용하는 것입니다.이건 내게는 마법처럼 작용했다.나는 마주보고 있었다.SSL: CERTIFICATE_VERIFY_FAILED Error사용.urlretrieve그래서 해봤어요.

url = 'https://www.linkdoesntexist.com/lennon.jpg'
fastai.core.download_url(url,'image1.jpg', show_progress=False)

요청 사용

import requests
import shutil,os

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
currentDir = os.getcwd()
path = os.path.join(currentDir,'Images')#saving images to Images folder

def ImageDl(url):
    attempts = 0
    while attempts < 5:#retry 5 times
        try:
            filename = url.split('/')[-1]
            r = requests.get(url,headers=headers,stream=True,timeout=5)
            if r.status_code == 200:
                with open(os.path.join(path,filename),'wb') as f:
                    r.raw.decode_content = True
                    shutil.copyfileobj(r.raw,f)
            print(filename)
            break
        except Exception as e:
            attempts+=1
            print(e)

if __name__ == '__main__':
    ImageDl(url)

또, Web 사이트의 디렉토리 구조와 유사한 이미지를 다운로드하는 경우는, 다음과 같이 할 수 있습니다.

    result_path = './result/'
    soup = BeautifulSoup(self.file, 'css.parser')
    for image in soup.findAll("img"):
        image["name"] = image["src"].split("/")[-1]
        image['path'] = image["src"].replace(image["name"], '')
        os.makedirs(result_path + image['path'], exist_ok=True)
        if image["src"].lower().startswith("http"):
            urlretrieve(image["src"], result_path + image["src"][1:])
        else:
            urlretrieve(url + image["src"], result_path + image["src"][1:])

디렉토리 작성 및 이미지 다운로드를 위한 가장 깔끔한 코딩 방법.python은 os 라이브러리를 제공하여 실시간 디렉토리를 생성하고 urlib를 통해 이미지를 다운로드합니다.좀 더 조직적인 코딩 방식이 될 것이다.

파이썬 3

urlib.request Import

 urllib.request.urlretrieve(prodimg, directory+'\\'+sku+'.jpg')

python 3 및 python 2 다운로드 이미지의 완전한 코드를 python 3 및 python 2의 디렉토리에서 가져옵니다(예).

언급URL : https://stackoverflow.com/questions/3042757/downloading-a-picture-via-urllib-and-python

반응형