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 前言 周末自己在家闲着没事,刷着微信,玩着手机,发现自己的微信头像该换了,就去网上找了一下头像,看着图片 ...
随机推荐
- Hydra---Linux下的暴力美学
引自:http://www.cnblogs.com/mchina/archive/2013/01/01/2840815.html 安装:http://www.91ri.org/2867.html yu ...
- 【转】maven导出项目依赖的jar包
本文转自:http://my.oschina.net/cloudcoder/blog/212648 一.导出到默认目录 targed/dependency 从Maven项目中导出项目依赖的jar包:进 ...
- PHP+七牛云存储上传图片代码片段
2014年11月14日 16:37:51 第一段代码是上传单个图片的,第二个是上传多个图片的 //上传到七牛 //单个文件 //formname: 表单名字; pre: 图片Url中显示的图片名字(也 ...
- c# 获取屏幕DPI
方法一:用ManagementClass来获取.需要引入System.Management.dll; using (ManagementClass mc = new ManagementClass(& ...
- [Android Pro] 超能RecyclerView组件使用
RecyclerView最强大的功能在于秒变功能,只需要改动很少的代码就可以实现ListView,GridView及水平ListViw的切换功能 public class MainActivity e ...
- Java 批量反编译class文件,并保持目录结构
jad -o -r -d d:\src -s java C:\Users\spring\Desktop\egorder3.0\WEB-INF\classes\**\*.class -o - overw ...
- HTTP协议的几个概念
http://www.rupeng.com/favicon.ico 可获取当前图标favicon.ico服务器是指定文件名,不能更改一.HTTP协议的几个概念1.连接(Connection):浏览器和 ...
- Stringbuffer与Stringbuilder源码学习和对比
>>String/StringBuffer/StringBuilder的异同 (1)相同点观察源码会发现,三个类都是被final修饰的,是不可被继承的.(2)不同点String的对象是不可 ...
- .net学习之多线程、线程死锁、线程通信 生产者消费者模式、委托的简单使用、GDI(图形设计接口)常用的方法
1.多线程简单使用(1)进程是不执行代码的,执行代码的是线程,一个进程默认有一个线程(2)线程默认情况下都是前台线程,要所有的前台线程退出以后程序才会退出,进程里默认的线程我们叫做主线程或者叫做UI线 ...
- Xamarin.Android开发实践(八)
Xamarin.Android其他类型的服务 一.前言 前面我们已经学了关于服务的很多知识,但是对于真实的开发那些远远不够,通过这节我们将学习其他类型的服务,比如前台服务.IntentService和 ...