网络爬虫(2)-- Java爬虫框架
2019独角兽企业重金招聘Python工程师标准>>>
Nutch
Nutch属于分布式爬虫,爬虫使用分布式,主要是解决两个问题:1)海量URL管理;2)网速。如果要做搜索引擎,Nutch1.x是一个非常好的选择。Nutch1.x和solr或者es配合,就可以构成一套非常强大的搜索引擎,否则尽量不要选择Nutch作为爬虫。用Nutch进行爬虫的二次开发,爬虫的编写和调试所需的时间,往往是单机爬虫所需的十倍时间不止。
Heritrix
Heritrix 是个“Archival Crawler”——来获取完整的、精确的、站点内容的深度复制。包括获取图像以及其他非文本内容。抓取并存储相关的内容。对内容来者不拒,不对页面进行内容上的修改。重新爬行对相同的URL不针对先前的进行替换。爬虫主要通过Web用户界面启动、监控和调整,允许弹性的定义要获取的url。
crawler4j
crawler4j是Java实现的开源网络爬虫。提供了简单易用的接口,可以在几分钟内创建一个多线程网络爬虫。
WebCollector
WebCollector使用了Nutch的爬取逻辑(分层广度遍历),Crawler4j的的用户接口(覆盖visit方法,定义用户操作),以及一套自己的插件机制,设计了一套爬虫内核。
WebMagic
WebMagic项目代码分为核心和扩展两部分。核心部分(webmagic-core)是一个精简的、模块化的爬虫实现,而扩展部分则包括一些便利的、实用性的功能。WebMagic的架构设计参照了Scrapy,目标是尽量的模块化,并体现爬虫的功能特点。
1. HttpClient&Jsoup
爬虫实现的技术有很多,对于java语言来说,有很多的选择,可以是很多开源的爬虫框架,也可以使用基本httpClient,Jsoup来爬取网页
1.1 HttpClient简介
HttpClient 是 apache 组织下面的一个用于处理 HTTP 请求和响应的开源工具。它不是一个浏览器,也不处理客户端缓存等浏览器的功能。它只是一个类库!它在 JDK 的基本类库基础上做了更好的封装。
HttpClient 项目依赖于 HttpCore(处理核心的 HTTP 协议)、commons-codec(处理与编码有关的问题的项目)和 commons-logging(处理与日志记录有关问题的项目)。如果你希望能够通过 HttpClient 向服务器上传文件等与 multipart 编码类型有关的请求,以及其它复杂的MIME 类型,那么,你需要另外一个依赖包:HttpMime(它是专门处理与 MIME 类型有关问题的项目),在下载的 HttpClient 包中(下载地址为:http://hc.apache.org/downloads.cgi)已经包含了 HttpMime
项目中使用的 HttpClient 版本为:4.0.1GA,httpClient需要有以下依赖包:
httpclient-4.0.1.jar
httpcore-4.0.1.jar
httpmime-4.0.1.jar
又依赖于 mime4j(apache-mime4j-0.6.jar)
commons-codec-1.4.jar
commons-logging-1.1.1.jar
commons-io-1.4.jar – 为了更方便处理与 IO 有关的需求
1.1.1 HttpClient抓取网页流程
使用HttpClient发送请求、接收响应很简单,一般需要如下几步:
1. 创建HttpClient对象。
2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。
5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
6. 释放连接。无论执行方法是否成功,都必须释放连接。
1.1.2 简单抓取代码
//使用httpClient发送请求,使用Jsoup分析网页public static void main(String[] args) throws Exception {//创建httpClient客户端HttpClient hClient = new DefaultHttpClient();//创建http发送请求对象,HttpgetHttpGet hget = new HttpGet("http://www.itcast.cn");//设置请求头hget.setHeader("Cookie", "login_sid_t=f39c57f474a4fbffeeac8b0d727c7310; YF-Ugrow-G0=169004153682ef91866609488943c77f; YF-V5-G0=cd5d86283b86b0d506628aedd6f8896e; WBStorage=7754ff192036c629|undefined; _s_tentry=-; YF-Page-G0=074bd03ae4e08433ef66c71c2777fd84; Apache=1025338456965.9829.1478277156276; SINAGLOBAL=1025338456965.9829.1478277156276; ULV=1478277156293:1:1:1:1025338456965.9829.1478277156276:; SUB=_2AkMvQDcef8NhqwJRmP4Uzm7mbYxwzA_EieLBAH7sJRMxHRl-yj9jqmwNtRBn0SIxPIgzk6P4Umq_twX_A70bVg..; SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9W5J2ZDKK_Q-h8ni.aX3E1Ci");hget.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36");//设置连接超时,传递响应超时hClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000).setParameter(CoreConnectionPNames.SO_TIMEOUT, 10000).setParameter(ConnRouteParams.DEFAULT_PROXY, new HttpHost("121.31.71.63", 80));//发送请求HttpResponse response = hClient.execute(hget);//获取网页内容String content = EntityUtils.toString(response.getEntity(), "utf-8");System.out.println(content);}
1.2 Jsoup简介
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据
通常在写爬虫程序时,httpClient集合Jsoup共同使用即可实现完美的爬虫系统。
httpClient负责模拟浏览器发送请求,Jsoup负责解析httpClient请求返回的HTML页面,解析获取需要的数据
1.2.1 Jsoup获取网页流程
1. 从一个 URL,文件或字符串中解析 HTML;
2. 使用 DOM 或 CSS 选择器来查找、取出数据;
3. 可操作 HTML 元素、属性、文本;
1.2.2 Jsoup获取网页代码
//使用jsoup加载远程连接数据@Testpublic void myJsouptest() throws Exception{String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36";//准备cookie信息Map<String, String> maps = new HashMap<String, String>();maps.put("TC-Ugrow-G0", "968b70b7bcdc28ac97c8130dd353b55e");maps.put("SUB", "2AkMvfeeDf8NhqwJRmP0dzGvhZY5yywvEieLBAH7sJRMxHRl-yT9jqmAHtRAgR4BQZgBIE-Xz-jsqjVftcUdtrA..");maps.put("SUBP", "0033WrSXqPxfM72-Ws9jqgMF55529P9D9WhBu3bohh6dYkXbY_GUs5d8");//获取网页dom对象Document doc = Jsoup.connect("http://www.itcast.cn/").userAgent(userAgent).cookies(maps).get();//获取文档标签String title = doc.title();System.out.println(title);//获取网页元素Elements elements = doc.select("div.qrcode-text");System.out.println(elements.text());}
2. 综合应用
3. 爬虫在电商网站应用
转载于:https://my.oschina.net/bigdataer/blog/888493
网络爬虫(2)-- Java爬虫框架相关推荐
- python爬虫与java爬虫的区别_java爬虫(一)主流爬虫框架的基本介绍
(1).Scrapy: Scrapy,Python开发的一个快速.高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测 ...
- 什么是爬虫,常见的java爬虫框架有哪些?-蛙课网
随着互联网的发展,编程程序语言也开始被越来越多的人所掌握,与此同时,java语言是使用范围最广的编程语言.今天我们一起了解一下什么是爬虫,java爬虫框架有哪些. 网络爬虫(又称为网页蜘蛛,网络机器人 ...
- java可以进行爬虫吗,java可以写爬虫吗
java可以写爬虫吗?java可以写爬虫吗?希望提供一下编写思路 codeblocks能不能写我不知道,但不仅仅只有java可以写爬虫. 用java 编写爬虫是不是很简单 用java编写爬虫, 有丰富 ...
- java爬虫系列(五)——今日头条文章爬虫实战
文章目录 项目源码 爬虫目标 爬虫设计思路 爬取方式 动态解析网页方式爬取 解析接口方式爬取 解析思路 破解入口 接口对比 破解加密参数 参数生成方式 解析js 分析接口返回值 解析原文地址 java ...
- java爬虫系列(三)——漫画网站爬取实战
项目地址 数据库设计 ORM框架 代理浏览器 实战目标 代码解读 com.ouyang.crawlers.Manhua start() chapterBean() contentBean() 实测 启 ...
- java爬虫系列(二)——爬取动态网页
准备工作 项目地址 网页解析工具地址 启动网页解析器 根据系统选择所需文件 指定端口号启动工具 项目配置 seimi.properties SeimiAgentDemo.java 分析原网页代码 Bo ...
- java爬虫系列(四)——动态网页爬虫升级版
项目地址 项目介绍 框架 结构 快速启动 修改配置文件 WebDriverPool.java App.java ComicDriver.java ComicContentService.java co ...
- 爬虫与反爬虫技术分析
科普: 什么是爬虫: 百度百科:网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还 ...
- Java爬虫框架调研
Python中大的爬虫框架有scrapy(风格类似django),pyspider(国产python爬虫框架). 除了Python,Java中也有许多爬虫框架. nutch apache下的开源爬虫程 ...
- python网络爬虫、Java 网络爬虫,哪个更好?
说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少.有不少人都不知道 Java 可以做网络爬虫,其实 Java 也能做网络爬 ...
最新文章
- JSPServlet路径问题
- Java数据结构与算法(一) 数组
- c swap方法在哪个库里面_在编程竞赛中高效地编写C/C ++代码
- SQL Server 2008编写脚本时智能提示功能丢失的处理
- linux trap命令
- 2018年创业最火热点的是什么?看到这个你可能就知道哪方面发展最热了
- python将索引升序_程序在Python中按升序删除元素后获取列表的索引
- linux系统自签发免费ssl证书,为nginx生成自签名ssl证书
- 如何防止头文件被重复包含或引用?
- PXE 网络化安装linux系统
- javascript控制开始日期,和结束日期在同一个月
- 【动态规划】程序员面试金典——11.7叠罗汉I
- 中建信息的新分销主义
- php中怎么引用js变量_理解下 Go 中的引用是怎么回事
- python3 open打开文件_Python3基础 file open 打开txt文件并打印出全文
- mysql如何实现cas机制_CAS机制详解
- “大数据分析”和“数据分析”的区别与联系
- docker: 打包h5项目的镜像
- CPU的分身术:千手观音与齐天大圣
- 几行代码实现用Python输出表情包
热门文章
- java自定义类加载器
- vue 自定义封装组件 使用 model 选项
- SVG动画.animateTransform
- 使用日志记录功能查看PHP扩展的执行过程
- Storm具体的解释(二)、成为第一Storm申请书
- scrollBarStyle- listview滑动条调整
- MinGW 和 MSVC 下,使用 FILE 类型的一个奇怪的问题
- 批量(导入导出)迁移AD中的用户信息和密码到新环境中,同时保持用户在MOSS中的权限【addusers,ldifde,copypwd,UserInfo,tp_SystemID】...
- php饼图只有一个小方块_如何做出PHP数据饼图
- 神经网络调参---权重对分类性能的影响