目标
- 网络爬虫的是做什么的?
- 手动写一个简单的网络爬虫;
1. 网络爬虫
1.1. 名称
1.2. 简述
- 网络爬虫是通过网页的链接地址来寻找网页,从网站某一个页面(通常是首页)开始,读取网页的内容,找到
在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有
的网页都抓取完为止。 - 如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来。
- 所以要想抓取网络上的数据,不仅需要爬虫程序还需要一个可以接受”爬虫“发回的数据并进行处理过滤的服务
器,爬虫抓取的数据量越大,对服务器的性能要求则越高。
2. 流程
- 网络爬虫是做什么的? 他的主要工作就是 跟据指定的url地址 去发送请求,获得响应, 然后解析响应 , 一方面从
响应中查找出想要查找的数据,另一方面从响应中解析出新的URL路径,然后继续访问,继续解析;继续查找需要的
数据和继续解析出新的URL路径 . - 这就是网络爬虫主要干的工作. 下面是流程图:
通过上面的流程图 能大概了解到 网络爬虫 干了哪些活 ,根据这些 也就能设计出一个简单的网络爬虫出来.
一个简单的爬虫 必需的功能:
- 发送请求和获取响应的功能 ;
- 解析响应的功能 ;
- 对 过滤出的数据 进行存储 的功能 ;
- 对解析出来的URL路径 处理的功能 ;
2.1. 关注点
- 爬虫需要关注的三个点:
- 对抓取目标的描述或定义;
- 对网页或数据的分析与过滤;
- 对URL的搜索策略
3. 分类
- 网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:
- 通用网络爬虫(General Purpose Web Crawler)
- 聚焦网络爬虫(Focused Web Crawler)
- 增量式网络爬虫(Incremental Web Crawler)
- 深层网络爬虫(Deep Web Crawler)。
- 实际的网络爬虫系统通常是几种爬虫技术相结合实现的。
4. 思路分析
- 下面我用我们的官网将跟大家一起来分析下如何实现这样的一个爬虫:
首先观察我们爬虫的起始页面是:http://www.wanho.net/a/jyxb/
- 分析页面
所有的喜报信息的URL用XPath表达式来表示就是://div[@class='main_l']/ul/li
相关数据
- 标题:用XPath表达式来表示
//div[@class='content']/h4/a/text()
- 描述:用XPath表达式来表示
//div[@class='content']/p/text()
- 图片:用XPath表达式来表示
//a/img/@src
好了,我们上面已经将在代码中需要获取的关键信息的XPath表达式都找到了,接下来就可以正式写代码来实现了
5. 代码实现
代码实现部分采用webmagic框架,因为这样比使用基本的的Java网络编程要简单得多注:关于webmagic框架可以看一下面讲义
5.1. 代码结构
5.2. 程序入口
Demo.java
/**
* 程序入口
*/
public class Demo {
public static void main(String[] args) {
// 爬取开始
Spider
// 爬取过程
.create(new WanhoPageProcessor())
// 爬取结果保存
.addPipeline(new WanhoPipeline())
// 爬取的第一个页面
.addUrl("http://www.wanho.net/a/jyxb/")
// 启用的线程数
.thread(5).run();
}
}
5.3. 爬取过程
- WanhoPageProcessor.java
package net.wanho.wanhosite;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Html;
public class WanhoPageProcessor implements PageProcessor {
// 部分一:抓取网站的相关配置,包括编码、抓取间隔、重试次数等
private Site site = Site
.me()
.setTimeOut(10000)
.setRetryTimes(3)
.setSleepTime(1000)
.setCharset("UTF-8");
// 獲得站點
@Override
public Site getSite() {
return site;
}
//爬取過程
@Override
public void process(Page page) {
//获取当前页的所有喜报
List<String> list = page.getHtml().xpath("//div[@class='main_l']/ul/li").all();
//要保存喜报的集合
Vector<ArticleVo> voLst = new Vector<>();