随着互联网+时代的来临,越来越多的互联网企业层出不穷,涉及游戏、视频、新闻、社交、电商、房产、旅游等众多行业。如今互联网成为大量信息的载体,如何有效地从中提取有价值的信息并利用这些信息成为一个巨大的挑战

爬虫,一个可怕的怪物,从百度、Google等搜索引擎公司诞生开始便有了它的身影,如今移动互联网时代爬虫更是猖狂,每个网站似乎都被它光顾过,只是你看不到,不过你放心它不干坏事,你能在网上迅速搜索到你到的信息应该都是它的功劳,它每天会默默无闻的采集互联网上的丰富信息供大家查询共享。Java作为互联网开发的主流语言,广泛应用于互联网领域,本课程使用java技术为大家讲解如何编写爬虫程序爬取网络上有价值的数据信息。

知识点

  • 爬虫的架构解析
  • 爬虫基本原理分析
  • 编写爬虫程序
  • 爬虫在电商中的应用

1. 爬虫简介

我们访问某一个网页的时候,在地址栏输入网址,按回车,该网站的服务器就会返回一个HTML文件给我们,浏览器解析返回的数据,展示在UI上。同样爬虫程序也是模仿人的操作,给网站发送一个请求,网站会给爬虫程序返回一个HTML文件,爬虫程序再根据返回的数据进行抓取分析

1.1 爬虫概论

网络爬虫(Web crawler)也叫网络蜘蛛(Web spide)自动检索工具(automatic indexer),是一种”自动化浏览网络“的程序,或者说是一种网络机器人。

爬虫被广泛用于互联网搜索引擎或其他类似网站,以获取或更新这些网站的内容和检索方式。它们可以自动采集所有其能够访问到的页面内容,以供搜索引擎做进一步处理(分检整理下载的页面),而使得用户能更快的检索到他们需要的信息。

通俗的讲,就是把你手动打开窗口,输入数据等等操作用程序代替。用程序替你获取你想要的信息,这就是网络爬虫

1.2 爬虫应用

1.2.1 搜索引擎

爬虫程序可以为搜索引擎系统爬取网络资源,用户可以通过搜索引擎搜索网络上一切所需要的资源。搜索引擎是一套非常庞大且精密的算法系统,搜索的准确性,高效性等都对搜索系统有很高的要求。

1.2.2 数据挖掘

爬虫除了用来做搜索外,还可以做非常多的工作,可以说爬虫现在在互联网项目中应用的非常广泛。
互联网项目通过爬取相关数据主要进行数据分析,获取价值数据。那么爬虫具体可以做那么分析,下面可以简单做一个简单了解:

  • 股票分析—预测股市
  • 社会学方面统计预测
    • 情绪地图
    • 饮食分布图
    • 票房分析预测
    • 机场实时流量
    • 公交系统实时线路
    • 火车票实时销售统计
  • App下载量分析

1.3 爬虫原理

1.3.1 爬虫目的

一般来讲对我们而言需要抓取的是某个网站或者某个应用的内容,提取有用的价值,进行数据分析。

1.3.2 爬虫框架设计

为了开发的方便,也可以使用爬虫框架来开发项目中的爬虫;一个通用的网络爬虫的框架如图所示:

网络爬虫的基本工作流程如下:

  1. 首先选取一部分精心挑选的种子URL
  2. 将这些URL放入待抓取URL队列
  3. 从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些URL放进已抓取URL队列
  4. 分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL放入待抓取URL队列,从而进入下一个循环

2. Java爬虫框架

2.1 Nutch

Nutch属于分布式爬虫,爬虫使用分布式,主要是解决两个问题:1)海量URL管理;2)网速。如果要做搜索引擎,Nutch1.x是一个非常好的选择。Nutch1.x和solr或者es配合,就可以构成一套非常强大的搜索引擎,否则尽量不要选择Nutch作为爬虫。用Nutch进行爬虫的二次开发,爬虫的编写和调试所需的时间,往往是单机爬虫所需的十倍时间不止。

