当前位置:网站首页 > Java基础 > 正文

java 网络爬虫基础



网络爬虫概述

  • 在大数据时代,信息的采集是一项重要的工作,而互联网中的数据是海量的,如果单纯靠人力进行信息采集,不仅低效繁琐,搜集的成本也会提高。如何自动高效地获取互联网中我们感兴趣的信息并为我们所用是一个重要的问题,而爬虫技术就是为了解决这些问题而生的。
  • 网络爬虫(Web crawler)也叫做网络机器人,可以代替人们自动地在互联网中进行数据信息的采集与整理。它是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,可以自动采集所有其能够访问到的页面内容,以获取相关数据。
  • 从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分。爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。

1 入门案例

1.1 环境配置

pom配置

 

log4j.properties配置

 
1.2 代码编写
 

结果为该网页的网页源代码

2 HttpClient

概述:网络爬虫就是用程序帮助我们访问网络上的资源,我们一直以来都是使用HTTP协议访问互联网的网页,网络爬虫需要编写程序,在这里使用同样的HTTP协议访问网页。这里我们使用Java的HTTP协议客户端 HttpClient这个技术,来实现抓取网页数据。

2.1 Get请求
 
2.2 带参数的Get请求

爬取的网址:http://yun.itheima.com/search?keys=Java

 
2.3 Post请求
 
2.4 带参数的Post请求
 
2.5 Get和Post的区别
  • GET在浏览器回退时是无害的,而POST会再次提交请求。
  • GET产生的URL地址可以被Bookmark,而POST不可以。
  • GET请求会被浏览器主动cache,而POST不会,除非手动设置。
  • GET请求只能进行url编码,而POST支持多种编码方式。
  • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
  • GET请求在URL中传送的参数是有长度限制的,而POST没有。
  • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
  • GET参数通过URL传递,POST放在Request body中java 网络爬虫基础。
2.6 连接池

概述:如果每次请求都要创建HttpClient,会有频繁创建和销毁的问题,可以使用连接池来解决这个问题。

 
2.7 请求时间参数

概述:有时候因为网络,或者目标服务器的原因,请求需要更长的时间才能完成,我们需要自定义相关时间。

 

3 Jsoup

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

主要功能

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

注意:虽然使用Jsoup可以替代HttpClient直接发起请求解析数据,但是往往不会这样用,因为实际的开发过程中,需要使用到多线程,连接池,代理等等方式,而jsoup对这些的支持并不是很好,所以我们一般把jsoup仅仅作为Html解析工具使用

3.2 解析字符串
 
3.3 解析文件
 
3.4 使用dom方式遍历文档

元素获取方式

  • 根据id查询元素getElementById
  • 根据标签获取元素getElementsByTag
  • 根据class获取元素getElementsByClass
  • 根据属性获取元素getElementsByAttribute
 

元素中获取数据

  • 从元素中获取id
  • 从元素中获取className
  • 从元素中获取属性的值attr
  • 从元素中获取所有属性attributes
  • 从元素中获取文本内容text
 
3.5 selector选择器查找元素

tagname: 通过标签查找元素,比如:span

#id: 通过ID查找元素,比如:# city_bj

.class: 通过class名称查找元素,比如:.class_a

[attribute]: 利用属性查找元素,比如:[abc]

[attr=value]: 利用属性值来查找元素,比如:[class=s_name]

 
3.6 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 > *: 查找某个父元素下所有直接子元素

版权声明


相关文章:

  • java基础英语发音2025-04-28 18:34:02
  • java基础演讲素材2025-04-28 18:34:02
  • java基础模拟试题2025-04-28 18:34:02
  • java 基础入门2025-04-28 18:34:02
  • java基础1862025-04-28 18:34:02
  • java基础数据面试2025-04-28 18:34:02
  • java的基础能力2025-04-28 18:34:02
  • 大学java基础目录2025-04-28 18:34:02
  • java基础阿里2025-04-28 18:34:02
  • java 基础核心2025-04-28 18:34:02