什么是网络爬虫

从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分。爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。

网络爬虫常用的技术

底层实现 HttpClient + Jsoup

 HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。更多信息请关注http://hc.apache.org/。
 Jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
 HttpClient 是用来下载网页源代码的,Jsoup 用来从网页源代码中解析需要的内容。

Webmagic框架

webmagic是一个开源的Java爬虫框架,目标是简化爬虫的开发流程,让开发者专注于逻辑功能的开发。webmagic 的核心非常简单,但是覆盖爬虫的整个流程,也是很好的学习爬虫开发的材料。

爬虫框架 Webmagic 介绍

架构的四大组件

WebMagic的结构分为Downloader、PageProcessor、Scheduler、Pipeline四大组件,并由Spider将它们彼此组织起来。这四大组件对应爬虫生命周期中的下载、处理、管理和持久化等功能。而Spider则将这几个组件组织起来,让它们可以互相交互,流程化的执行,可以认为Spider是一个大的容器,它也是WebMagic逻辑的核心。

简单解释一下:Downloader 负责将网页的源代码爬取下来,PageProcesser 指定爬取的规则(即指定爬取什么内容),然后交由 Pipeline 进行将爬取的内容存储,同时将 网址 交给 Scheduler 管理,防止 Downloader 再次爬取到这个页面,防止爬取重复内容。

  • Downloader
    Downloader负责从互联网上下载页面,以便后续处理。WebMagic默认使用了 ApacheHttpClient 作为下载工具。

  • PageProcessor
    PageProcessor负责解析页面,抽取有用信息,以及发现新的链接。WebMagic使用 Jsoup 作为HTML解析工具,并基于其开发了解析XPath的工具Xsoup。在这四个组件中,PageProcessor对于每个站点每个页面都不一样,是需要使用者定制的部分。

  • Scheduler
    Scheduler负责管理待抓取的URL,以及一些去重的工作。WebMagic 默认提供了 JDK 的内存队列来管理 URL,并用集合来进行去重。也支持使用 Redis 进行分布式管理。

  • Pipeline
    Pipeline 负责抽取结果的处理,包括计算、持久化到文件、数据库等。WebMagic 默认提供了“输出到控制台”和“保存到文件”两种结果处理方案,也可以自定义 Pipeline。

PageProcessor

爬取页面全部内容

需求:编写爬虫程序,爬取csdn中博客的内容 https://blog.csdn.net/
1)引入依赖

<dependency><groupId>us.codecraft</groupId><artifactId>webmagic-core</artifactId><version>0.7.3</version>
</dependency>
<dependency><groupId>us.codecraft</groupId><artifactId>webmagic-extension</artifactId><version>0.7.3</version>
</dependency>

2)编写类实现网页内容的爬取