2.2 Heritrix

Heritrix 是个“Archival Crawler”——来获取完整的、精确的、站点内容的深度复制。包括获取图像以及其他非文本内容。抓取并存储相关的内容。对内容来者不拒,不对页面进行内容上的修改。重新爬行对相同的URL不针对先前的进行替换。爬虫主要通过Web用户界面启动、监控和调整,允许弹性的定义要获取的url。

2.3 crawler4j

crawler4j是Java实现的开源网络爬虫。提供了简单易用的接口,可以在几分钟内创建一个多线程网络爬虫。

2.4 WebCollector

WebCollector使用了Nutch的爬取逻辑(分层广度遍历),Crawler4j的的用户接口(覆盖visit方法,定义用户操作),以及一套自己的插件机制,设计了一套爬虫内核。

2.5 WebMagic

WebMagic项目代码分为核心和扩展两部分。核心部分(webmagic-core)是一个精简的、模块化的爬虫实现,而扩展部分则包括一些便利的、实用性的功能。WebMagic的架构设计参照了Scrapy,目标是尽量的模块化,并体现爬虫的功能特点。

3. HttpClient&Jsoup

爬虫实现的技术有很多,对于java语言来说,有很多的选择,可以是很多开源的爬虫框架,也可以使用基本httpClient,Jsoup来爬取网页

3.1 HttpClient简介

HttpClient 是 apache 组织下面的一个用于处理 HTTP 请求和响应的开源工具。它不是一个浏览器,也不处理客户端缓存等浏览器的功能。它只是一个类库!它在 JDK 的基本类库基础上做了更好的封装。

HttpClient 项目依赖于 HttpCore(处理核心的 HTTP 协议)、commons-codec(处理与编码有关的问题的项目)和 commons-logging(处理与日志记录有关问题的项目)。如果你希望能够通过 HttpClient 向服务器上传文件等与 multipart 编码类型有关的请求,以及其它复杂的MIME 类型,那么,你需要另外一个依赖包:HttpMime(它是专门处理与 MIME 类型有关问题的项目),在下载的 HttpClient 包中(下载地址)已经包含了 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 有关的需求

3.2 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. 释放连接。无论执行方法是否成功,都必须释放连接。

3.3 简单抓取代码

用HttpClient发送请求,请求头不带cookie,用EntityUtils解析响应结果

public class MyHttpClient {/**** 需求:使用httpClient爬取传智播客官方网站数据* * @param args* @throws Exception* @throws ClientProtocolException*/public static void main(String[] args) throws Exception {// 创建HttpClient对象HttpClient hClient = new DefaultHttpClient();// 设置响应时间,设置传智源码时间,设置代理服务器(不使用本机的IP爬取,以防止被服务器识别从而IP加入黑名单)hClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000).setParameter(CoreConnectionPNames.SO_TIMEOUT, 10000).setParameter(ConnRouteParams.DEFAULT_PROXY, new HttpHost("111.155.124.67", 8123));// 爬虫URL大部分都是get请求,创建get请求对象HttpGet hget = new HttpGet("http://www.itcast.cn/");// 向传智播客官方网站发送请求,获取网页源码HttpResponse response = hClient.execute(hget);// EntityUtils工具类把网页实体转换成字符串String content = EntityUtils.toString(response.getEntity(), "utf-8");System.out.println(content);}}

解析结果

用HttpClient发送请求,请求头带cookie,用EntityUtils解析响应结果

//使用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);
}

4. Jsoup简介

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据

通常在写爬虫程序时,httpClient结合Jsoup共同使用即可实现完美的爬虫系统。httpClient负责模拟浏览器发送请求,Jsoup负责解析httpClient请求返回的HTML页面,解析获取需要的数据

4.1 Jsoup获取网页流程

