需求:从网址http://www3.tjcu.edu.cn/wangshangketang/yuanneike/guanlixue/sjxz.htm上下载所有的pdf文件
代码如下:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.conn.params.ConnPerRouteBean;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.AndFilter;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
public class Crawler implements Runnable{
public static String SAVE="C:/Users/Administrator/Downloads";//下载保存路径
private String url="";//要抓取的网页地址
public Crawler(String url){
this.url=url;
}
public Crawler(){}
/**
*
* @param url 要抓取的网页的地址
* @return 这个对应的内容
* @throws ClientProtocolException
* @throws IOException
*/
private String crawl(String url) throws ClientProtocolException, IOException{
System.out.println("[INFO] Crawl From : "+url);
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet=new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity=httpResponse.getEntity();
InputStream inStream=httpEntity.getContent();
String content="";
while(true){
byte[] bytes=new byte[1024*1000];
int k=inStream.read(bytes);
if(k>=0)content=content+new String(bytes,0,k);
else break;
System.out.println(content);
System.out.println("=========================================================================================");
}
return content;
}
public void run(){
try {
String prefix=this.url.substring(0,this.url.lastIndexOf("/"));
String content=this.crawl(this.url);//抓取网页内容
Parser parser=new Parser(content); //使用HTMLParser对网页内容进行解析
NodeFilter filter;
NodeList list;
filter=new NodeClassFilter(LinkTag.class);
filter=new AndFilter(filter,new NodeFilter(){
public boolean accept(Node node) {
return ((LinkTag)node).isHTTPLink();
}});
list=parser.extractAllNodesThatMatch(filter);
List<String> urlsList =new ArrayList<String>();
for(int i=0;i<list.size();i++){
String[] array=list.elementAt(i).getText().split("\"");
if(array[1].endsWith(".pdf")||array[1].endsWith(".PDF")){//只下载pdf
String downloadUrl=new String(prefix+"/"+array[1]);
urlsList.add(downloadUrl);//生成需要下载的地址
}
}
//从这里开始是进行下载,使用了多线程执行请求
HttpParams params=new BasicHttpParams();
//ConnManagerParams.setTimeout(params, 60000*3); //设置连接最大等待时间
ConnManagerParams.setMaxConnectionsPerRoute(params, new ConnPerRouteBean(50));//设置并发数
//HttpConnectionParams.setConnectionTimeout(params, 60000*2); //设置连接超时时间
HttpConnectionParams.setSoTimeout(params, 60000*10);//设置读取超时时间
SchemeRegistry schemeRegistry=new SchemeRegistry();
schemeRegistry.register(new Scheme("http",PlainSocketFactory.getSocketFactory(),80));
schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
ThreadSafeClientConnManager cm=new ThreadSafeClientConnManager(params,schemeRegistry);
HttpClient httpClient=new DefaultHttpClient(cm,params);
Thread[] threads=new Thread[urlsList.size()];
int n=0;
for(String url:urlsList){
String path=Crawler.SAVE+url.substring(url.lastIndexOf("/"), url.length());
url=url.substring(0, url.lastIndexOf("/"))+"/"+URLEncoder.encode(url.substring(url.lastIndexOf("/")+1,url.length()),"UTF-8");
HttpGet httpGet=new HttpGet(url);
threads[n]=new Thread(new Downloader(httpClient,httpGet,url,path));
n++;
}
for(Thread thread:threads)thread.start();
for(Thread thread:threads)if(thread.isAlive())thread.join();
}catch (InterruptedException e) {
System.out.println("[ERROR] Download InterruptedException : "+e.toString());
//e.printStackTrace();
} catch (ParserException e) {
System.out.println("[ERROR] Parse ParserException : "+e.toString());
//e.printStackTrace();
}catch (ClientProtocolException e) {
System.out.println("[ERROR] Crawl ClientProtocolException : "+e.toString());
//e.printStackTrace();
} catch (IOException e) {
System.out.println("[ERROR] Crawl IOException : "+e.toString());
//e.printStackTrace();
}
}
public static void main(String[] args) {
//入口程序
Crawler crawler=new Crawler("http://www3.tjcu.edu.cn/wangshangketang/yuanneike/guanlixue/sjxz.htm");//这里设定网页地址
Thread thread=new Thread(crawler);
thread.start();
}
}
//类Downloader真正的执行了写入网络数据到文件的步骤
class Downloader implements Runnable{
private String url="";
private String path="";
private final HttpClient httpClient;
private final HttpContext httpContext;
private final HttpGet httpGet;
/**
*
* @param httpClient 多个线程共享的HtppClient
* @param httpGet 要下载的HttpGet
* @param url 资源网络地址
* @param path 资源下载之后本地的保存路径
*/
public Downloader(HttpClient httpClient,HttpGet httpGet,String url,String path){
this.httpClient=httpClient;
this.httpGet=httpGet;
this.httpContext=new BasicHttpContext();
this.path=path;
this.url=url;
}
public void run() {
System.out.println("[INFO] Download From : "+this.url);
File file=new File(this.path);
if(file.exists())file.delete();
try {
//使用file来写入本地数据
file.createNewFile();
FileOutputStream outStream = new FileOutputStream(this.path);
//执行请求,获得响应
HttpResponse httpResponse = this.httpClient.execute(this.httpGet,this.httpContext);
System.out.println("[STATUS] Download : "+httpResponse.getStatusLine()+" [FROM] "+this.path);
HttpEntity httpEntity=httpResponse.getEntity();
InputStream inStream=httpEntity.getContent();
while(true){//这个循环读取网络数据,写入本地文件
byte[] bytes=new byte[1024*1000];
int k=inStream.read(bytes);
if(k>=0){
outStream.write(bytes,0,k);
outStream.flush();
}
else break;
}
inStream.close();
outStream.close();
} catch (IOException e){
this.httpGet.abort();
System.out.println("[ERROR] Download IOException : "+e.toString()+" [FROM] : "+this.path);
//e.printStackTrace();
}
}
}
分享到:
相关推荐
- 创建HttpClient实例,如`CloseableHttpClient httpclient = HttpClients.createDefault();` - 构建HttpGet或HttpPost对象,设置URL和请求参数。 - 执行请求,如`CloseableHttpResponse response = httpclient....
HttpClient常用于爬虫、API调用、自动化测试等多个场景。例如,你可以使用它来抓取网页内容、提交表单数据、下载文件等。在实际项目中,通常需要结合其他库(如Apache Commons IO、Jackson等)来处理响应内容和进行...
4. **创建HttpClient实例**:在Java中,使用HttpClient进行网络请求首先需要创建HttpClient的实例,文档中展示了如何通过HttpClients.createDefault()创建一个默认配置的HttpClient实例。 5. **构建GET请求**:教程...
Java爬虫技术是一种在互联网上自动获取网页信息的程序,它是大数据时代的重要工具之一,尤其在数据分析、信息抓取和搜索引擎优化等领域具有广泛的应用。在这个无视频、图文教程中,我们将深入探讨Java语言如何用于...
【基础版爬虫源码】是一个适合初学者的爬虫程序示例,它提供了一个简单的起点,让学习者能够理解并实践网页数据抓取的基本原理和步骤。爬虫是计算机科学领域的一种技术,用于自动地从互联网上搜集信息,它是大数据...
14页的篇幅意味着它可能提供了一个快速入门的指南,涵盖了爬虫的基本概念、主要工具、常见库以及实现简单爬虫的步骤。PDF格式意味着信息将以文本形式呈现,易于阅读和打印。 【标签】"Java爬虫信息抓取共14页.p...
在本文中,我们将深入探讨WebMagic的核心概念、主要组件、使用方法以及如何通过示例项目spider_demo来实现一个简单的爬虫。 **1. WebMagic简介** WebMagic是一个用Java编写的轻量级爬虫框架,它提供了丰富的功能,...
本文将深入探讨如何使用Java实现简单的网页内容抓取,适合初学者入门学习。 首先,我们需要理解网页抓取的基本原理。网页本质上是由HTML(超文本标记语言)构成的,而HTTP(超文本传输协议)则是网页内容传输的基础...
凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实...
在这个例子中,我们创建了一个HttpClient实例,然后使用PostMethod向指定URL发送POST请求。注意,我们需要处理字符编码问题,将服务器返回的字节流转换为字符串时,要确保与网页的编码一致(这里是`gb2312`)。此外...
为了使用HTTPComponents Client 5.1,我们需要在项目中导入相应的jar包,然后通过代码来配置和实例化HttpClient对象。以下是一个简单的示例: ```java CloseableHttpClient httpClient = HttpClients.custom() ....
【标题】"C#贴吧采集Email小工具源码"是一个基于C#编程语言开发的简易程序,主要...它提供了抓取网页数据的实际应用实例,但使用时需要注意其可能存在的问题和不完善之处,以及对网络数据采集的合法性和道德性的考量。
- `README.txt`:简要介绍了库的用途和使用方法,是快速入门的指南。 四、实例应用 下面是一个简单的使用HTTPComponents Client发送GET请求的例子: ```java CloseableHttpClient httpClient = HttpClients....
7. **全面的文档支持**:官方提供了详尽的文档,包括快速入门、API参考、示例代码等,帮助开发者更好地理解和使用Forest。 8. **兼容性广泛**:Forest不仅适用于Java标准版,还支持Java EE和Spring Boot等企业级...
FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端 JOpenID JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需...
FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端 JOpenID JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需...
FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端 JOpenID JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需...
FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端 JOpenID JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需...
FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端 JOpenID JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需...
FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端 JOpenID JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需...