public class MyProcessor implements PageProcessor {public void process(Page page) {// 将爬取的网页源代码输出到控制台System.out.println(page.getHtml().toString());}public Site getSite() {return Site.me().setSleepTime(100).setRetryTimes(3);}public static void main(String[] args) {Spider.create(new MyProcessor()).addUrl("https://blog.csdn.net/").run();}
}

Spider是爬虫启动的入口。在启动爬虫之前,我们需要使用一个 PageProcessor 创建一个 Spider 对象,然后使用 run() 进行启动。
Spider 的一些方法:


同时 Spider 的其他组件(Downloader、Scheduler、Pipeline)都可以通过set方法来进行设置。
​Page代表了从Downloader下载到的一个页面——可能是HTML,也可能是JSON或者其他文本格式的内容。Page 是 WebMagic 抽取过程的核心对象,它提供一些方法可供抽取、结果保存等。
​Site 用于定义站点本身的一些配置信息,例如编码、HTTP头、超时时间、重试策略等、代理等,都可以通过设置Site对象来进行配置。
Site 的一些方法:

爬取指定内容(Xpath)

如果我们想爬取网页中部分的内容,需要指定 xpath。 XPath,即为XML路径语言(XMLPathLanguage),它是一种用来确定XML文档中某部分位置的语言。XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
我们通过指定xpath来抓取网页的部分内容:

System.out.println(page.getHtml().xpath("//*[@id=\"mainBox\"]/main/div[1]/div/div/div[1]/h1").toString());

获取 xpath 的简单方法:打开网页,按 F12

添加目标地址

我们可以通过添加目标地址,从种子页面爬取到更多的页面:

目标地址正则匹配

有时候我们需要将当前页面里 只有符合要求的链接 才添加到目标页中,这时候我们就可以利用正则表达式对 链接 进行筛选:

// 添加目标地址,从一个页面爬到另一个页面
page.addTargetRequests(page.getHtml().links().regex("https://blog.csdn.net/[a-z 0-9 _]+/article/details/[0-9]{8}").all());
System.out.println(page.getHtml().xpath("//*[@id=\"mainBox\"]/main/div[1]/div/div/div[1]/h1").toString());

PipeLine

ConsolePipeline 控制台输出


将处理结果输出到控制台

FilePipeline 文件保存

以 json 方式保存

自定义 Pipeline

一般我们需要将爬取的数据放到数据库中,这时候我们就可以自定义 Pipeline
创建一个类,实现 Pipeline 接口:

修改 main 方法:

Scheduler

我们刚才完成的功能,每次运行可能会爬取重复的页面,这样做是没有任何意义的。Scheduler(URL管理) 最基本的功能是实现对已经爬取的 URL 进行标示。可以实现 URL 的增量去重。
目前scheduler主要有三种实现方式:

  • 内存队列 QueueScheduler:地址存于内存中,适合于单次爬取
  • 文件队列 FileCacheQueueScheduler:地址存于本机文件中,适合于单机爬取
  • Redis队列 RedisScheduler:地址存于 redis 中,适合于分布式爬取

内存队列

使用 setScheduler来设置 Scheduler:

文件队列

使用文件保存抓取 URL,可以在关闭程序并下次启动时,从之前抓取到的 URL 继续抓取
不过使用这种方式首先要保证 文件目录 存在,所以先创建 文件的保存目录:

运行后文件夹 E:\scheduler 会产生两个文件 blog.csdn.net.urls.txt 和 blog.csdn.net.cursor.txt

Redis 队列

使用Redis保存抓取队列,可进行多台机器同时合作抓取
首先运行 redis 服务端

实例(爬取 csdn 博客的用户昵称 和 头像)

1)引入依赖

<dependency><groupId>us.codecraft</groupId><artifactId>webmagic-core</artifactId><version>0.7.3</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>us.codecraft</groupId><artifactId>webmagic-extension</artifactId><version>0.7.3</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency><groupId>com.tensquare</groupId><artifactId>tensquare_common</artifactId><version>1.0-SNAPSHOT</version>
</dependency>

2)创建配置文件

server:port: 9014
spring:application:name: tensquare-article-crawler #指定服务名datasource:driverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.227.129:3306/tensquare_article?characterEncoding=UTF8username: rootpassword: 123456jpa:database: MySQLshow-sql: trueredis:host: 192.168.227.129

3)创建启动类

@SpringBootApplication
public class ArticleCrawlerApplication {public static void main(String[] args) {SpringApplication.run(ArticleCrawlerApplication.class);}@Value("${spring.redis.host}")private String redis_host;@Beanpublic IdWorker idWorker(){return new IdWorker(1,1);}@Beanpublic RedisScheduler redisScheduler(){return new RedisScheduler(redis_host);}
}

4)创建爬取类
打开网页,按 F12,找到头像和昵称

如上图:头像是标签里的一个属性,如何获取呢?

