`

WebMagic写的网络爬虫

    博客分类:
  • java
 
阅读更多

一、WebMagic总体架构 

  

五、如何用WwbMagic

  1.5.1 WebMagic的四个组件   

1.Downloader

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

2.PageProcessor

PageProcessor负责解析页面,抽取有用信息,以及发现新的链接。WebMagic使用Jsoup作为HTML解析工具,并基于其开发了解析XPath的工具Xsoup

在这四个组件中,PageProcessor对于每个站点每个页面都不一样,是需要使用者定制的部分。

3.Scheduler

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

除非项目有一些特殊的分布式需求,否则无需自己定制Scheduler。

4.Pipeline

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

Pipeline定义了结果保存的方式,如果你要保存到指定数据库,则需要编写对应的Pipeline。对于一类需求一般只需编写一个Pipeline

1.5.2  爬虫项目简单例子 

依赖:

复制代码
<dependency>
    <groupId>us.codecraft</groupId>
     <artifactId>webmagic-core</artifactId>
     <version>0.6.1</version>
 </dependency>
 <dependency>
     <groupId>us.codecraft</groupId>
     <artifactId>webmagic-extension</artifactId>
     <version>0.6.1</version>
</dependency>
复制代码

 

简单代码:  

复制代码
 import us.codecraft.webmagic.Page;
 import us.codecraft.webmagic.Site;
 import us.codecraft.webmagic.Spider;
 import us.codecraft.webmagic.processor.PageProcessor;
 
 public class GithubRepoPageProcessor implements PageProcessor {
 
     private Site site = Site.me().setRetryTimes(3).setSleepTime(100);
 
     @Override
     public void process(Page page) {
         page.addTargetRequests(page.getHtml().links().regex("(https://github\\.com/\\w+/\\w+)").all());
         page.putField("author", page.getUrl().regex("https://github\\.com/(\\w+)/.*").toString());
         page.putField("name", page.getHtml().xpath("//h1[@class='entry-title public']/strong/a/text()").toString());
         if (page.getResultItems().get("name")==null){
             //skip this page
             page.setSkip(true);
         }
         page.putField("readme", page.getHtml().xpath("//div[@id='readme']/tidyText()"));
     }
 
     @Override
     public Site getSite() {
         return site;
     }
 
     public static void main(String[] args) {
         Spider.create(new GithubRepoPageProcessor()).addUrl("https://github.com/code4craft").thread(5).run();
     }
复制代码

 

 如果仔细分析这段代码的逻辑,将其弄明白了,那么对于一个简单的爬虫项目,你就可以自己写了。

addUrl是定义从哪一个页面开始爬取;

addTargetRequests(page.getHtml().links().regex("(https://github\\.com/\\w+/\\w+)").all());是指定抓取html页面的符合此正则表达式的所有链接url;

page.getHtml().xpath("//h1[@class='entry-title public']/strong/a/text()").toString是指定抓取h1标签下的class属性值为entry-title public的子标

签strong下的a标签下的文本内容;

   tidyText()所有的直接和间接文本子节点,并将一些标签替换为换行,使纯文本显示更整洁。当然这也就要求大家也要对正则表达式熟悉了。本文用的是xsoup,Xsoup是
基于Jsoup开发的一款XPath 解析器,之前WebMagic使用的解析器是HtmlCleaner,使用过程存在一些问题。主要问题是XPath出错定位不准确,并且其不太合理的代码结构
也难以进行定制。而Xsoup更加符  合爬虫开发的需 要。令人欣喜的是,经过测试,Xsoup的性能比HtmlCleaner要快一倍以上。 
  通过注解将值赋给model属性的实体类:
      
复制代码
 @TargetUrl("https://github.com/\\w+/\\w+")
 @HelpUrl("https://github.com/\\w+")
 public class GithubRepo {
 
     @ExtractBy(value = "//h1[@class='entry-title public']/strong/a/text()", notNull = true)
     private String name;
 
     @ExtractByUrl("https://github\\.com/(\\w+)/.*")
     private String author;
 
     @ExtractBy("//div[@id='readme']/tidyText()")
     private String readme;
 }
复制代码

 

 
提示:
HelpUrl/TargetUrl是一个非常有效的爬虫开发模式,TargetUrl是我们最终要抓取的URL,最终想要的数据都来自这里;而HelpUrl则是为了发现这个最终URL,我们需要访问的页面。几乎所有垂直爬虫的需求,都可以归结为对这两类URL的处理:
  • 对于博客页,HelpUrl是列表页,TargetUrl是文章页。
  • 对于论坛,HelpUrl是帖子列表,TargetUrl是帖子详情。
  • 对于电商网站,HelpUrl是分类列表,TargetUrl是商品详情。

模拟浏览器请求:
  
复制代码
     public VideoSpider(String url, String proxyStr) {
         this.client_url = url;
         String[] tmp = proxyStr.split(":");
         HttpHost proxy = new HttpHost(tmp[1].substring(2), Integer.parseInt(tmp[2]), tmp[0]);
         Site site = Site.me().setRetryTimes(3).setHttpProxy(proxy).setSleepTime(100).setTimeOut(10 * 1000).setCharset("UTF-8")
                 .setUserAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36");
 
         GPHttpClientDownloader downloader = new GPHttpClientDownloader();
         Request request = new Request(this.client_url);
 
         this.setCookie(request, site, downloader);
         this.setParameters(request, site, downloader);
     }
复制代码

 

  中setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36"),jobInfoDaoPipeline, LieTouJobInfo.class)

  是模拟火狐、苹果、谷歌等浏览器进行请求将通过实体类LieTouJobInfo来抓取指定的内容并通过数据库访问层jobInfoDaoPipeline将相关属性存入数据库。

六、思考

  简单的爬虫用以上代码基本就可以实现,但是我们要知道,要想真正爬取自己想要的内容,还有一段很长的落要走。因为我们在抓取数据的时候要考虑到去重、动态页面的产生、快速的更新频率、巨大的数据量等等的问题。针对这些问题我们该怎么做才能有效简单的去解决,这是
一个特别值得探讨的问题。就先写到这吧,如果我研究的有进展了,足以在公司项目中稳定投入使用了,再来完善吧。

下载:

最新版:WebMagic-0.6.1

Maven依赖:

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

文档:

源码:

 
分享到:
评论

相关推荐

    基于webmagic的网络爬虫入门demo

    **基于WebMagic的网络爬虫入门** WebMagic是一个开源的Java爬虫框架,设计目标是简单易用,可扩展性强。本教程将引导你通过一个简单的示例了解如何使用WebMagic进行网页抓取。 **一、WebMagic简介** WebMagic是由...

    基于WebMagic的网络爬虫程序.zip

    本项目包含了一个基于WebMagic的网络爬虫程序实例,可以帮助我们了解和学习如何使用WebMagic来抓取网页数据。 首先,我们要理解什么是网络爬虫。网络爬虫,又称为网页蜘蛛或网络机器人,是一种自动浏览互联网并抓取...

    基于 webmagic 的 Java 爬虫应用.zip

    本项目“基于 webmagic 的 Java 爬虫应用”就是这样一个实例,它利用了WebMagic这个强大的Java爬虫框架,帮助开发者快速、高效地实现网络数据抓取。 【WebMagic简介】 WebMagic是一个简单灵活的Java爬虫框架,它的...

    基于webmagic的Java爬虫应用.zip

    网络搬运工webporter 是一个基于webmagic的垂直爬虫框架的 Java 爬虫应用程序,旨在提供一套完整的数据爬虫、持久化存储和可视化展示的样例实践示例。webporter寓意“我们不是生产数据,我们只是互联网的搬运工”...

    自己手动写网络爬虫 随书光盘

    《自己动手写网络爬虫》是一本由罗刚编著的专业书籍,主要针对Java编程语言进行网络爬虫的实现。本书旨在帮助读者深入理解网络爬虫的工作原理,并通过实际编程练习提升技能。光盘附带的高效代码解决方案是书中的实践...

    java webmagic实现的爬虫

    它使用了现代的Java技术栈,如Scala、Guava和Netty,提供了高效、灵活且易于使用的特性,使得开发者能够快速构建自己的网络爬虫项目。在本案例中,这个爬虫被用来抓取江苏政府采购网的数据。 WebMagic的核心组件...

    基于 webmagic 的 Java 爬虫应用:爬取企信网企业基本信息.zip

    WebMagic 是一个强大的、模块化的 Java 爬虫框架,适用于构建高效、灵活的网络爬虫项目。本项目是关于如何使用 WebMagic 框架来爬取企信网的企业基本信息,以下将详细介绍这一过程。 首先,了解 WebMagic 的核心...

    WebMagic(Java爬虫框架) v0.7.2

    对于更复杂的场景,可能还需要掌握JavaScript和网络爬虫反反爬策略。 在v0.7.2这个版本中,可能已经包含了详细的文档、示例代码和API接口,这些都是学习和使用WebMagic的重要资源。通过深入研究提供的压缩包内容,...

    WebMagic (Java爬虫框架).zip

    总的来说,WebMagic提供了一个强大且易于上手的Java爬虫框架,结合扎实的Java基础和爬虫知识,开发者可以高效地构建自己的网络爬虫项目,处理各种网页抓取需求。通过不断学习和实践,可以提升对WebMagic的理解和运用...

    基于java的开发源码-WebMagic (Java爬虫框架).zip

    这对于我们学习Java编程、网络爬虫原理以及理解多线程和并发控制等技术非常有帮助。 此外,通过阅读和分析源码,我们还可以了解到WebMagic如何处理动态加载的内容(如JavaScript加载的数据),以及如何避免被网站...

    基于webmagic的通用爬虫抓取应用,核心在于简单易用,搭建好后轻松抓取数据

    WebMagic是一个开源的Java爬虫框架,其设计目标是简化爬虫的开发流程,使得开发者可以快速地构建自己的网络爬虫应用。这个项目名为"easycrawl-master",显然是一个基于WebMagic的简单爬虫示例或者模板,用于帮助初学...

    清华大学基于Java语言的《自己动手写网络爬虫》 全部源码 共10个章节.rar

    《自己动手写网络爬虫》是清华大学推出的一门课程,主要教授如何使用Java语言来构建网络爬虫。网络爬虫是一种自动抓取互联网信息的程序,对于数据分析、搜索引擎优化、市场研究等领域都有着重要的应用。本课程的源码...

    自己动手写网络爬虫 Java版

    《自己动手写网络爬虫 Java版》是一本深入浅出的教程,旨在引导读者了解搜索引擎技术并使用Java语言实现自己的网络爬虫项目。通过这本书,你可以掌握如何在互联网上抓取、处理和存储大量数据,进而创建一个功能完备...

    webmagic爬虫项目 代码案例基于maven项目构建

    通过理解和学习这个项目,你可以了解如何使用Maven管理项目依赖,以及如何使用WebMagic框架构建一个完整的网络爬虫,包括定义爬虫逻辑、配置组件、启动爬虫等关键步骤。这对于提升Java编程和网络爬虫技术的理解非常...

    webmagic 网络爬虫.zip

    爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL...

Global site tag (gtag.js) - Google Analytics