【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"); //获取经纬度信息,如果没有设置woeid则此项没有返回结果strings.add("owner_name");params.setExtras(strings); //额外信息String [] tags = new String[] {"广州"};params.setTags(tags);params.setText(text);params.setWoeId("26198245"); //woeid-地点id,可以在https://www.flickr.com/places/info/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版相关推荐
- java获取u盘_实例分享java监听u盘的方法
package org.load.u; import java.io.File; import java.util.LinkedHashMap; import java.util.Map; // U盘 ...
- ctp java_CTP API 开发之二 :制作CTP java版 API
目前上期技术CTP系统提供的API版本是C++版本 SWIG是一个能将C/C++接口转换为其他语言的工具,目前可以支持Python,Java,R等语言. 本文主要介绍Windows 32/64位平台下 ...
- 百度地图利用位置提供服务器,利用百度地图API获取当前位置信息的实例
利用百度地图API可以做很多事情,个人感觉最核心也是最基础的就是定位功能了.这里分享一个制作的JS可以实现登录网页后定位: var map; var gpsPoint; var baiduPoint; ...
- java api 获取jvm实例_JVMTI那些事——和Java相互调用
前面几篇文章介绍了JVMTI接口的一些基本概念,以及如何编写一个基于JVMTI的agent. 那些简单的例子只是JVMTI agent自己实现一些简单的功能,如果能够将JVMTI提供的接口经过包装之后 ...
- 关于小程序移动端调用微信API及腾讯地图实例,获取当前位置、逆地址解析、路线规划、地图展示
前言:记录使用腾讯地图定位的逻辑思路讲解 以下内容会分为三部分讲解: 小程序调用微信API获取经纬度 小程序调用腾讯地图API地址转坐标解析 小程序调用腾讯地图API获取目的地交通线路 移动端H5调用 ...
- alexa api php,PHP使用Alexa API获取网站的Alexa排名例子_php实例
我们通会用Alexa的网站(或其它站长工具网站)来栓查我们的网站流量排名,这样就必须去那些网站.实际上,可以通过Alexa XML API 获取网站的Alexa相关的数据(XML格式的),再使用XM ...
- php接口开发 安全_PHP开发api接口安全验证的实例讲解
php的api接口 在实际工作中,使用PHP写api接口是经常做的,PHP写好接口后,前台就可以通过链接获取接口提供的数据,而返回的数据一般分为两种情况,xml和json,在这个过程中,服务器并不知道 ...
- api查询所有记录 zabbix_通过Zabbix API获取历史监控数据
Zabbix API可以通过JSON RPC协议来获取历史数据. 可以采用脚本或者任何支持JSON RPC的工具来使用API. 基本请求格式 Zabbix API 简化的JSON请求如下: { &qu ...
- python 获取天气_Python实现从百度API获取天气的方法
本文实例讲述了Python实现从百度API获取天气的方法.分享给大家供大家参考.具体实现方法如下: __author__ = 'saint' import os import urllib.reque ...
最新文章
- Failed to load JavaHL Library(windows和mac)
- Java程序中Timer的用法
- python unit test_python 中unittest单元测试为什么addTest没用。
- ExtJs5.0在WebStorm上的使用之入门教程(一)编写第一个网页 HelloExt
- head rush ajax chapter4 DOM
- DreamFactory入门指南 - 第2章安装和配置DreamFactory
- springboot做网站_SpringBoot项目实战(3):整合Freemark模板
- php 动态引用dll文件路径,win平台环境变量与dll动态链接库搜索路径小结
- java外文文献_spring框架外文文献 PDF 下载
- 数据分析型产品的需求分析6大步骤
- JavaScript基础入门 封装DOM 连缀
- iphone换android手机铃声,在iPhone中换个自定义铃声要11个步骤 正常人受不了
- Bert超长文本分类、文本摘要
- java集合结构----集合框架以及背后的数据结构
- 音视频FLV合成实战
- 岁月不居,天道酬勤,业道酬精
- STL之Map使用总结
- 图片文字怎么转换成文本?可以试试这三种途径
- 利用Go语言上传图像并生成缩略图
- 美女上班迟到的N个理由