1. 网络爬虫
1.1 网络爬虫介绍
在大数据时代,信息的采集是一项重要的工作,而互联网中的数据是海量的,如果单纯靠人力进行信息采集,不仅低效繁琐,搜集的成本也会提高。如何自动高效地获取互联网中我们感兴趣的信息并为我们所用是一个重要的问题,而爬虫技术就是为了解决这些问题而生的。
网络爬虫(Web crawler)也叫做网络机器人,可以代替人们自动地在互联网中进行数据信息的采集与整理。它是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,可以自动采集所有其能够访问到的页面内容,以获取相关数据。
从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分。爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。
1.2 为什么学网络爬虫
我们初步认识了网络爬虫,但是为什么要学习网络爬虫呢?只有清晰地知道我们的学习目的,才能够更好地学习这一项知识。在此,总结了4种常见的学习爬虫的原因:
可以实现搜索引擎
我们学会了爬虫编写之后,就可以利用爬虫自动地采集互联网中的信息,采集回来后进行相应的存储或处理,在需要检索某些信息的时候,只需在采集回来的信息中进行检索,即实现了私人的搜索引擎。
大数据时代,可以让我们获取更多的数据源。
在进行大数据分析或者进行数据挖掘的时候,需要有数据源进行分析。我们可以从某些提供数据统计的网站获得,也可以从某些文献或内部资料中获得,但是这些获得数据的方式,有时很难满足我们对数据的需求,而手动从互联网中去寻找这些数据,则耗费的精力过大。此时就可以利用爬虫技术,自动地从互联网中获取我们感兴趣的数据内容,并将这些数据内容爬取回来,作为我们的数据源,再进行更深层次的数据分析,并获得更多有价值的信息。
可以更好地进行搜索引擎优化(SEO)。
对于很多SEO从业者来说,为了更好的完成工作,那么就必须要对搜索引擎的工作原理非常清楚,同时也需要掌握搜索引擎爬虫的工作原理。而学习爬虫,可以更深层次地理解搜索引擎爬虫的工作原理,这样在进行搜索引擎优化时,才能知己知彼,百战不殆。
有利于就业。
从就业来说,爬虫工程师方向是不错的选择之一,因为目前爬虫工程师的需求越来越大,而能够胜任这方面岗位的人员较少,所以属于一个比较紧缺的职业方向,并且随着大数据时代和人工智能的来临,爬虫技术的应用将越来越广泛,在未来会拥有很好的发展空间。
2.1 爬虫入门程序
2.1.1 环境准备
- JDK1.8
- IntelliJ IDEA
- IDEA自带的Maven
2.1.2 创建工程添加依赖
1 | <dependencies> |
2.1.3 加入log4j.properties
1 | DEBUG,A1 = |
2.1.4 编写代码
1 | /** |
2. HttpClient
网络爬虫就是用程序帮助我们访问网络上的资源,我们一直以来都是使用HTTP协议访问互联网的网页,网络爬虫需要编写程序,在这里使用同样的HTTP协议访问网页。
这里我们使用Java的HTTP协议客户端 HttpClient这个技术,来实现抓取网页数据。
2.1 GET请求
1 | /** |
请求结果:
2.2 带参数的GET请求
1 | /** |
请求结果:
2.3 POST请求
1 | /** |
请求结果:
2.4 带参数的POST请求
1 | /** |
请求结果:
2.5 连接池
如果每次请求都要创建HttpClient,会有频繁创建和销毁的问题,可以使用连接池来解决这个问题。
1 | /** |
2.6 请求参数
有时候因为网络,或者目标服务器的原因,请求需要更长的时间才能完成,我们需要自定义相关时间
1 | /** |
3. Jsoup
我们抓取到页面之后,还需要对页面进行解析。可以使用字符串处理工具解析页面,也可以使用正则表达式,但是这些方法都会带来很大的开发成本,所以我们需要使用一款专门解析html页面的技术。
3.1 Jsoup介绍
Jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
Jsoup的主要功能如下:
- 从一个URL,文件或字符串中解析HTML;
- 使用DOM或CSS选择器来查找、取出数据;
- 可操作HTML元素、属性、文本;
3.2 Jsoup解析
Jsoup依赖:
1 | <dependencies> |
3.2.1 解析url
Jsoup可以直接输入url,它会发起请求并获取数据,封装为Document对象
1 | /** |
PS:虽然使用Jsoup可以替代HttpClient直接发起请求解析数据,但是往往不会这样用,因为实际的开发过程中,需要使用到多线程,连接池,代理等等方式,而jsoup对这些的支持并不是很好,所以我们一般把jsoup仅仅作为Html解析工具使用
3.2.2 解析字符串
先准备以下html文件
1 | <html> |
Jsoup可以直接输入字符串,并封装为Document对象
1 | /** |
3.2.3 解析文件
Jsoup可以直接解析文件,并封装为Document对象
1 | /** |
3.2.4 使用dom方式遍历文档
3.2.4.1 元素获取
- 根据id查询元素getElementById
- 根据标签获取元素getElementsByTag
- 根据class获取元素getElementsByClass
- 根据属性获取元素getElementsByAttribute
1 | /** |
3.2.4.2 元素中获取数据
- 从元素中获取id
- 从元素中获取className
- 从元素中获取属性的值attr
- 从元素中获取所有属性attributes
- 从元素中获取文本内容text
1 | /** |
3.2.5 使用选择器语法查找元素
Jsoup elements对象支持类似于CSS (或jquery)的选择器语法,来实现非常强大和灵活的查找功能。这个select 方法在Document, Element,或Elements对象中都可以使用。且是上下文相关的,因此可实现指定元素的过滤,或者链式选择访问。
Select方法将返回一个Elements集合,并提供一组方法来抽取和处理结果。
3.2.5.1 Selector选择器概述
- tagname: 通过标签查找元素,比如:span
- #id: 通过ID查找元素,比如:# city_bj
- .class: 通过class名称查找元素,比如:.class_a
- [attribute]: 利用属性查找元素,比如:[abc]
- [attr=value]: 利用属性值来查找元素,比如:[class=s_name]
1 | /** |
3.2.5.2 Selector选择器组合使用
- el#id: 元素+ID,比如: h3#city_bj
- el.class: 元素+class,比如: li.class_a
- el[attr]: 元素+属性名,比如: span[abc]
- 任意组合: 比如:span[abc].s_name
- ancestor child: 查找某个元素下子元素,比如:.city_con li 查找”city_con”下的所有li
- parent > child: 查找某个父元素下的直接子元素,比如:.city_con > ul > li 查找city_con第一级(直接子元素)的ul,再找所有ul下的第一级li
- parent > *: 查找某个父元素下所有直接子元素
1 | /** |
4. 爬虫案例
学习了HttpClient和Jsoup,就掌握了如何抓取数据和如何解析数据,接下来,我们做一个小练习,把京东的手机数据抓取下来。
主要目的是HttpClient和Jsoup的学习。
4.1 需求分析
首先访问京东,搜索手机,分析页面,我们抓取以下商品数据:商品图片、价格、标题、商品详情页
4.1.1 SPU和SKU
除了以上四个属性以外,我们发现上图中的苹果手机有四种产品,我们应该每一种都要抓取。那么这里就必须要了解spu和sku的概念
SPU = Standard Product Unit (标准产品单位)
SPU是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的特性。通俗点讲,属性值、特性相同的商品就可以称为一个SPU。
例如上图中的苹果手机就是SPU,包括红色、深灰色、金色、银色
SKU=stock keping unit(库存量单位)
SKU即库存进出计量的单位, 可以是以件、盒、托盘等为单位。SKU是物理上不可分割的最小存货单元。在使用时要根据不同业态,不同管理模式来处理。在服装、鞋类商品中使用最多最普遍。
例如上图中的苹果手机有几个款式,红色苹果手机,就是一个sku
查看页面的源码也可以看出区别
4.2 开发准备
4.2.1 数据库表
1 | CREATE TABLE `jd_item` ( |
4.2.2 添加依赖
使用Spring Boot+Spring Data JPA和定时任务进行开发,需要创建Maven工程并添加以下依赖
1 |
|
4.2.3 添加配置文件
加入application.properties配置文件
1 | #DB Configuration: |
4.3 代码实现
4.3.1 编写pojo
1 | /** |
4.3.2 编写dao
1 | /** |
4.3.3 编写Service
ItemService接口
1 | /** |
ItemServiceImpl实现类
1 | /** |
4.3.4 编写引导类
1 | /** |
4.3.5 封装HttpClient
1 | /** |
4.3.6 实现数据抓取
使用定时任务,可以定时抓取最新的数据
1 | /** |
-------------本文结束感谢您的阅读-------------
本文标题: 网络爬虫(一)
本文链接: https://wgy1993.gitee.io/archives/ceeb4255.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!
![知识共享许可协议](https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png)