  1. 从一个 URL,文件或字符串中解析 HTML
  2. 使用 DOM 或 CSS 选择器来查找、取出数据
  3. 可操作 HTML 元素、属性、文本

4.2 Jsoup获取网页代码

用Jsoup抓取传智播客官网左侧的数据,如图所示

用谷歌浏览器开发者工具(F12)打开查看源码如下图,从中可以看到ul标签的class选择器为nav_txt

public class HttpClientJsoup {/**** 需求:使用httpClient爬取传智播客官方网站数据* * @param args* @throws Exception* @throws ClientProtocolException*/public static void main(String[] args) throws Exception {// 创建HttpClient对象HttpClient hClient = new DefaultHttpClient();// 设置响应时间,设置传智源码时间,设置代理服务器/*hClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000).setParameter(CoreConnectionPNames.SO_TIMEOUT, 10000).setParameter(ConnRouteParams.DEFAULT_PROXY, new HttpHost("111.155.124.67", 8123));*/// 爬虫URL大部分都是get请求,创建get请求对象HttpGet hget = new HttpGet("http://www.itcast.cn/");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");// 向传智播客官方网站发送请求,获取网页源码HttpResponse response = hClient.execute(hget);// EntityUtils工具类把网页实体转换成字符串String content = EntityUtils.toString(response.getEntity(), "utf-8");// 使用Jsoup解析网页内容Document document = Jsoup.parse(content);// 获取文档标题String title = document.title();System.out.println(title);Elements elements = document.select("ul.nav_txt a");System.out.println(elements);for(Element element : elements){System.out.println(element.text() + ":" + element.attr("href"));}}}

解析结果

使用jsoup向服务器发送请求

public class MyJsoup {/** 需求:使用Jsoup解析网页源码*/public static void main(String[] args) throws Exception {// 使用jsoup向服务器发送请求Document doc = Jsoup.connect("http://www.itcast.cn").get();// Jsoup使用类型css,Jquery选择器方式获取元素节点// Elements elements = doc.getElementsByTag("a");// System.out.println(elements.text());Elements elements = doc.select("ul.nav_txt a");// 循环元素for (Element element : elements) {System.out.println(element.text() + ":" + element.attr("href"));}}}

解析结果

5. 综合应用

解析下图中红色框的内容,HttpClient发送请求,Jsoup解析结果

点击开发者工具的第一个图标,移动鼠标到网页的目标位置,即可定位到该目标的网页源码位置

package com.github.webcrawder;import java.io.IOException;import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
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.select.Elements;public class CrawderDemo {public static void main(String[] args) throws ClientProtocolException, IOException {// 创建httpClient客户端HttpClient hClient = new DefaultHttpClient();// 创建http发送请求对象,HttpgetHttpGet hget = new HttpGet("http://www.itcast.cn");// 发送请求HttpResponse response = hClient.execute(hget);// 获取网页内容String content = EntityUtils.toString(response.getEntity(), "utf-8");// 使用Jsoup解析网页内容Document document = Jsoup.parse(content);// 使用元素选择器选择网页的内容Elements elements = document.select("ul.nav_li a");System.out.println(elements.text());System.out.println(elements);}}

解析结果

//使用jsoup加载远程连接数据
@Test
public 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());
}

6.爬虫在电商网站应用

代码下载 http://download.csdn.net/detail/axi295309066/9782505

揭秘Java网络爬虫程序原理相关推荐

  1. Java网络爬虫实战案例一

    紧接我们上次的问题,如何获取服务器发送的资源,保存到本地?上一篇文章见java网络爬虫核心原理. 一.Java IO流三分游(input,output)   我们知道计算机是用来处理数据的.所有的程序 ...

  2. Java网络爬虫入门:第01课:网络爬虫原理

    引言 随着互联网的迅速发展,网络资源越来越丰富,信息需求者如何从网络中抽取信息变得至关重要.目前,有效的获取网络数据资源的重要方式,便是网络爬虫技术.简单的理解,比如您对百度贴吧的一个帖子内容特别感兴 ...

  3. java爬虫编写步骤_JAVA爬虫--编写第一个网络爬虫程序

