爬虫小demo

运用apache httpclient爬数据、httpcleaner解析爬回来的数据:

package cn.sniper.spider.util;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;
import org.htmlcleaner.XPatherException;
import org.json.JSONArray;
import org.json.JSONObject;
import org.junit.Before;
import org.junit.Test;
public class SpiderUtil {
 
 private String pageContent;
 
 @Before
 public void init() {
  HttpClientBuilder builder = HttpClients.custom();
  CloseableHttpClient client = builder.build();
  String url = "http://www.2345.com/";
  
  HttpGet request = new HttpGet(url);
  
  try {
   CloseableHttpResponse resp = client.execute(request);
   HttpEntity entity = resp.getEntity();
   pageContent = EntityUtils.toString(entity);
  } catch (ClientProtocolException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 
 /**
  * 抓取整个页面
  */
 @Test
 public void testDownload1() {
  HttpClientBuilder builder = HttpClients.custom();
  CloseableHttpClient client = builder.build();
  String url = "http://www.2345.com/";
  
  HttpGet request = new HttpGet(url);
  
  try {
   CloseableHttpResponse resp = client.execute(request);
   HttpEntity entity = resp.getEntity();
   String pageContent = EntityUtils.toString(entity);
   System.out.println(pageContent);
  } catch (ClientProtocolException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 
 /**
  * 取得text内容
  */
 @Test
 public void testDownload2() {
  HtmlCleaner cleaner = new HtmlCleaner();
  TagNode rootNode = cleaner.clean(pageContent);
  
  //拿到id=name元素中的第一个h1元素,如果只有一个,//*[@id=\"name\"]h1
  String xPathExpression = "//*[@id=\"name\"]h1[1]";
  
  try {
   Object[] objs = rootNode.evaluateXPath(xPathExpression);
   
   TagNode node = (TagNode)objs[0];
   System.out.println(node.getText());
  } catch (XPatherException e) {
   e.printStackTrace();
  }
  
 }
 
 /**
  * 通过属性名称取得值
  */
 @Test
 public void testDownload3() {
  HtmlCleaner cleaner = new HtmlCleaner();
  TagNode rootNode = cleaner.clean(pageContent);
  
  String xPathExpression = "//*[@id=\"j_search_img\"]";
  
  try {
   Object[] objs = rootNode.evaluateXPath(xPathExpression);
   
   TagNode node = (TagNode)objs[0];
   String src = node.getAttributeByName("src");
   
   //注意,需要写前缀:http:// 否则报错:java.net.MalformedURLException: no protocol
   URL url = new URL("http://www.2345.com/" + src);
   URLConnection conn = url.openConnection();
   InputStream is = conn.getInputStream();
   
   FileOutputStream fos = new FileOutputStream("D:/1.gif");
   
   int b = 0;
   while((b = is.read()) != -1) {
    fos.write(b);
   }
   
   fos.close();
   is.close();
   
   System.out.println(src);
  } catch (XPatherException e) {
   e.printStackTrace();
  } catch (MalformedURLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
 }
 
 /**
  * 抓取的页面返回json数据
  */
 @Test
 public void testDownload4() {
  HttpClientBuilder builder = HttpClients.custom();
  CloseableHttpClient client = builder.build();
  String url = "http://www.2345.com/";
  
  HttpGet request = new HttpGet(url);
  
  try {
   CloseableHttpResponse resp = client.execute(request);
   HttpEntity entity = resp.getEntity();
   String pageContent = EntityUtils.toString(entity);
   
   JSONArray jsonArray = new JSONArray(pageContent);
   JSONObject jsonObj = (JSONObject)jsonArray.get(0);
   System.out.println(jsonObj.get("price"));
  } catch (ClientProtocolException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 
}
时间: 2024-10-10 05:08:52

爬虫小demo的相关文章

Scrapy爬虫小demo总结

一. Scrapy入坑. a)       Scrapy的安装. 这个没什么可讲的,网上一大把. 注意的问题,可能我下载的是32位的python,出现了pywin32没法用的情况,这个直接pip install pypiwin32 就好. b)       安装验证. scrapy genspider baidu www.baidu.com 建立一个爬百度的爬虫. scrapy crawl baidu 成功爬取数据. c)        Scrapy项目创建: 首先进入要创建项目的目录:cd x

jsoup爬虫简书首页数据做个小Demo

昨天LZ去面试,遇到一个大牛,被血虐一番,发现自己基础还是很薄弱,对java一些原理掌握的还是不够稳固,比如java反射注解,知道一点就是说不出来,很尴尬- 生命不止,学习不止啊 之前那个项目 QNews 用的是的第三方的数据平台,所以访问次数会有限制,这就很无奈... 我的博客地址 每天只能请求100次-.但是LZ这个穷屌丝也买不起服务器,所以就上网查,有什么别的方法可以获取数据,意外之间发现了jsoup这个强大的框架,就花了上午时间学习了一下,然后下午做了一个小Demo,功能比较单一,请见谅

前后端分离的爬虫小项目

前后端分离的爬虫小项目-----EncycProject EncycProject项目使用现在流行的前后端分离技术:此项目创作目的是实践.利用此项目快速搭建环境和快速入门.该项目的主线是建立宠物社区网站.目前该项目完成第一个模块:宠物百科:剩余模块陆续开发中.(此项目可以变更,第一模块耦合度低) 项目地址 项目GitHub地址 1 项目效果 1.1 效果图: 爬虫数据数据库数据前端 待续 2 项目结构图 3.1 框架整合 3.1.1 pom.xml <?xml version="1.0&q

Nancy之基于Self Hosting的补充小Demo

前面把Hosting Nancy with ASP.NET.Self Hosting Nancy和Hosting Nancy with OWIN 以demo的形式简单描述了一下. 这篇是为Self Hosting Nancy.和Owin 下面的Self Hosting作个补充. 首先是Self Hosting Nancy的补充: 这里主要是介绍一下Topshelf 官网:http://topshelf-project.com/ GitHub地址:https://github.com/Topshe

用backbone实现的一个MVC的小demo

一.Apache配置 本实例需要使用php支持.要现在Apache中配置虚拟目录,在Apache下的httpd-vhosts.conf文件中添加如下代码 <VirtualHost *:80> DocumentRoot "D:/htdocs/backbone_demo" ServerName www.backbonedemo.cn </VirtualHost> 在windows的hosts文件中添加配置,hosts文件的位置在c:\windows\system32

福利贴——爬取美女图片的Java爬虫小程序代码

自己做的一个Java爬虫小程序 废话不多说,先上图. 文件夹命名是用标签缩写,如果大家看得不顺眼可以等下载完成后手动改一下,比如像有强迫症的我一样... 这是挂了一个晚上下载的总大小,不过还有很多因为一些问题没有遍历下载到,而且会产生很多空文件,最下面我附带了一个递归删除空文件夹的小程序代码. 接下来是文件夹内部~ 图片存放位置默认为d:\picture,可在程序中更改,main函数的开头就是,有注释.爬取的网站为http://www.mmonly.cc/,大家有更好的资源网站可以私我. 爬虫源

结对项目小DEMO

这次小DEMO主要实现下面两个功能: 实现两个页面的相互跳转 通过多线程实现网络发送请求 本人负责界面与说明文档编写,搭档负责java代码的具体实现. xml代码: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_

React问答小demo

在学习react初期,看了一些视频和资料,react基础知识差不多学完,跟着网上的一个教程,做了一个小型的问答demo. 需求看图说: 1.点击"添加"按钮,显示问题输入表单,再次点击,隐藏表单.同时,点击"取消"按钮,隐藏表单. 2.输入问题标题和内容后,点击"确认"按钮,将问题显示在下方(按照投票数从高到低). 3.每个问题有加票和减票功能,在点击的同时,将问题按照投票数从高到低排序. 实现过程: 一.开发环境和工具 1.npm init (

Nancy之基于Nancy.Owin的小Demo

前面做了基于Nancy.Hosting.Aspnet和Nancy.Hosting.Self的小Demo 今天我们来做个基于Nancy.Owin的小Demo 开始之前我们来说说什么是Owin和Katana 什么是Owin呢? 官网地址:http://owin.org OWIN在.NET Web Servers与Web Application之间定义了一套标准接口,OWIN的目标是用于解耦Web Server和Web Application. 什么是Katana呢? 官网地址:http://kata