网络爬虫

一、网络爬虫简介

网络爬虫(Web crawler),又称网页蜘蛛,网络机器人,网页追逐者,也是一种网络术语。

是一种按照一定的规则,自动抓取网上数据的程序或脚本。

它们被广泛用于互联网搜索引擎或其他类似网站,可以自动采集所有其能够访问到的页面内容,以获取或更新这些网站的内容和检索方式。

 

从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分。

 

相对于通用网络爬虫,聚焦爬虫还需要解决三个主要问题:

1 对抓取目标的描述或定义;

2对网页或数据的分析与过滤;

3URL的搜索策略

 

常用场景:新闻网站

网:https://jsoup.org/

开发手册网址:http://www.open-open.com/jsoup/




二、网络爬虫作

网络爬虫是捜索引擎抓取系统的重要组成部分。

爬虫的主要目的将互联网上的网页下载到本地形成一个或联网内容的镜像备份。

通俗:通过编写脚本到网络各服务器上抓取所需要的的数据。



三、网络爬虫技术

大多数语言都可以实现网络爬虫技术,网络爬虫只是一种技术,并非一种语言

常用的解析器有:

1. JSoup 大杀器

用于解析HTML,类似XML中的解析器

Jsoup是一个Java的开源HTML解析器,可直接解析某个URL地址、HTML文本内容。

 

2. Scrapy 

Scrap是碎片的意思,ScrapyPython的爬虫框架。

Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。

Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpidersitemap爬虫等,最新版本又提供了web2.0爬虫的支持。



四、思路

1. 指定想要爬取数据的URL

2. 通过JSoupjar包中的方法将Html解析成Document

3. 使用Document中的一些列selectgetfirstchildrenattr等方法获取自己想要的数据,如图片地址、名称、时间。

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值