@Component
public class UserProcessor implements PageProcessor {@Overridepublic void process(Page page) {// 添加目标地址,从一个页面爬到另一个页面page.addTargetRequests(page.getHtml().links().regex("https://blog.csdn.net/[a-z 0-9 _]+/article/details/[0-9]{8}").all());// 添加字段,代码结构化,可多次使用String nickName = page.getHtml().xpath("//*[@id=\"uid\"]/text()").get();String image = page.getHtml().xpath("//*[@id=\"asideProfile\"]/div[1]/div[1]/a/img[1]/@src").get();if (nickName != null && image != null){page.putField("nickName",nickName);page.putField("image",image);} else {// 不执行后面的步骤page.setSkip(true);}}@Overridepublic Site getSite() {return Site.me().setSleepTime(100).setRetryTimes(3);}
}

只需要在相应的 xpath 路径后加 /@属性名称
我们得到头像的存储地址后,还需要下载到本地,然后上传到自己的图片服务器,所以还需要一个下载工具类

package util;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
/*** 下载工具类*/
public class DownloadUtil {public static void download(String urlStr,String filename,String savePath) throws IOException {URL url = new URL(urlStr);//打开url连接URLConnection connection = url.openConnection();//请求超时时间connection.setConnectTimeout(5000);//输入流InputStream in = connection.getInputStream();//缓冲数据byte [] bytes = new byte[1024];//数据长度int len;//文件File file = new File(savePath);if(!file.exists())file.mkdirs();OutputStream out  = new FileOutputStream(file.getPath()+"\\"+filename);//先读到bytes中while ((len=in.read(bytes))!=-1){//再从bytes中写入文件out.write(bytes,0,len);}//关闭IOout.close();in.close();}
}

5)创建入库类

@Component
public class UserPipeline implements Pipeline {@Autowiredprivate IdWorker idWorker;@Autowiredprivate UserDao userDao;@Overridepublic void process(ResultItems resultItems, Task task) {String nickName = resultItems.get("nickName");String image = resultItems.get("image");String imageName = image.substring(image.lastIndexOf("/") + 1) + ".jpg";User user = new User();user.setId(idWorker.nextId()+"");user.setAvatar(imageName);user.setNickname(nickName);// 将用户存入数据库userDao.save(user);// 将图片下载下载try {DownloadUtil.download(image,imageName,"E:/tensquare/userimage");} catch (IOException e) {e.printStackTrace();}}
}

6)创建任务类

@Component
public class UserTask {@Autowiredprivate UserProcessor userProcessor;@Autowiredprivate UserPipeline userPipeline;@Autowiredprivate RedisScheduler redisScheduler;@Scheduled(cron = "0 57 22 * * ?")public void UserTask(){Spider spider = Spider.create(userProcessor);spider.addUrl("https://blog.csdn.net/");spider.addPipeline(userPipeline);spider.setScheduler(redisScheduler);spider.start();}
}

7)启动类添加注解

8)运行该模块,到指定的时间就会自动爬取数据了

