http://ayang1588.github.io/blog/2013/04/08/catchdata/

最近处于离职状态,正赶清闲,开始着手自己的毕业设计,课题定的是JavaWeb购物平台,打算用SpringMVC+MyBatis实现,打算添加缓存服务器,用什么还没有想好,依赖用Maven管理,数据库用MySql,IDE就用Inetllij IDEA。


  购物平台业务都差不多,平时经常使用,业务大家都比较熟悉,我打算模拟当当网,所以昨天直接把数据库设计好,并建了起来,今天打算准备数据,可是product表和book表的字段稍微有点多,如果上网一个一个的摘录,肯定是不行事儿的,也不是coder做的事儿,要准备多的数据,又是重复的事儿,何不让计算机帮你干。所以打算用Java程序抓取现当当网的数据,提取自己想要的,并直接存入数据库。经过一下午的努力基本实现了功能,由于分类并不打算和当当网的分类一样那么多,所以实现了符合自己的半自动化数据抓取功能。可以实现输入当当网的类别(category_path),和起始结束页,自动填充数据库中对应对象。
  最开始用的正则匹配抓取内容,后来发现太麻烦了,正则左一斜杠右一斜杠的,又转义又拼接,一会就晕了,所以放弃了,改为像操作Dom树一样进行抓取,用到的开源包Jsoup文档),也支持像CSS过滤器一样过滤节点,很方便。但是这样并不支持获取js及ajax访问返回数据后的页面,但用htmlunit可以解决这个问题,htmlunit:传说中Java程序员的浏览器,具体使用不太难,就是模拟浏览器,设置好相关属性就可以开始访问了。这里有一篇淘宝关于定向抓取的介绍,大家可以看看(定向抓取漫谈)。
  以下是我访问当当数据的类(其余的就不贴了,数据库存储用的最原始的JDBC,没什么好说的,这个只是随便写个大概,够自己用了,其实完全可以拓展成通用的工具类,我就不封装了,本来就挺方便的,直接用也就够了),如果哪里有问题请记得及时给我留言

 public class Utils {

   // UrlVo类存放了3个url,列表图片url,详细信息中的图片url,和商品详细信息url
// 再通过这三个url可以把所有数据读取出来并封装成对象,然后存入数据库。
// 同时将所用到的图片下载到本地。 /**
* 从一个页面获取该页面商品详细信息的url链接和小图片的链接地址
* @param url
* @return
* @throws
*/
public static void getBookUrlFromPage(String url, List list) throws Exception{
// timeout 0:不断请求 默认:2000毫秒超时
Document document = Jsoup.connect(url).timeout(0).get();
Elements node = document.select(".resultlist");
Elements elements = node.get(0).child(0).children();
for (Element item : elements) {
UrlVO urlVO = new UrlVO();
urlVO.setProductDetailUrl(item.child(1).child(0).child(0).child(0).attr("href"));
urlVO.setSmallImageUrl(item.child(0).child(0).child(0).attr("src"));
list.add(urlVO);
}
} /**
* 根据url和页数获取商品详细url
* @param url
* @param startPage
* @param endPage
* @param list
*/
public static void getBookUrlByUrlAndPageNum(String url, Integer startPage, Integer endPage, List list) {
try {
for(int i = startPage; i <= endPage; i++) {
String urlStr = url + i;
Utils.getBookUrlFromPage(urlStr, list);
}
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 根据商品详细页面获取Product对象
* @param url
* @return
*/
public static Product getProductFromUrl(String url) {
//这里有些数据利用jsoup获取不到
//我用的是htmlunit,设置setJavaScriptEnabled,setAjaxController等参数
//具体代码就不贴了,大家可以自己试试
//如有需要,求留言
return null;
} /**
* 根据图片url和文件名保存图片
* @param urlStr
* @param filename
*/
public static void saveImageByUrlAndName(String urlStr, String filename) throws Exception{
// 构造URL
URL url = new URL(urlStr);
// 打开连接
URLConnection con = url.openConnection();
// 输入流
InputStream is = con.getInputStream();
// 1K的数据缓冲
byte[] bs = new byte[1024];
// 读取到的数据长度
int len;
// 输出的文件流
OutputStream os = new FileOutputStream(filename);
// 开始读取
while ((len = is.read(bs)) != -1) {
os.write(bs, 0, len);
}
os.flush();
// 关闭连接
os.close();
is.close();
} // 测试及调用
public static void main(String[] args) {
List<UrlVO> list = new ArrayList<UrlVO>();
try {
getBookUrlByUrlAndPageNum("http://category.dangdang.com/all/?category_path=01.03.38.00.00.00&page_index=", 1, 2, list);
// getBookUrlFromPage("http://category.dangdang.com/all/?category_path=01.03.38.00.00.00&page_index=2", list);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(list.size()); // 保存图片
// String urlStr = "http://img32.ddimg.cn/28/35/23207212-1_l.jpg";
// try {
// saveImageByUrlAndName(urlStr, "1.jpg");
// } catch (Exception e) {
// e.printStackTrace();
// }
}
}

Java抓取网页数据的更多相关文章

  1. java抓取网页数据,登录之后抓取数据。

    最近做了一个从网络上抓取数据的一个小程序.主要关于信贷方面,收集的一些黑名单网站,从该网站上抓取到自己系统中. 也找了一些资料,觉得没有一个很好的,全面的例子.因此在这里做个笔记提醒自己. 首先需要一 ...

  2. 使用JAVA抓取网页数据

    一.使用 HttpClient 抓取网页数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ...

  3. Java抓取网页数据(原网页+Javascript返回数据)

    有时候由于种种原因,我们需要采集某个网站的数据,但由于不同网站对数据的显示方式略有不同! 本文就用Java给大家演示如何抓取网站的数据:(1)抓取原网页数据:(2)抓取网页Javascript返回的数 ...

  4. Java抓取网页数据(原来的页面+Javascript返回数据)

    转载请注明出处! 原文链接:http://blog.csdn.net/zgyulongfei/article/details/7909006 有时候因为种种原因,我们须要採集某个站点的数据,但因为不同 ...

  5. Jsoup一个简短的引论——采用Java抓取网页数据

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/40115479 概述 jsoup 是一款Java 的HTML解析器,可直接解析某个U ...

  6. 01 UIPath抓取网页数据并导出Excel(非Table表单)

    上次转载了一篇<UIPath抓取网页数据并导出Excel>的文章,因为那个导出的是table标签中的数据,所以相对比较简单.现实的网页中,有许多不是通过table标签展示的,那又该如何处理 ...

  7. Asp.net 使用正则和网络编程抓取网页数据(有用)

    Asp.net 使用正则和网络编程抓取网页数据(有用) Asp.net 使用正则和网络编程抓取网页数据(有用) /// <summary> /// 抓取网页对应内容 /// </su ...

  8. 使用HtmlAgilityPack批量抓取网页数据

    原文:使用HtmlAgilityPack批量抓取网页数据 相关软件点击下载登录的处理.因为有些网页数据需要登陆后才能提取.这里要使用ieHTTPHeaders来提取登录时的提交信息.抓取网页  Htm ...

  9. web scraper 抓取网页数据的几个常见问题

    如果你想抓取数据,又懒得写代码了,可以试试 web scraper 抓取数据. 相关文章: 最简单的数据抓取教程,人人都用得上 web scraper 进阶教程,人人都用得上 如果你在使用 web s ...

随机推荐

  1. MySQL 行子查询(转)

    MySQL 行子查询 行子查询是指子查询返回的结果集是一行 N 列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集. 一个行子查询的例子如下: SELECT * FROM table1 WH ...

  2. 检测到有潜在危险的 Request.Form

    今天在做一个.net的新闻发布器的时候. 遇到这样的一个问,在html编辑器里面加入图片提交的时候 就报一个 从客户端(content1="<img src="/web/ne ...

  3. xtrabackup原理0

  4. 从一行代码里面学点JavaScript

    从一行代码里面学点JavaScript 现如今,JavaScript无处不在,因此关于JavaScript的新知识也是层出不穷.JavaScript的特点在于,要学习它的语法入门简简单,但是要精通使用 ...

  5. 实例源码--Android自定义Gallery动画效果

    相关文档与源码: 下载源码   技术要点: 1.自定义控件的使用 2.Gallery控件的使用实例 3.详细的源码注释 ...... 详细介绍: 1.自定义控件的使用 本套源码通过自定义控件的方式,继 ...

  6. mongoDB 插入数据 用java实现

    import java.net.UnknownHostException; import com.mongodb.BasicDBObject; import com.mongodb.DB; impor ...

  7. python django第一天

    django第一天,上一次是使用了virtualenv(沙盒),这一次就直接用virtualenv直接建一个django的环境,用来自己练着试试django: source django/Script ...

  8. [设计模式]<<设计模式之禅>>之关于单一职责原则

    单一职责原则的英文名称是Single Responsibility Principle,简称是SRP. 这个原则存在争议之处在哪里呢?就是对职责的定义,什么是类的职责,以及怎么划分类的职责.我们先举个 ...

  9. hdu 4417 划分树

    思路:二分枚举区间第k大.用划分树查找是否符合要求的高度. #include<iostream> #include<algorithm> #include<cstdio& ...

  10. android 代码设置、打开wifi热点及热点的连接

    用过快牙的朋友应该知道它们在两天设备之间传输文件的时候使用的是wifi热点,然后另一台便连接这个热点再进行传输.快牙传输速度惊人应该跟它的这种机制有关系吧.不知道它的搜索机制是怎样的,但我想应该可以通 ...