java网络爬虫,使用apache httpClient
2014-12-03 13:46
507 查看
我是从官网下载的最新版本,windows操作系统选zip版本就行了。
在网上搜的一些资料,感觉提供的类有点旧了。新下载的包没有相关类,用法也不对。对了,我下载的版本是4.3.6。
所以只能自己搜索资料摸索,在下载的包中有相应的guide指导,还有一些现成的例子。
我自己写了一个简单的例子:
1.doGet方法用于获取不需要登录的网站数据,完全没有问题
2.doPost只对特定的网站有用,比如用户名,密码不加密明文传输的。它的升级版可以参照牛人的博客,针对新浪微博模拟登陆,爬取数据。
import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache.http.ParseException; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.jsoup.Jsoup; import org.jsoup.nodes.Attributes; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; /** * 最简单的HTTP客户端,用来演示通过GET,post方式访问某个页面 * * @author napoleonjk */ public class SimpleClient { public static void main(String[] args) { SimpleClient client = new SimpleClient(); CloseableHttpClient httpclient = HttpClients.createDefault(); // 简易get String uri = "http://www.baidu.com"; client.doGet(uri, httpclient); System.out.println("----------------------------"); // 模拟登录post访问 uri = "https://xxxxxxx/account/login"; client.doPost(uri, "xxxxx", "xxxxx", httpclient); } // get方式 public void doGet(String uri, CloseableHttpClient httpclient) { // 创建HttpGet,将要请求的URL通过构造方法传入HttpGet对象。 HttpGet httpget = new HttpGet(uri); try { CloseableHttpResponse response = httpclient.execute(httpget); formatHtml(response); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } // post方式 public void doPost(String uri, String username, String password, CloseableHttpClient httpclient) { try { // 创建HttpPost,将要请求的URL通过构造方法传入HttpPost对象 HttpPost post = new HttpPost(uri); post.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1) " + "AppleWebKit/535.11 (KHTML, like Gecko) " + "Chrome/17.0.963.83 " + "Safari/535.11"); String login_type = "username";// 也可能是别的校验方式,例如HTTP Basic // Authentication,处理就不同了 String cookietime = "0"; String btn_submit = "%E7%99%BB%E5%BD%95"; // 登录表单的信息 List<NameValuePair> qparams = new ArrayList<NameValuePair>(); qparams.add(new BasicNameValuePair("login_type", login_type)); qparams.add(new BasicNameValuePair("stu_no", username)); qparams.add(new BasicNameValuePair("password", password)); qparams.add(new BasicNameValuePair("cookietime", cookietime)); qparams.add(new BasicNameValuePair("btn_submit", btn_submit)); UrlEncodedFormEntity params = new UrlEncodedFormEntity(qparams, "UTF-8"); post.setEntity(params); CloseableHttpResponse response = httpclient.execute(post); Document doc = formatHtml(response); // ----------------------------再次访问页面中其他超链接 Elements aTags = doc.getElementsByTag("a");//获取页面中的超链接 if (aTags.size()>0) { Element aElement = aTags.get(0);//取数组中的第一个超链接 Attributes attributes = aElement.attributes(); String newUri = attributes.get("href"); doGet(newUri, httpclient);//get方式爬取新页面 } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //使用Jsoup格式化爬取的网页内容 private Document formatHtml(CloseableHttpResponse response) throws ParseException, IOException { // 相当于按了下确定登录的按钮,也就是浏览器调转了 HttpEntity httpEntity = response.getEntity(); String entityMsg = EntityUtils.toString(httpEntity); Document doc = Jsoup.parse(entityMsg); String msg = doc.html();// 获取原生页 System.out.println(msg); return doc; } }
相关类库:
Apache HttpClient :http://hc.apache.org/downloads.cgi
Jsoup :http://jsoup.org/download
注意点:1.代理问题
一开始,想爬取百度的首页,老是报告以下错误,后来发现是因为公司使用的代理,需要进行代理设置。
java.net.UnknownHostException: www.baidu.com
我嫌麻烦,索性访问本地正在做的项目的地址,结果成功获取页面内容。
2.多线程并发访问,设置访问间隔,模拟登陆,登录校验类型,增加cookie,数据存储
当你想把这个类写的完善时,以上是你需要考虑的问题。
(爬取新浪微博参考博客链接http://blog.csdn.net/memray/article/details/8876844)
相关文章推荐
- java 使用httpclient出错org.apache.http.client.ClientProtocolException
- (二)使用apache的commons-httpclient-3.1.jar之通过Java实现发起HTTP请求【使用代理】
- (一)使用apache的commons-httpclient-3.1.jar之通过Java实现发起HTTP请求【不需要代理】
- Apache Common HttpClient七种常用使用方法和注意事项
- Apache的HttpClient项目的3.x版本的使用问题
- Java HttpClient使用小结
- HttpClient(JAVA)使用笔记
- Android使用Apache HttpClient发送GET、POST请求
- Java用apache的HttpClient发送Post请求
- Android的网络应用-使用Apache HttpClient
- Java HttpClient使用小结
- Android-网络请求数据使用apache httpclient v4
- java apache commons HttpClient发送get和post请求的学习整理
- Java用org.apache.http.client的HttpClient发送Post请求 可获取返回Header
- Java Tutorial: How to Create RESTful Java Client using Apache HttpClient – Example
- 什么是httpclient?& Httpclient使用前提----下载org.apache.commons.httpclient,导入Httpclient的jar包
- Java--org.apache.http.client的HttpClient发送Post请求,获取返回Header
- Apache Common HttpClient使用之七种武器
- RESTful Java client with Apache HttpClient
- Java模拟HTTP的Get和Post请求(增强) Apache-httpclient