java爬虫框架—WebMagic相关推荐

  1. JAVA 爬虫框架webmagic 初步使用Demo

    一想到做爬虫大家第一个想到的语言一定是python,毕竟python比方便,而且最近也非常的火爆,但是python有一个全局锁的概念新能有瓶颈,所以用java还是比较牛逼的, webmagic 官网 ...

  2. Java爬虫框架WebMagic简介及使用

    一.介绍 ​ webmagic的是一个无须配置.便于二次开发的爬虫框架,它提供简单灵活的API,只需少量代码即可实现一个爬虫.webmagic采用完全模块化的设计,功能覆盖整个爬虫的生命周期(链接提取 ...

  3. Java爬虫框架WebMagic

    WebMagic的架构设计参照了Scrapy,而实现则应用了HttpClient.Jsoup等Java成熟的工具. WebMagic由四个组件(Downloader.PageProcessor.Sch ...

  4. java爬虫框架(java爬虫框架webmagic)

    Java页面框架有哪些呢? 主要应用技术:EJB等出处:java.sun.com/blueprints/code/index.简述:这是SUN在展示J2EE平台时所用的例子PetStore(宠物商店系 ...

  5. JAVA爬虫框架WebMagic爬取ajax请求的页面数据

    查看WebMagic文档:http://webmagic.io/docs/zh/posts/ch1-overview/ 爬取网址需要翻墙: https://www.reddit.com/r/funny ...

  6. java爬虫框架之webMagic

    webMagic框架 前言 介绍 案例 控制类: 解析类: 持久化类: 用到的工具类以及配置类: 注意事项 后语 前言 文章仅供安全领域的朋友学习使用!! 严禁做违法违纪的事情,责任自负 介绍 Web ...

  7. Java爬虫框架wemgic_Java爬虫框架-WebMagic挖坑补坑指南

    以前总是用的Python下的Scrapy和crawley和PHP的小众爬虫框架,最近突然想到了何不用下Java下的框架试试? 查了下Java下的爬虫框架自然也不在少数,Nutch,WebMagic,W ...

  8. Java爬虫框架之WebMagic的学习总结

    Java爬虫框架之WebMagic WebMagic 概述 特性 架构 四大组件 数据流转对象 控制爬虫运转的引擎Spider WebMagic的基本使用 添加WebMagic的核心与扩展依赖 爬虫实 ...

  9. 爬虫框架webmagic与spring boot的结合使用--转

    原文地址:http://www.jianshu.com/p/c3fc3129407d 1. 爬虫框架webmagic WebMagic是一个简单灵活的爬虫框架.基于WebMagic,你可以快速开发出一 ...

最新文章

  1. 中科院遗传发育所发表“重组菌群体系在根系微生物组研究中应用”的重要综述...
  2. bzoj2243 [SDOI2011]染色
  3. 使用pip安装特定的软件包版本
  4. java代码打包成jar以及转换为exe
  5. 【leetcode】521. Longest Uncommon Subsequence I
  6. DIY一个低成本多功能点阵时钟!
  7. 编写有效用例电子版_剖析用例设计方法的使用
  8. DevExpress下拉多选框 CheckComboboxEdit、CheckedListBoxControl
  9. 理解UIScrollView
  10. 为WINPE加入IMDISK 内存硬盘,虚拟磁盘,加速磁盘访问
  11. 国有资产管理处组织召开新版固定资产管理系统操作培训会
  12. Beyond Part Models: Person Retrieval with Refined Part Pooling (and A Strong Convolutional Baseline)
  13. charles安装教程--以及针对安装证书后https<unknown>爬坑
  14. 前端转换为pdf的方法之一
  15. 中国地质大学计算机研究所宿舍,在地大,据说一些寝室闪闪发光
  16. 参加“灵狐公司”的技术年会,感受最新MS OFFICE 2007的应用价值!
  17. php星星符号怎么打,如何用html5写特殊符号五角星
  18. python实现从豌豆荚批量下载样本
  19. PowerDesigner创建导出模版,并生成数据库文档(word文档)
  20. 如何在mac里安装vmware,在mac里安装虚拟机,如何注册vmware

热门文章

  1. 【AMD显卡电脑鼠标卡顿问题】
  2. linux查看 后台运行的程序看不出来,linux后台运行、关闭和查看程序的方法
  3. H5实例教学--微信内嵌视频2(素材来自腾讯孙尚香末日机甲皮肤宣传H5)
  4. mysql update两个字段_mysql更新多个字段语句写法!
  5. 嵌入式Qt-表格使用测试
  6. 理解HTTP之keep-alive(转)
  7. 这肯定计算机课试试看的英文,英语课上的小游戏
  8. ps改变图片局部颜色
  9. c 语言private用法,举例分析private的作用(c/c++学习)
  10. 网络里面没有计算机,网上邻居里面没有本地连接