jsoup httpclient 爬取网页并下载google图标
jsoup下载地址 http://www.jsoup.org
httpclient下载地址 http://hc.apache.org/downloads.cgi
其他jar包见附件
Crawler
package jsoup; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map; import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.util.EntityUtils; import com.google.api.translate.Language;
import com.google.api.translate.Translate; /**
* google logo 下载程序
*/
public abstract class Crawler { /**
* 使用google 翻译api
*
* @param en
* @return
*/
public String translateEnToCinese(String en) {
Translate.setHttpReferrer("http://www.xxx.com");
try {
return Translate.execute(en, Language.ENGLISH, Language.CHINESE);
} catch (Exception e) {
e.printStackTrace();
}
return "";
} /**
* 获取一个Map
*
* @return
*/
public Map<String, Object> getMap() {
return new HashMap<String, Object>(0);
} /**
* 下载文件
*
* @param url
* 文件http地址
* @param dir
* 目标文件
* @throws IOException
*/
public void downloadFile(String url, String dir) throws Exception {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpProtocolParams.setUserAgent(httpClient.getParams(),
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9");
HttpGet httpGet = new HttpGet();
httpGet.setURI(new java.net.URI(url)); InputStream input = null;
FileOutputStream output = null;
try {
HttpResponse response = httpClient.execute(httpGet);
HttpEntity entity = response.getEntity();
input = entity.getContent();
File file = new File(dir);
output = FileUtils.openOutputStream(file);
IOUtils.copy(input, output);
} catch (Exception e){
e.printStackTrace();
} finally {
IOUtils.closeQuietly(output);
IOUtils.closeQuietly(input);
}
} /**
* 处理GET请求,返回整个页面
*
* @param url
* 访问地址
* @param params
* 编码参数
* @return
* @throws Exception
*/
public synchronized String doGet(String url, String... params)
throws Exception {
DefaultHttpClient httpClient = new DefaultHttpClient(); // 创建httpClient实例
HttpProtocolParams.setUserAgent(httpClient.getParams(),
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9");
String charset = "UTF-8";
if (null != params && params.length >= 1) {
charset = params[0];
}
HttpGet httpGet = new HttpGet(); // 创建get方法实例
String content = "";
httpGet.setURI(new java.net.URI(url));
try {
HttpResponse response = httpClient.execute(httpGet); // 执行请求,得到response对象
int resStatu = response.getStatusLine().getStatusCode(); // 得到返回的状态码
if (resStatu == HttpStatus.SC_OK) { // 200正常
HttpEntity entity = response.getEntity(); // 获得相应的实体
if (entity != null) {
// 使用EntityUtils的toString方法,传递默认编码,在EntityUtils中的默认编码是ISO-8859-1
content = EntityUtils.toString(entity, charset);
}
}
} catch (Exception e) {
System.out.println("访问【" + url + "】出现异常!");
e.printStackTrace();
} finally {
// 关闭资源
httpGet.abort();
httpClient.getConnectionManager().shutdown();
}
return content;
}
}
GoogleLogoCrawler
package jsoup; import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map; import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements; /**
* google logo 下载程序
*/
public class GoogleLogoCrawler extends Crawler { private static final String URL = "http://www.logocollect.com/google/year.php?key=%y&page=%p"; private static final String LOGO_URL = "http://www.logocollect.com/google/"; private static final String[] YEARS = new String[] {
//"1998", "1999", "2000",
//"2001", "2002", "2003", "2004", "2005", "2006", "2007", "2008",
"2009", "2010", "2011", "2012" }; private static final String INDEX = "http://www.logocollect.com/google/year.php?key=%y"; private static final String DIR_PATH = "D:\\googlelogos\\"; public void doStart() {
JSONArray array = new JSONArray();
for (String year : YEARS) {
String ind = INDEX.replaceAll("%y", year);
int pageCount = getPageCount(ind);
for (int i = 1; i < pageCount+1; i++) {
String url = URL.replaceAll("%y", year).replaceAll("%p", i + "");
String path = year + "_" + i;
start(url, array, DIR_PATH + path + "\\", path);
}
}
try {
FileUtils.writeStringToFile(new File(DIR_PATH + "json"), array.toString(), "UTF-8");
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(array);
} public int getPageCount(String url) {
int pageCount = 1;
try {
org.jsoup.nodes.Document doc = Jsoup.connect(url).get(); String els = doc.html().toString();
int start = els.indexOf("总页数") + 4;
String temp = els.substring(start);
int end = temp.indexOf(",");
pageCount = Integer.parseInt(els.substring(start,start+end));
System.out.println(pageCount);
} catch (IOException e) {
e.printStackTrace();
}
return pageCount;
} public void start(String url, JSONArray array, String dir, String path) {
try {
String content = super.doGet(url);
Document doc = Jsoup.parse(content);
Elements dds = doc.select(".img img");
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(0);
for (int i = 0; i < dds.size(); i++) {
Element img = dds.get(i);
String src = img.select("img").first().attr("src");
String title = img.select("img").first().attr("title");
Map<String, Object> map = super.getMap(); map.put("url", LOGO_URL + src);
map.put("title", title); list.add(map);
}
JSONArray tempJsonArray = new JSONArray();
for (Map<String, Object> map : list) {
JSONObject jsonObject = new JSONObject();
String proxy = StringUtils.substringAfterLast(map.get("url")
.toString(), ".");
long date = new Date().getTime();
String name = date + "." + proxy;
jsonObject.put("url", map.get("url").toString());
jsonObject.put("dir", name);
jsonObject.put("title", map.get("title").toString()); // 翻译
// String dateZh = super.translateEnToCinese(map.get("date")
// .toString());
// String titleZh = super.translateEnToCinese(map.get("title")
// .toString());
// json.put("title_zh_cn", dateZh + " - " + titleZh); // 下载图片
super.downloadFile(map.get("url").toString(), dir + name);
tempJsonArray.put(jsonObject);
}
array.put(new JSONObject().put(path, tempJsonArray));
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) throws Exception {
new GoogleLogoCrawler().doStart();
} }
本文转自:http://you-java.iteye.com/blog/1460271
jsoup httpclient 爬取网页并下载google图标的更多相关文章
- python 爬虫(爬取网页的img并下载)
from urllib.request import urlopen # 引用第三方库 import requests #引用requests/用于访问网站(没安装需要安装) from pyquery ...
- HttpClient(一)HttpClient抓取网页基本信息
一.HttpClient简介 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包, 并且它支 ...
- Java两种方式简单实现:爬取网页并且保存
注:如果代码中有冗余,错误或者不规范,欢迎指正. Java简单实现:爬取网页并且保存 对于网络,我一直处于好奇的态度.以前一直想着写个爬虫,但是一拖再拖,懒得实现,感觉这是一个很麻烦的事情,出现个小错 ...
- python3爬虫爬取网页思路及常见问题(原创)
学习爬虫有一段时间了,对遇到的一些问题进行一下总结. 爬虫流程可大致分为:请求网页(request),获取响应(response),解析(parse),保存(save). 下面分别说下这几个过程中可以 ...
- [python] 常用正则表达式爬取网页信息及分析HTML标签总结【转】
[python] 常用正则表达式爬取网页信息及分析HTML标签总结 转http://blog.csdn.net/Eastmount/article/details/51082253 标签: pytho ...
- PHP利用Curl实现多线程抓取网页和下载文件
PHP 利用 Curl 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,然而因为php语言本身不支持多线程,所以开发爬虫程序效率并不高,一般采集 数据可以利用 PHPquery ...
- 使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)
urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...
- 常用正则表达式爬取网页信息及HTML分析总结
Python爬取网页信息时,经常使用的正则表达式及方法. 1.获取<tr></tr>标签之间内容 2.获取<a href..></a>超链接之间内容 3 ...
- node:爬虫爬取网页图片
代码地址如下:http://www.demodashi.com/demo/13845.html 前言 周末自己在家闲着没事,刷着微信,玩着手机,发现自己的微信头像该换了,就去网上找了一下头像,看着图片 ...
随机推荐
- 单个php页面实现301重定向
301重定向的意思是页面永久性移走,实现方式是当用户请求页面时,服务器返回相应http数据流头信息状态码为301,表示本网页永久性转移到另一个地址,301重定向是页面永久性转移,一般用在不打算改变的地 ...
- ActionBarSherlock的使用——(一)配置
小弟照着上面的去做,后来样式不一致,发现是用了虚拟机的缘故(虚拟机版本,API-8 2.2);就行了. 还有下面的第二步: 2.打开Eclipse,选择:FIle——New——Project——And ...
- display : -webkit-box-inline 的理解
发现: 最近在做移动端的东西,说起移动端弹性盒子布局真是无往不利,用起来特别爽,我也是偶尔间发现的这个属性并且它的用法,在网上基本查不到这个属性的资料(个人看法).如果没有听说过(display:bo ...
- 设计模式学习之单例模式(Singleton,创建型模式)(4)
假如程序中有一个Person类,我的需求就是需要在整个应用程序中只能new一个Person,而且这个Person实例在应用程序中进行共享,那么我们该如何实现呢? 第一步: 新建一个Person类,类中 ...
- Android 开发 --Unable to resolve target 'android-19'
Android 开发 --Unable to resolve target 'android-19' http://blog.csdn.net/love_javc_you/article/detail ...
- PHP生成不重复随机数的方法
无论是Web应用,还是WAP或者移动应用,随机数都有其用武之地.在最近接触的几个小项目中,我也经常需要和随机数或者随机数组打交道,所以,对于PHP如何产生不重复随机数常用的几种方法小结一下. 方法一: ...
- Codeforces Gym 100203G G - Good elements 标记暴力
G - Good elementsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/ ...
- Distinct和Group by去除重复字段记录
重复记录 有两个意义,一是完全重复的记录,也即所有字段均重复的记录 二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略. 1.对于第一种重复,比较容易解决,使用 s ...
- SQLServer2005利用维护计划自动备份数据库
经常性忘了给数据库备份,结果当数据库发生问题的时候,才发现备份是1个月以前的,那个后悔与懊恼还加惭愧啊,别提有对难受了.要认为的记住去备份比较难,每天事情又那么多,所以有了这个自动备份就不用愁了.先拷 ...
- org.apache.log4j与org.apache.commons.logging这两个包有什么区别
apache common logging是一种log的框架接口,它本身并不实现log记录的功能,而是在运行时动态查找目前存在的日志库,调用相关的日志函数,从而隐藏具体的日志实现log4j是具体的日志 ...