0

URL 要求をサイトに送信し、気象レーダーのアニメーションを生成するプログラムを作成しようとしています。次に、そのページをスクレイピングして画像の URL (Java モジュールに保存されています) を取得し、ローカル フォルダーにダウンロードします。これを、多くのレーダー ステーションと 2 つのレーダー製品に対して繰り返し行います。ここまでで、リクエストを送信し、html を解析し、画像の URL を一覧表示するコードを作成しました。私ができないように見えるのは、画像の名前を変更してローカルに保存することです。それを超えて、私はこれを可能な限り合理化したいと考えています-これはおそらく私がこれまでに得たものではありません. 1)画像をローカルフォルダーにダウンロードする方法と、2)これを行うためのよりpythonicな方法を教えてくれる方法は素晴らしいでしょう。

# import modules
import urllib2
import re
from bs4 import BeautifulSoup


##test variables##
stationName = "KBYX"
prod = ("bref1","vel1")                           # a tupel of both ref and vel
bkgr = "black"
duration = "1"
#home_dir = "/path/to/home/directory/folderForImages"

##program##

# This program needs to do the following:
# read the folder structure from home directory to get radar names
#left off here
list_of_folders = os.listdir(home_dir)
for each_folder in list_of_folders:
    if each_folder.startswith('k'):
    print each_folder
# here each folder that starts with a "k" represents a radar station, and within each folder are two other folders bref1 and vel1, the two products. I want the program to read the folders to decide which radar to retrieve the data for... so if I decide to add radars, all I have to do is add the folders to the directory tree. 
# first request will be for prod[0] - base reflectivity
# second request will be for prod[1] - base velocity

# sample path:
# http://weather.rap.ucar.edu/radar/displayRad.php?icao=KMPX&prod=bref1&bkgr=black&duration=1

#base part of the path 
base = "http://weather.rap.ucar.edu/radar/displayRad.php?"


#additional parameters
call = base+"icao="+stationName+"&prod="+prod[0]+"&bkgr="+bkgr+"&duration="+duration

#read in the webpage
urlContent = urllib2.urlopen(call).read()
webpage=urllib2.urlopen(call)
#parse the webpage with BeautifulSoup
soup = BeautifulSoup(urlContent)
#print (soup.prettify())                            # if you want to take a look at the parsed structure


tag = soup.param.param.param.param.param.param.param    #find the tag that holds all the filenames (which are nested in the PARAM tag, and
                                                     # located in the "value" parameter for PARAM name="filename")
files_in=str(tag['value'])

files = files_in.split(',')                         # they're in a single element, so split them by comma

directory = home_dir+"/"+stationName+"/"+prod[1]+"/" 
counter = 0
for file in files:                                           # now we should THEORETICALLY be able to iterate over them to download them... here I just print them 
    print file                                          
4

2 に答える 2

0

インターネットからダウンロードするには、次の 3 つの方法を使用します。

from os import path, mkdir
from urllib import urlretrieve

def checkPath(destPath):
    # Add final backslash if missing
    if destPath != None and len(destPath) and destPath[-1] != '/':
        destPath += '/'

    if destPath != '' and not path.exists(destPath): 
        mkdir(destPath)
    return destPath

def saveResource(data, fileName, destPath=''):
    '''Saves data to file in binary write mode'''
    destPath = checkPath(destPath)
    with open(destPath + fileName, 'wb') as fOut:
        fOut.write(data)

def downloadResource(url, fileName=None, destPath=''):
    '''Saves the content at url in folder destPath as fileName''' 
    # Default filename
    if fileName == None:
        fileName = path.basename(url)

    destPath = checkPath(destPath)

    try:
        urlretrieve(url, destPath + fileName)
    except Exception as inst:
        print 'Error retrieving', url 
        print type(inst)     # the exception instance
        print inst.args      # arguments stored in .args
        print inst

ここには、さまざまなサイトから画像をダウンロードするための例がたくさんあります

于 2013-03-26T16:12:59.483 に答える
0

画像をローカルに保存するには、次のようにします

import os
IMAGES_OUTDIR = '/path/to/image/output/directory'

for file_url in files:
    image_content = urllib2.urlopen(file_url).read()
    image_outfile = os.path.join(IMAGES_OUTDIR, os.path.basename(file_url))
    with open(image_outfile, 'wb') as wfh:
        wfh.write(image_content)

それらの名前を変更したい場合は、os.path.basename(file_url) の代わりに必要な名前を使用してください。

于 2013-03-26T16:13:56.797 に答える