我正在嘗試使用 FlickrAPI 從 Flickr 抓取影像。發生的事情是命令列只是停留在那里,并且在抓取影像 URL 后什么也沒有發生。它類似于以下內容:

在此螢屏之后沒有任何反應,它會在這里停留很長時間,有時在 1200 秒或更長的范圍內。
對于抓取,我使用了以下代碼:
def get_urls(search='honeybees on flowers', n=10, download=False):
t = time.time()
flickr = FlickrAPI(key, secret)
license = () # https://www.flickr.com/services/api/explore/?method=flickr.photos.licenses.getInfo
photos = flickr.walk(text=search, # http://www.flickr.com/services/api/flickr.photos.search.html
extras='url_o',
per_page=500, # 1-500
license=license,
sort='relevance')
if download:
dir = os.getcwd() os.sep 'images' os.sep search.replace(' ', '_') os.sep # save directory
if not os.path.exists(dir):
os.makedirs(dir)
urls = []
for i, photo in enumerate(photos):
if i < n:
try:
# construct url https://www.flickr.com/services/api/misc.urls.html
url = photo.get('url_o') # original size
if url is None:
url = 'https://farm%s.staticflickr.com/%s/%s_%s_b.jpg' % \
(photo.get('farm'), photo.get('server'), photo.get('id'), photo.get('secret')) # large size
download
if download:
download_uri(url, dir)
urls.append(url)
print('%g/%g %s' % (i, n, url))
except:
print('%g/%g error...' % (i, n))
# import pandas as pd
# urls = pd.Series(urls)
# urls.to_csv(search "_urls.csv")
print('Done. (%.1fs)' % (time.time() - t) ('\nAll images saved to %s' % dir if download else ''))
該函式的呼叫方式如下:
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--search', type=str, default='honeybees on flowers', help='flickr search term')
parser.add_argument('--n', type=int, default=10, help='number of images')
parser.add_argument('--download', action='store_true', help='download images')
opt = parser.parse_args()
get_urls(search=opt.search, # search term
n=opt.n, # max number of images
download=opt.download) # download images
我嘗試多次查看函式代碼,但我似乎無法理解為什么在抓取完成后沒有任何反應,因為其他一切都正常。
uj5u.com熱心網友回復:
我無法運行它,但我認為所有問題在于它獲取有關 500 張照片的資訊 - 因為您擁有per_page=500- 并且它for為所有 500 張照片運行-loop 并且您必須等待for-loop結束。
您應該使用break在n影像后退出此回圈
for i, photo in enumerate(photos):
if i >= n:
break
else:
try:
# ...code ...
或者干脆你應該使用photos[:n]然后你不必檢查i < n
for i, photo in enumerate(photos[:n]):
try:
# ...code ...
最終你應該使用 per_page=n
順便提一句:
您可以使用os.path.join創建路徑
dir = os.path.join(os.getcwd(), 'images', search.replace(' ', '_'))
如果您使用exist_ok=Trueinmakedirs()那么您不必檢查if not os.path.exists(dir):
if download:
dir = os.path.join(os.getcwd(), 'images', search.replace(' ', '_'))
os.makedirs(dir, exist_ok=True)
如果您使用,enumerate(photos, 1)那么您將獲得值1,2,3,...而不是0,1,2,...
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/341169.html
上一篇:使用網頁抓取創建資料框
下一篇:如何訪問此回應中的“價格”標簽?