    JAVA爬虫–编写第一个网络爬虫程序 前言上一章节介绍了XPATH基础语法,本章节将手把手带大家编写第一个爬虫程序,同时也希望能通过这个爬虫程序,帮助大家熟悉上一章节学习的XPATH基础语法并运用到实 ...

  4. 第三十六期:学 Java 网络爬虫,需要哪些基础知识?

    说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少.有不少人都不知道 Java 可以做网络爬虫,其实 Java 也能做网络爬 ...

  5. Java网络爬虫该如何学习

    文章目录 引言 怎么入门网络爬虫 课程特色 学完本课程能收获什么 引言 互联网以及移动技术的飞速发展,使得全球数据量呈现前所未有的爆炸式增长态势.例如,用户在互联网上的搜索数据.交易数据.评论数据.社 ...

  6. python网络爬虫、Java 网络爬虫,哪个更好?

    说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少.有不少人都不知道 Java 可以做网络爬虫,其实 Java 也能做网络爬 ...

  7. 学 Java 网络爬虫,需要哪些基础知识?

    说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少.有不少人都不知道 Java 可以做网络爬虫,其实 Java 也能做网络爬 ...

  8. 干货:一文看懂网络爬虫实现原理与技术(值得收藏)

    01  网络爬虫实现原理详解 不同类型的网络爬虫,其实现原理也是不同的,但这些实现原理中,会存在很多共性.在此,我们将以两种典型的网络爬虫为例(即通用网络爬虫和聚焦网络爬虫),分别为大家讲解网络爬虫的 ...

  9. Java网络爬虫实操(5)

    上一篇:Java网络爬虫实操(4) 大家好,前几篇文章介绍的URL都是返回HTML内容的,然后再从HTML字符串里解析出我们想要的数据. 但是,随着前端编程技术的发展,至少十多年前开始ajax.jso ...

最新文章

  1. CYQ.Data 轻量数据访问层(一) 概述
  2. MS SQL数据库服务介绍
  3. LeetCode Non-overlapping Intervals(dp,greedy)
  4. JAVA集合框架包含的内容
  5. c语言输出精确圆周率,如何设计C语言程序输出圆周率小数点后的1000位?请大侠出手啊。...
  6. ES6(三)数组的扩展
  7. ORDER BY NEWID()【原创】
  8. 正则表达式基础知识,持续更新…
  9. 杭州python爬虫招聘_python爬取招聘网站(智联,拉钩,Boss直聘)
  10. python技术简介_Python多线程技术简介,简单,阐述,python
  11. mysql begin rollback_事务控制语句,begin,rollback,savepoint,隐式提交的SQL语句
  12. ab服务器网页,使用ab进行web服务器压测详解
  13. 而立之年,第一篇博客,
  14. 开封文化艺术职业学院学报杂志社开封文化艺术职业学院学报编辑部2022年第4期目录
  15. Python创建网站
  16. [Other]B树 B+树 B*树 - 三大名树的基础简介
  17. python制作网页样式与布局_清华大学出版社-图书详情-《CSS3+DIV网页样式与布局案例课堂(第2版)》...
  18. httprunner-2-linux下搭建hrun(下)
  19. 用手机版python爬虫_Python爬虫也能用手机进行抓包?没错!这个技巧我只告诉你...
  20. 01--背包问题以及构造最优解

热门文章

  1. 找出MySQL瓶颈的基准测试和剖析
  2. Nginx+Supervisor安装部署.NET Core项目
  3. 因主机名更改造成oracle控制台登录错误:ora-12545,ora-12541
  4. Windows Azure Web Site (9) Web Site公网IP地址
  5. java 企业门户网站 源码 自适应响应式 freemarker 静态引擎 html5 SSM
  6. javascript最快入门
  7. [SPDK/NVMe存储技术分析]012 - 用户态ibv_post_send()源码分析
  8. androidEditTextinputType及android:imeOptions=”actionDone”(转)
  9. floa和position
  10. 北漂周记--第8记--项目测试