背景

近期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成功映射到这个端口,这样程序就可以跑起来了。

运行结果



大功告成!

常见问题

  1. 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版相关推荐

  1. java获取u盘_实例分享java监听u盘的方法

    package org.load.u; import java.io.File; import java.util.LinkedHashMap; import java.util.Map; // U盘 ...

  2. ctp java_CTP API 开发之二 :制作CTP java版 API

    目前上期技术CTP系统提供的API版本是C++版本 SWIG是一个能将C/C++接口转换为其他语言的工具,目前可以支持Python,Java,R等语言. 本文主要介绍Windows 32/64位平台下 ...

  3. 百度地图利用位置提供服务器,利用百度地图API获取当前位置信息的实例

    利用百度地图API可以做很多事情,个人感觉最核心也是最基础的就是定位功能了.这里分享一个制作的JS可以实现登录网页后定位: var map; var gpsPoint; var baiduPoint; ...

  4. java api 获取jvm实例_JVMTI那些事——和Java相互调用

    前面几篇文章介绍了JVMTI接口的一些基本概念,以及如何编写一个基于JVMTI的agent. 那些简单的例子只是JVMTI agent自己实现一些简单的功能,如果能够将JVMTI提供的接口经过包装之后 ...

  5. 关于小程序移动端调用微信API及腾讯地图实例,获取当前位置、逆地址解析、路线规划、地图展示

    前言:记录使用腾讯地图定位的逻辑思路讲解 以下内容会分为三部分讲解: 小程序调用微信API获取经纬度 小程序调用腾讯地图API地址转坐标解析 小程序调用腾讯地图API获取目的地交通线路 移动端H5调用 ...

  6. alexa api php,PHP使用Alexa API获取网站的Alexa排名例子_php实例

    我们通会用Alexa的网站(或其它站长工具网站)来栓查我们的网​站流量排名,这样就必须去那些网站.实际上,可以通过Alexa XML API 获取网站的Alexa相关的数据(XML格式的),再使用XM ...

  7. php接口开发 安全_PHP开发api接口安全验证的实例讲解

    php的api接口 在实际工作中,使用PHP写api接口是经常做的,PHP写好接口后,前台就可以通过链接获取接口提供的数据,而返回的数据一般分为两种情况,xml和json,在这个过程中,服务器并不知道 ...

  8. api查询所有记录 zabbix_通过Zabbix API获取历史监控数据

    Zabbix API可以通过JSON RPC协议来获取历史数据. 可以采用脚本或者任何支持JSON RPC的工具来使用API. 基本请求格式 Zabbix API 简化的JSON请求如下: { &qu ...

  9. python 获取天气_Python实现从百度API获取天气的方法

    本文实例讲述了Python实现从百度API获取天气的方法.分享给大家供大家参考.具体实现方法如下: __author__ = 'saint' import os import urllib.reque ...

最新文章

  1. Failed to load JavaHL Library(windows和mac)
  2. Java程序中Timer的用法
  3. python unit test_python 中unittest单元测试为什么addTest没用。
  4. ExtJs5.0在WebStorm上的使用之入门教程(一)编写第一个网页 HelloExt
  5. head rush ajax chapter4 DOM
  6. DreamFactory入门指南 - 第2章安装和配置DreamFactory
  7. springboot做网站_SpringBoot项目实战(3):整合Freemark模板
  8. php 动态引用dll文件路径,win平台环境变量与dll动态链接库搜索路径小结
  9. java外文文献_spring框架外文文献 PDF 下载
  10. 数据分析型产品的需求分析6大步骤
  11. JavaScript基础入门 封装DOM 连缀
  12. iphone换android手机铃声,在iPhone中换个自定义铃声要11个步骤 正常人受不了
  13. Bert超长文本分类、文本摘要
  14. java集合结构----集合框架以及背后的数据结构
  15. 音视频FLV合成实战
  16. 岁月不居,天道酬勤,业道酬精
  17. STL之Map使用总结
  18. 图片文字怎么转换成文本?可以试试这三种途径
  19. 利用Go语言上传图像并生成缩略图
  20. 美女上班迟到的N个理由

热门文章

  1. 微博时光机定时发送微博
  2. 10项技巧设计SQL语句
  3. MyDockFinder
  4. 游戏IP直连工具客户端
  5. 数控机床G-Code在线仿真器
  6. eis电子防抖好还是光学防抖好_从光学防抖到视频双防抖,一张图了解手机防抖技术进步有多快...
  7. 2021年熔化焊接与热切割考试及熔化焊接与热切割找解析
  8. js效果 div跟随鼠标移动
  9. esxi增加linux空间,ESXI 4.1 Linux虚拟机调整扩充磁盘大小
  10. Pr零基础快速入门Premiere视频剪辑系列(1):初识Premiere