一、网络爬虫简介
网络爬虫(Web crawler),又称网页蜘蛛,网络机器人,网页追逐者,也是一种网络术语。
是一种按照一定的规则,自动抓取网上数据的程序或脚本。
它们被广泛用于互联网搜索引擎或其他类似网站,可以自动采集所有其能够访问到的页面内容,以获取或更新这些网站的内容和检索方式。
从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分。
相对于通用网络爬虫,聚焦爬虫还需要解决三个主要问题:
(1) 对抓取目标的描述或定义;
(2)对网页或数据的分析与过滤;
(3)对URL的搜索策略
常用场景:新闻网站
官网:https://jsoup.org/
开发手册网址:http://www.open-open.com/jsoup/
二、网络爬虫作用
网络爬虫是捜索引擎抓取系统的重要组成部分。
爬虫的主要目的:将互联网上的网页下载到本地形成一个或联网内容的镜像备份。
通俗:通过编写脚本到网络各服务器上抓取所需要的的数据。
三、网络爬虫技术
大多数语言都可以实现网络爬虫技术,网络爬虫只是一种技术,并非一种语言。
常用的解析器有:
1. JSoup 大杀器
用于解析HTML,类似XML中的解析器。
Jsoup是一个Java的开源HTML解析器,可直接解析某个URL地址、HTML文本内容。
2. Scrapy
Scrap是碎片的意思,Scrapy是Python的爬虫框架。
Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。
四、思路
1. 指定想要爬取数据的URL。
2. 通过JSoup的jar包中的方法将Html解析成Document,
3. 使用Document中的一些列select、get、first、children、attr等方法获取自己想要的数据,如图片地址、名称、时间。
4. 将得到的数据封装成自己的实体类。
5. 将实体中的数据在页面加载出来。
五、案例
1. 百度案例
(1)创建项目
在Idea中创建Web项目,并创建测试包及测试类。
(2)导入JSoup依赖(JSoup Java HTML Parser)
<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.11.2</version> </dependency> |
(3)编写测试类
public class TestJSoup{ @Test public void test(){ try{ // 获取指定网址中的HTML代码 Document document = Jsoup.connect("https://www.baidu.com/").get();
// 获取网页标题 String title = document.title(); System.out.println(title);
// 获取网页中所有的图片 Elements imgs = document.select("img"); //<img src=””> for(Element img : imgs){ // 打印图片路径,attr(“src”)表示获取src属性的值 System.out.println(img.attr("src")); }
// 获取网页中所有的超链接 Elements as = document.select("a"); for(Element a : as){ // 打印<a>标签中的文本 System.out.println(a.text()); }
}catch(Exception e){ e.printStackTrace(); } } } |
2. IT时代周刊案例
源代码:
public class TestItTimes { @Test public void test(){ try { // 通过连接获得编译的HTML代码 Document document = Jsoup.connect("http://www.ittime.com.cn").get();
// body > div:nth-child(4) > div > div.wrap_left.pull-left.content_L > div > ul.thisclass // 获得下面的所有节点 Elements elements = document.select("body").select("div:nth-child(4)").select("div").select("div.wrap_left.pull-left.content_L").select("div").select("ul.thisclass").select(".newsList"); // 显示元素个数 System.out.println(elements.size()); for (int i = 0; i < elements.size(); i++) { // 获得某一个节点 Element dl = elements.get(i); // body > div:nth-child(4) > div > div.wrap_left.pull-left.content_L > div > ul.thisclass > dl:nth-child(1) > dd > h2 > a String title = dl.select("dd").select("h2").select("a").text(); String href = dl.select("dd").select("h2").select("a").attr("href"); String img = dl.select("dt").select("a").select("img").attr("src"); System.out.println("标题:"+title); System.out.println("图片:http://www.ittime.com.cn"+img); System.out.println("内容:http://www.ittime.com.cn"+href); } } catch (IOException e) { e.printStackTrace(); } } } |
3. 一些获取方式
// 根据ID获得节点 Element elementDiv = doc.getElementById("shop-all-list");
//根据<ul>标签名获得节点 Elements elementsUl = elementDiv.getElementsByTag("ul");
//获取elementsUl中第一个<li>的标签节点 Elements elements = elementsUl.first().getElementsByTag("li");
Elements elements1 = element.children();
String targetUrl = elements1.get(0).getElementsByTag("a").attr("href");
String img = elements1.get(0).getElementsByTag("img").first().attr("data-src");
//判断字符串中是否包含.jpg if(img.contains(".jpg"))
//获得字符串中.jpg第一次出现位置 int a = img.indexOf(".jpg");
//字符串截取 img = img.substring(0, a + 4); |