- 浏览: 579352 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (253)
- java (84)
- python (22)
- 设计模式 (12)
- 数据结构和算法 (7)
- ibatis (1)
- 数据挖掘 (2)
- 集体智慧读书笔记 (1)
- ubuntu (4)
- lucene (11)
- 算法 第4版 (11)
- apache mina (16)
- memcached (1)
- android (9)
- netty (6)
- mongodb (2)
- maven (2)
- openfire (2)
- 服务端 (21)
- 产品 (0)
- apache (1)
- 选择 (2)
- 构架WEB高性能站点 (7)
- redis (8)
- 诗词歌赋 (3)
- 源代码阅读 (5)
- 前端 (1)
- javascript (3)
- guice (1)
- 分布式 (5)
- 总结-2014 (4)
- jvm (1)
最新评论
-
liu_jiaqiang:
写的挺好
maven多项目管理 -
H972900846:
我想知道哪里整的,如果是自己写的,那有点牛呀如果是抄的请说明出 ...
SSL身份认证原理 -
春天好:
博主写的很好,赞一个,多谢分享 *(^-^*)分享一个免费好用 ...
定向网站爬虫---初级例子 -
fenglingabc:
经过测试,parameterType="java.u ...
mybatis获取主键和存储过程返回值 -
jyghqpkl:
[u][/u] ...
Cookie的secure 属性
1:url处理和html解析
package com.xiaoshuo.util; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import com.xiaoshuo.to.Chapter; import com.xiaoshuo.to.UrlTO; /** * 解析html的处理类 * @author lijunqing * */ public class PaserUrlUtil { private HttpClient httpClient=new DefaultHttpClient(); /** * 获得html的string字符串 * @param url * @return * @throws Exception */ public String getHtmlStr(String url) throws Exception { HttpGet httpGet=new HttpGet(url); HttpResponse response; String htmlStr=null; try { response=httpClient.execute(httpGet); HttpEntity entity=response.getEntity(); if(entity != null) { htmlStr=new String(EntityUtils.toString(entity)); htmlStr=new String(htmlStr.getBytes("ISO-8859-1"), "gbk"); // 读取乱码解决 } } catch(Exception e) { e.printStackTrace(); } return htmlStr; } /** * 获得document * @param url * @return * @throws Exception */ public Document getDocument(String url) throws Exception{ Thread.currentThread().sleep(5000*2); return Jsoup.parse(getHtmlStr(url)); } /** * 获得种类url连接 * @return * @throws Exception */ public List<UrlTO> getCategoryUrls(String url) throws Exception{ Document doc = getDocument(url); List<UrlTO> urlList = new ArrayList<UrlTO>(); Elements elements = doc.select(".navlist").select("li").select("a"); String categoryUrl= null; UrlTO urlTO=null; for(Element element:elements){ categoryUrl = element.attr("href"); urlTO = new UrlTO(); urlTO.setDeptValue(1); urlTO.setUrl(categoryUrl); urlList.add(urlTO); } return urlList; } /*** * 通过分类url获得所有的该类下书籍url * @param categoryUrl * @return * @throws Exception */ public List<UrlTO> getBookUrls(String categoryUrl) throws Exception{ System.out.println("bookUrls-处理进入 deptvalue-==1-"); List<UrlTO> urlTOList = new ArrayList<UrlTO>(); UrlTO urlTO = new UrlTO(); urlTO.setDeptValue(2); String nextUrl = getNextBookUrl(categoryUrl); while(nextUrl != null && !nextUrl.trim().equals("")){ System.out.println("bookUrls--"+nextUrl); urlTO.setUrl(nextUrl); nextUrl = getNextBookUrl(nextUrl); urlTOList.add(urlTO); } return urlTOList; } /** * 获得下一个分页连接 * @param categoryUrl * @return * @throws Exception */ public String getNextBookUrl(String categoryUrl) throws Exception{ Document doc = getDocument(categoryUrl); Elements elements = doc.select("#pagelink").select("strong +a"); if(elements == null){ return null; } return elements.first().attr("href"); } /** * 获取每个页面书籍详情url * @param categoryUrl * @return * @throws Exception */ public List<UrlTO> getDetailUrlList(String categoryUrl) throws Exception{ Document doc = getDocument(categoryUrl); Elements elements = doc.select(".grid").select("tr"); String detailUrl = null; List<UrlTO> urlTOList = new ArrayList<UrlTO>(); UrlTO urlTO = new UrlTO(); for(Element element:elements){ detailUrl = element.select("td").first().attr("href"); urlTO.setDeptValue(3); urlTO.setUrl(detailUrl); urlTOList.add(urlTO); } return urlTOList; } public UrlTO getToReadUrl(String detailUrl) throws Exception{ Document doc = getDocument(detailUrl); UrlTO urlTO = new UrlTO(); String toReadUrl=doc.select("#bt_1").select("a").first().attr("href"); urlTO.setDeptValue(4); urlTO.setUrl(toReadUrl); return urlTO; } /** * 获得chapter的url * @param url * @return * @throws Exception */ public List<UrlTO> getChapterList(String detailUrl) throws Exception { Document doc= getDocument(detailUrl); Elements elements=doc.select(".list").select("dd").select("a"); List<UrlTO> urlList=new ArrayList<UrlTO>(); UrlTO urlTO = new UrlTO(); String chapterUrl= null; for(Element element: elements) { chapterUrl = detailUrl + element.attr("href"); urlTO.setDeptValue(5); urlTO.setUrl(chapterUrl); } return urlList; } /** * * @param chapterUrl * @return * @throws Exception */ public Chapter getChapter(String chapterUrl) throws Exception { Document doc=getDocument(chapterUrl); Chapter chapter=new Chapter(); String name=doc.select("h1").text(); String content=doc.select(".width").text(); chapter.setName(name); chapter.setContent(content); return chapter; } }
2:url实体类
package com.xiaoshuo.to; /** * url保存类 * @author lijunqing * */ public class UrlTO { private Integer deptValue; private String url; public Integer getDeptValue() { return deptValue; } public void setDeptValue(Integer deptValue) { this.deptValue=deptValue; } public String getUrl() { return url; } public void setUrl(String url) { this.url=url; } public String toString(){ return "dept="+deptValue+"--url--"+url; } }
3:队列类
package com.xiaoshuo.url; import java.util.HashSet; import java.util.LinkedList; import java.util.Queue; import java.util.Set; import com.xiaoshuo.to.UrlTO; /** * 保存访问的url * @author lijunqing */ public class LinkQueue { // 已经访问的url集合 private static Set<Object> visitedUrl=new HashSet<Object>(); // 未被访问的url集合 private static Queue<Object> unVisitedUrl=new LinkedList<Object>(); public static Queue<Object> getUnVisitedUrl() { return unVisitedUrl; } public static void removeVisitedUrl(String url) { visitedUrl.remove(url); } public static Object unVisitedPoll() { return unVisitedUrl.poll(); } public static void addVisitedUrl(String url){ System.out.println("已经访问的url--"+url); visitedUrl.add(url); } public static void addUnVisitedUrl(UrlTO url) { if(url!= null && !url.getUrl().trim().equals("")&& !visitedUrl.contains(url.getUrl())){ System.out.println("想队列中添加新的url"+url.getUrl()); unVisitedUrl.offer(url); } } public static Integer getVisitedUrlNum() { return visitedUrl.size(); } public static boolean unVisitedUrlEmpty() { return unVisitedUrl.isEmpty(); } }
4:crawler爬虫类
package com.xiaoshuo.service; import java.util.ArrayList; import java.util.List; import org.junit.Test; import com.xiaoshuo.to.UrlTO; import com.xiaoshuo.url.LinkQueue; import com.xiaoshuo.util.PaserUrlUtil; /** * 宽度优先 * @author lijunqing * */ public class Crawler { PaserUrlUtil paseUrlUtil = new PaserUrlUtil(); /** * 初始化种子 * @param url */ public void initCrawlerBySeed(String url){ UrlTO urlTO = new UrlTO(); urlTO.setDeptValue(0); urlTO.setUrl(url); LinkQueue.addUnVisitedUrl(urlTO); System.out.println("UrlTO-----"+urlTO); } /** * 宽度优先搜索 * @throws Exception */ public void crawlerByBSF() throws Exception{ // 种子url String url = "http://www.shuoshuo520.com/"; //种子入队 initCrawlerBySeed(url); System.out.println("feeds-----"+url); while(!LinkQueue.unVisitedUrlEmpty()){ UrlTO visitUrl = (UrlTO)LinkQueue.unVisitedPoll(); if(visitUrl == null) continue; //放入已经访问的url中 List<UrlTO> unVisitUrlList = null; Integer deptValue = visitUrl.getDeptValue(); String nextUrl = visitUrl.getUrl(); LinkQueue.addVisitedUrl(nextUrl); System.out.println("正在处理的url实体--deptValue--"+deptValue+"--url--"+nextUrl); if(deptValue == 0){ unVisitUrlList = paseUrlUtil.getCategoryUrls(nextUrl); }else if(deptValue == 1){ unVisitUrlList = paseUrlUtil.getBookUrls(nextUrl); }else if(deptValue == 2){ unVisitUrlList = paseUrlUtil.getDetailUrlList(nextUrl); }else if(deptValue == 3){ unVisitUrlList = new ArrayList<UrlTO>(); unVisitUrlList.add(paseUrlUtil.getToReadUrl(nextUrl)); }else if(deptValue == 4){ unVisitUrlList = paseUrlUtil.getChapterList(nextUrl); }else if(deptValue == 5){ //最后一层 } for(UrlTO urlTO: unVisitUrlList){ LinkQueue.addUnVisitedUrl(urlTO); } } } }
5:其实原理差不多,爬虫要定制智能,我的意图是获得该网站数据 到直接插入到数据库中 ,然后建立索引,所以我把每个页面处理封装成对象 插入到数据库中,
6:爬虫的html解析可以用正则表达式,可以把所有的方法重写一个方法 通过配置文件传递表达式或者参数实现对 其他网站的爬虫数据
发表评论
-
protobuf-dt插件
2015-03-24 13:16 1416protobuf-dt: 安装前先安装xtext 可 ... -
java循环标签
2015-03-20 16:13 606今天看 源码的时候 看到 一个小语法 参考: ... -
java程序性能优化 --阅读
2014-10-14 17:56 707闲着,真实无聊; 发现一本好书《java程序性能优 ... -
jetty invalid entry CRC问题
2014-08-04 11:42 16061: http://stackoverflow.com/qu ... -
基础题目
2014-07-24 13:49 644package com.ljq.base; / ... -
guice注入
2014-05-24 12:13 9443Google Guice3.0: http://code. ... -
eclipse快捷键
2014-05-21 16:01 5721: clrl+alt+r : 最常用,快速定位到文件 2 ... -
java clone
2014-05-16 17:04 522转:http://www.blogjava.net/ora ... -
ThreadLocal
2014-05-13 18:39 770简单介绍一下ThreadLocal的原理:1.Thread ... -
hession
2014-04-30 12:33 695一、首先先说Hessian是什么? Hessian:he ... -
冒泡和快速排序java
2014-04-19 18:01 7521: 冒泡最简单一种: /** * 算法效率o ... -
java生产者和消费者模型三种实现
2014-04-19 17:51 13651: 生产者和消费者的问题,生产者生产产品到缓冲区,消费者 ... -
单例模式
2014-03-14 16:06 746今天看到群里,关于单例模式的多线程下的安全问题: 1:最 ... -
freemarker的使用
2014-02-28 16:42 8371:freemarker eclipse插件安装方法:ht ... -
java 引用类型和内存泄露
2013-11-21 17:48 582http://blog.csdn.net/luoshenfu ... -
java泛型
2013-11-07 13:52 432Class<T>在实例化的时候,T要替换成具体 ... -
filter执行顺序
2013-10-12 11:16 1123多个筛选器的运行顺序取决于下列规则: 将 filt ... -
spring rmi远程调用
2013-09-09 11:48 11751:以前用jmi发布服务,实现分布式的一种方式,远程调用, ... -
spring mvc返回204状态码
2013-07-24 09:27 39241:204是没内容 不跳转的 代表请求成功的意思 ... -
editplus去掉多余空行
2013-07-19 21:05 7381: ^[ \t]*\n 用正则表达式替换
相关推荐
基于python和定向爬虫的商品比价系统基于python和定向爬虫的商品比价系统基于python和定向爬虫的商品比价系统基于python和定向爬虫的商品比价系统基于python和定向爬虫的商品比价系统基于python和定向爬虫的商品比价...
【Python爬虫 - 基于Python的网络爬虫设计与实现】 网络爬虫是一种自动化程序,用于根据预设规则抓取互联网上的信息。在Python中,开发网络爬虫具有诸多优势,因为Python提供了丰富的库,如requests、beautifulsoup...
支持过滤指定类型的消息和指定会话,实现定向获取聊天记录。获取的信息可以保存到Excel或数据库中,为后续分析提供数据源。 适用人群: - Python开发者:可以学习Python脚本编写和API的使用方法 使用场景及目标: - ...
该程序通过分析youtobe红人信息的源码标签,获取网页信息,然后定向筛选;分页处理,连接跳转处理,访问异常处理
【课程简介】 本课程适合所有需要弥补python网络爬虫的同学,课件内容制作精细,由浅入深,适合入门或进行知识回顾。...Python网络爬虫教程 数据采集 信息提取课程 12-实例4-股票数据定向Scrapy爬虫(共23页).pptx
定向增发--股份认购合同.doc
参考资料-定向增发--股份认购合同.zip
定向增发--股份认购合同-精品模板文案.doc
基于python和定向爬虫的商品比价系统的实现 (基于python3.6和定向爬虫的商品比价系统的实现) 三个文件夹: first文件夹是用面向对象实现的代码,实现了数据库和图形界面。 second使用面向过程的代码,实现了...
[合同&协议书]定向增发--股份认购合同.doc
【课程简介】 本课程适合所有需要弥补python网络爬虫的同学,课件内容制作精细,由浅入深,适合入门或进行知识回顾。 本章为该课程的其中一个章节 ...12-实例4-股票数据定向Scrapy爬虫(共23页).pptx
1、基于python和定向爬虫的商品比价系统源码+项目说明(毕业设计).zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为...
毕业设计——(基于python和定向爬虫的商品比价系统的实现) 毕业设计——(基于python和定向爬虫的商品比价系统的实现) 毕业设计——(基于python和定向爬虫的商品比价系统的实现) 毕业设计——(基于python和...
主题爬虫和定向爬虫是网络爬虫技术的两种重要类型,它们在互联网信息的抓取和处理中扮演着至关重要的角色。在这个压缩包文件"network_spider"中,我们很可能会找到关于这两种爬虫技术的实现代码和相关工具。 首先,...
Thin-Film 射频微波定向耦合器-中文数据手册
在本课程中,我们将深入学习Python网络爬虫技术,特别是使用Scrapy框架来定向爬取股票数据。Python作为一门强大的编程语言,因其简洁易读的语法特性,成为了网络爬虫领域广泛采用的语言。课程涵盖了从基础的HTTP请求...
定向增发是上市公司为了筹集资金或实施重大资产重组而采取的一种发行新股的方式,它是指公司向特定对象非公开发行股票的行为。这种行为通常发生在公司需要扩大资本规模、引入战略投资者或者进行资产整合时。股份认购...
### 互联网精准广告定向技术详解 #### 一、基础知识篇 **1. HttpHeader之User-Agent** - **定义**: User-Agent(用户代理)是HTTP协议的一部分,属于头部字段的一种,通常用于向请求的网站提供客户端浏览器的信息...