MagicWeb笔记二

来源:互联网 发布:手机酷狗4g连不上网络 编辑:程序博客网 时间:2024/05/01 05:16

集搜客操作过程:http://www.gooseeker.com/doc/article-143-1.html

第一步:(整理箱)建立一个存储数据文件夹

 

Webmagic爬虫:

                    官网:  http://webmagic.io/

使用文档http://webmagic.io/docs/zh/posts/ch1-overview/README.html

设计文档http://www.oschina.net/p/webmagic

WebMagic所需Jar包:http://webmagic.io/download.html

 

 

一、设计思想

参考Scrapy,实现由HttpClient,Jsoup等Java工一句话用Java实现

组件:Downloader、pageProcessor、Scheduler、Pipeline组件合并完成多线程的任务。以实现对爬虫的功能进行定制。

核心:webmagic-core包中。其他包则是该包的扩展

实用:虽然核心功能简单,但也有自己的扩展方式,如基于注解模式的爬虫开发

 

二、核心组件

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

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

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

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

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

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

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

 

三、数据流转的对象

1.      request

对URL地址的一层封装,一个Request对应一个URL地址。

他是PageProcessor与Downloader交互的载体,也是PageProcessor控制Downloader唯一方式。

 

除了URL本身外,它还包含一个Key-Value结构的字段extra。你可以在extra中保存一些特殊的属性,然后在其他地方读取。为完成不同的功能。例如附加上一个页面的一些信息等。

2.      Page

Page 代表了从Downloader下载到一个页面----可能是HTML,也可能是JSON 或者其他文本格式的内容。

Page是WebMagic抽取过程中的核心对象,它提供了一些方法可供抽取、结果保存等。

3.      ResultIterns

它相当于一个Map,保存PageProcesser处理的结果、提供Pipeline使用。它的API与Map类似,值得注意的是它有一个字段skip,若设置为true,则不应被Pipeline处理。

 

四、爬虫运转引擎---Spider

  Spider是WebMagic内部流程的核心。D(Downloader)-P(PageProcessor)-S(Scheduler)-P(Pipeline)都是Spider的一个属性,这些属性都可以自由设置,以实现不同的功能。Spider也是WebMagic操作的入口,它封装了爬虫的创建、启动、停止、多线程等功能。

 

 

五.使用注释编写爬虫

引入webmagic-extension包即可使用此功能

 

开发方式:

1.      定义需要抽取的数据,并编写类

2.      在类中写明@TargetUrl注释,定义对那些URL进行下载和抽取

3.      在类的字段上加上@ExtactBy注释,定义这个字段使用什么方式进行抽取

4.      定义结果的存储方式

核心代码:

@TargetUrl("https://github.com/\\w+/\\w+")

@HelpUrl("https://github.com/\\w+")

publicclassGithubRepo {

   @ExtractBy(value="//h1[@class='entry-titlepublic']/strong/a/text()", notNull =true)

   privateStringname;

   @ExtractByUrl("https://github\\.com/(\\w+)/.*")

   privateStringauthor;

   @ExtractBy("//div[@id='readme']/tidyText()")

   privateStringreadme;

   publicstaticvoid main(String[]args) {

        OOSpider.create(Site.me().setSleepTime(1000)

                , new ConsolePageModelPipeline(), GithubRepo.class)

                .addUrl("https://github.com/code4craft").thread(5).run();

   }

}

1.定义URL

HelpUrl/TargetUrl是非常有效的爬虫开发模式,TargetUrl最终的要爬去的URL即是目标URL

HelpURL则是为了发现目标URL,而需要访问的URL。过度URL

对于博客页,HelpURL是列表页,TargetURL是文章页。

对于论坛,HelpURL是帖子列表,TargetURL是帖子详情

2.抽取数据

@ExtractBy是一个抽取元素的注释,他描述了一种抽取规则

注释主要作用于字段,他表示“使用这个抽取规则,将抽取到的结果保存到这个字段中‘。

@ExtractBy("//div[@id='readme']/tidyText()");private String readme;

这里"//div[@id='readme']/text()"是一个XPath表示的抽取规则,而抽取到的结果则会保存到readme字段中。

        

4.  多结果抽取

如在美食网站中抽取用户名和优惠信息怎么办呢?

在类上使用@ExtractBy注释可以解决在此问题。

使用方式:受用这个结果抽取一个区域,让这块区域对应一个结果。

@ExtractBy(value ="//ul[@id=\"promos_list2\"]/li",multi = true)

    public classQQMeishi {

    ……

}

 

六.完整流程

 1.创建和启动

 采用注入模式:入口OOSpider(OO:面向对象编程)继承了Spider并提供了创建和启动方法以及定义了处理结果的方式

核心代码:

publicstatic OOSpider create(Site site, PageModelPipeline pageModelPipeline, Class...pageModels);

2. PageModelPipeline

  PageModelPipeline是注释模式下处理结果的类,通过实现它,可以自定义结果处理方式

核心代码:

  public interface PageModelPipeline<T> {

    public void process(T t, Task task);

}

PageModelPipeline与Model类是对应的,多个Model可以对应一个PageModelPipeline

3、AfterExtractor

  注入模式无法满足所有需求,可通过写代码完成,需要用到AfterExtractor接口。

核心代码:

publicinterface AfterExtractor {

    public void afterProcess(Page page);

}

 

七.成功跑起来的Demo

https://github.com/code4craft/webmagic/tree/master/webmagic-samples/src/main/java/us/codecraft/webmagic/samples

jar:D:\Java\Spider_JAR\0.5.2

XpathXML路径语言XML Path Language学习文档1http://www.cnblogs.com/gaojun/archive/2012/08/11/2633908.html

文档2http://webmagic.io/docs/zh/posts/ch4-basic-page-processor/xsoup.html

xpath的用法:例如如果链接在:

<divclass='a'>

       <span class='b'><ahref='xxx'></a></span>

</div>

 

xpath写法:page.getHtml().xpath("//div[@class='a']/span[@class='b']/a/@href").get();

 

八.数据抓取案例

java爬虫webmagic 案例爬取动态(ajax+js)网站京东售价格链接:

http://www.thinksaas.cn/topics/0/491/491725.html

 

九.遇到困难

在分页抓取京东手机正则表达式匹配手机URL时遇到难点:

如http://list.jd.com/list.html?cat=9987,653,655&page=2&JL=6_0_0&ms=5#J_main

正则匹配:

 注意点:URL中“?”-->正则匹配\\?

不小于一位数的匹配:字符之间要转义“page=1&JL”--->正则匹配 page=\\d+\\&JL

 

http://list.jd.com/list.html\\?cat=9987,653,655&page=\\d+\\&JL=6_0_0&ms=5#J_main

 

对讲机: http://list.jd.com/list.html?cat=9987,653,659&page=1&JL=6_0_0&ms=5#J_main

笔记本:

http://list.jd.com/list.html?cat=670,671,672&page=1&go=0&JL=6_0_0&ms=6#J_main

平板电视:

http://list.jd.com/list.html?cat=737,794,798&page=1&JL=6_0_0#J_main

空调:

http://list.jd.com/list.html?cat=737,794,870&page=1&JL=6_0_0#J_main

冰箱:

http://list.jd.com/list.html?cat=737,794,878&page=1&JL=6_0_0#J_main

0 0