生活随笔
收集整理的這篇文章主要介紹了
【Flick API】获取Flickr图片信息及实例说明--Java版
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
背景
近期GF寫論文需要爬取Flickr網站上的某個關鍵詞的所有圖片信息,并且生成excel用于數據分析。在找了許多資料之后,實現了該功能,其實難度并不大,在Flickr官方API文檔中寫的也挺詳細的,而且還有官方Flickr4JavaDemo,只是過程中容易遇到了一些坑,特此記下,方便后人。
實現功能
搜索某關鍵字,獲取到Flickr中匹配到該關鍵字的圖片,并獲取其中的包括圖片ID,用戶信息,圖片鏈接,圖片經緯度信息及拍攝信息等等,最后導入到excel中。
準備工作
1.一臺可以訪問flickr的電腦 2.IDEA 3.jdk1.8(官方規定jdk要在1.8及以上)
實現過程
工程是依賴Maven構建的,IDE采用IDEA
導入官方API
在pom.xml中加入
<dependency><groupId>com.flickr4java</groupId><artifactId>flickr4java</artifactId><version>2.19</version>
</dependency>
調用API
使用api的時候,需要在flickr申請key和secret。 貼出主要代碼,完整項目請移步github
package com
. liushiyao
. flickr
; import com
. flickr4java
. flickr
. Flickr
;
import com
. flickr4java
. flickr
. FlickrException
;
import com
. flickr4java
. flickr
. REST
;
import com
. flickr4java
. flickr
. photos
. Photo
;
import com
. flickr4java
. flickr
. photos
. PhotoList
;
import com
. flickr4java
. flickr
. photos
. PhotosInterface
;
import com
. flickr4java
. flickr
. photos
. SearchParameters
;
import java
. io
. File
;
import java
. io
. FileOutputStream
;
import java
. io
. IOException
;
import java
. text
. SimpleDateFormat
;
import java
. util
. Arrays
;
import java
. util
. Date
;
import java
. util
. HashSet
;
import java
. util
. Set
;
import org
. apache
. poi
. hssf
. usermodel
. HSSFRow
;
import org
. apache
. poi
. hssf
. usermodel
. HSSFSheet
;
import org
. apache
. poi
. hssf
. usermodel
. HSSFWorkbook
; public class SearchExample
{ static String apiKey
= "自己的key" ; static String sharedSecret
= "自己的secret" ; public static final int MAX_PRE_PAGE
= 500 ; Flickr flickr
; public SearchExample ( ) throws IOException
{ flickr
= new Flickr ( apiKey
, sharedSecret
, new REST ( ) ) ; Flickr
. debugRequest
= false ; Flickr
. debugStream
= false ; } private PhotoList
< Photo> search ( String text
) throws FlickrException
{ PhotosInterface photos
= flickr
. getPhotosInterface ( ) ; SearchParameters params
= new SearchParameters ( ) ; Set
< String> strings
= new HashSet < String> ( ) ; strings
. add ( "date_taken" ) ; strings
. add ( "tags" ) ; strings
. add ( "title" ) ; strings
. add ( "geo" ) ; strings
. add ( "owner_name" ) ; params
. setExtras ( strings
) ; String
[ ] tags
= new String [ ] { "廣州" } ; params
. setTags ( tags
) ; params
. setText ( text
) ; params
. setWoeId ( "26198245" ) ; params
. setMinTakenDate ( new Date ( 1093996800 ) ) ; params
. setSort ( SearchParameters
. DATE_POSTED_DESC
) ; PhotoList
< Photo> photoPhotoList
= new PhotoList < Photo> ( ) ; int index
= 1 , pages
= 1 ; do { PhotoList
< Photo> results
= photos
. search ( params
, MAX_PRE_PAGE
, index
) ; if ( results
!= null
&& ! results
. isEmpty ( ) ) { photoPhotoList
. addAll ( results
) ; } pages
= results
. getPages ( ) ; int page
= results
. getPage ( ) ; System
. out
. println ( "進度:" + page
+ "/" + pages
+ "頁" ) ; index
++ ; } while ( index
< pages
) ; return photoPhotoList
; } public static void main ( String
[ ] args
) throws Exception
{ SearchExample t
= new SearchExample ( ) ; PhotoList
< Photo> photoPhotoList
= t
. search ( args
. length
== 0 ? "廣州" : args
[ 0 ] ) ; System
. out
. println ( "總共:" + photoPhotoList
. size ( ) + "條數據" ) ; HSSFWorkbook workbook
= new HSSFWorkbook ( ) ; HSSFSheet sheet
= workbook
. createSheet ( "sheet1" ) ; HSSFRow titleRows
= sheet
. createRow ( 0 ) ; titleRows
. createCell ( 0 ) . setCellValue ( "id" ) ; titleRows
. createCell ( 1 ) . setCellValue ( "用戶名稱" ) ; titleRows
. createCell ( 2 ) . setCellValue ( "圖片標題" ) ; titleRows
. createCell ( 3 ) . setCellValue ( "拍攝時間" ) ; titleRows
. createCell ( 4 ) . setCellValue ( "標簽" ) ; titleRows
. createCell ( 5 ) . setCellValue ( "圖片鏈接" ) ; titleRows
. createCell ( 6 ) . setCellValue ( "經度" ) ; titleRows
. createCell ( 7 ) . setCellValue ( "緯度" ) ; for ( int row
= 0 ; row
< photoPhotoList
. size ( ) ; row
++ ) { HSSFRow rows
= sheet
. createRow ( row
+ 1 ) ; rows
. createCell ( 0 ) . setCellValue ( photoPhotoList
. get ( row
) . getId ( ) ) ; rows
. createCell ( 1 ) . setCellValue ( photoPhotoList
. get ( row
) . getOwner ( ) . getUsername ( ) ) ; rows
. createCell ( 2 ) . setCellValue ( photoPhotoList
. get ( row
) . getTitle ( ) ) ; rows
. createCell ( 3 ) . setCellValue ( new SimpleDateFormat ( "yyy-MM-dd" ) . format ( photoPhotoList
. get ( row
) . getDateTaken ( ) ) ) ; rows
. createCell ( 4 ) . setCellValue ( Arrays
. toString ( photoPhotoList
. get ( row
) . getTags ( ) . toArray ( ) ) ) ; rows
. createCell ( 5 ) . setCellValue ( photoPhotoList
. get ( row
) . getLargeUrl ( ) ) ; rows
. createCell ( 6 ) . setCellValue ( photoPhotoList
. get ( row
) . getGeoData ( ) . getLongitude ( ) ) ; rows
. createCell ( 7 ) . setCellValue ( photoPhotoList
. get ( row
) . getGeoData ( ) . getLatitude ( ) ) ; } sheet
. createRow ( photoPhotoList
. size ( ) + 2 ) . createCell ( 0 ) . setCellValue ( "總數:" + photoPhotoList
. size ( ) + "條" ) ; File xlsFile
= new File ( "data.xls" ) ; FileOutputStream xlsStream
= new FileOutputStream ( xlsFile
) ; workbook
. write ( xlsStream
) ; }
}
設置代理(重點)
前面代碼部分很簡單,不懂的可以去查查官方的API文檔。設置代理正是該篇文章所介紹的重點。 因為Flickr在國內是無法直接訪問的,所以需要FQ。成功FQ之后,瀏覽器可以訪問了,但是IDEA并不可以方位到,所以IDEA需要設置代理。 IDEA無法訪問,所以一直報連接超時的錯誤:
org.scribe.exceptions.OAuthConnectionException: There was a problem while creating a connection to the remote service.at org.scribe.model.Request.send(Request.java:70)at org.scribe.model.Request.send(Request.java:76)at com.flickr4java.flickr.REST.get(REST.java:174)at com.flickr4java.flickr.photos.PhotosInterface.search(PhotosInterface.java:1047)at com.liushiyao.flickr.SearchExample.search(SearchExample.java:63)at com.liushiyao.flickr.SearchExample.main(SearchExample.java:89)
Caused by: java.net.ConnectException: Connection timed out: connect
1.首先設置shadowsocks為全局代理 2.設置IDEA代理 Settings->HTTP Proxy中設置: 在HTTP的tab下填寫shadowsocks中的賬號密碼,然后點擊check connection,輸入Flickr的網址,檢查一下IDEA是否能夠訪問Flickr 成功訪問!(這一步是讓IDEA可以FQ,如果只是讓程序可以訪問,可以省略這一步,直接操作第三部) 3.設置jvm代理 執行第二步,運行程序依然連接超時,經過多番查找,終于發現仍有一個地方需要設置–jvm參數。設置IDEA代理只是讓IDEA可以FQ,但是java程序并不可以,所以需要如下設置: 在運行java程序前,我們可以設置程序參數或者是jvm參數,如上圖。 我們需要在vm options這一欄中輸入:
-Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=1080 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=1080
這樣jvm成功映射到這個端口,這樣程序就可以跑起來了。
運行結果
大功告成!
常見問題
SLF4J報錯 SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”. SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 原因是官方項目中少了依賴,在pom.xml中添加以及代碼就好
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.2</version>
</dependency>
總結
代碼并不難,官網也有例子,麻煩的是代理設置,花了不少時間,特寫此文。
總結
以上是生活随笔 為你收集整理的【Flick API】获取Flickr图片信息及实例说明--Java版 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。