WebMagic

摘要:
WebMagic是Java平台上的一个开源爬虫框架。它的设计参考了Scrapy,它的实现参考了HttpClient和Jsoup。PageProcessor负责解析网页和链接发现,使用Jsoup和Xsoup。管道负责结果数据的持久性。快速开始依赖于ext{versions=[“web_magic”:‘0.7.3’]}依赖关系的引入{//有一个您自己的项目compileprojectcompile的日志实现{excludegroup:'org.slf4j',module:'slf4j-log4j12'//删除默认日志实现}compile{excincludegroup:'org.slf4j',module:'slf4j-log4j2'}}快速开始爬网https://github.com/code4craft/页面上可以找到的所有Github仓库信息。参数如下:任务{“exitWhenComplete”:true,“pageCount”:0,//页面“scheduler”:{“duplicateRemover”:{}},“site”:{“acceptStatCode”:[200],“allCookies”:{},“cookies”:{},”cycleRetryTimes“:0,”disableCookieManagement“:false,”domain“:”github.com“,”headers“:{”:method“:GET”,”origin“:”https://github.com“},”retrySleepTime“:1000,”retlyTimes“:3,”sleepTime“:100,”timeOut“:10000,”useGzip“:true},”spawnUrl“:true,”startTime“:1544165065094,”status“:”Running“,”threadAlive“:1,”uUID“:”github“。Com“}ResultItems{”all“:{//自定义字段位于此处“a_key”:“a_value”},“request”:{”binaryContent“:false,“cookies”:{{},”headers“:{}”,“priority”:0,”url“:”https://github.com/code4craft?为了进行临时调整,请修改HttpClientGenerator中的buildSSLConnectionSocketFactory方法,并返回newSSLConnectSocketFactory以重写自己实现的HttpClientDownloader并将其设置为Spider。

WebMagic 是干嘛的?

WebMagic 是一个 Java 平台上的开源爬虫框架,其设计参考了 Scrapy,实现则参考了 HttpClient 和 Jsoup。其由四大组件组成:

  1. Downloader,负责下载网页,使用 HttpClient。
  2. PageProcessor,负责解析网页和链接发现,使用 Jsoup 和 Xsoup。
  3. Scheduler,负责管理待抓取的 URL 和去重。
  4. Pipeline,负责结果数据的持久化。

快速开始

(1)依赖引入

ext {
  versions = [
    "web_magic": '0.7.3'
  ]
}

dependencies {
  // 这里有自己项目的日志实现
  compile project(':base')

  compile("us.codecraft:webmagic-core:${versions.web_magic}") {
    exclude group: 'org.slf4j', module: 'slf4j-log4j12' // 移除默认的日志实现
  }
  compile("us.codecraft:webmagic-extension:${versions.web_magic}") {
    exclude group: 'org.slf4j', module: 'slf4j-log4j12'
  }
}

(2)快速开始

爬取 https://github.com/code4craft/ 页面上可以发现的所有 Github 仓库信息。


public class GithubRepoPageProcessor implements PageProcessor {

  private Site site = Site.me().setRetryTimes(3).setSleepTime(200).setTimeOut(10000);

  @Override
  public void process(Page page) {
    String regex = "(https://github\.com/code4craft/([\w-_]+)/)";
    page.addTargetRequests(page.getHtml()
                               .links()
                               .regex(regex)
                               .all());
    if(!Pattern.matches(regex,page.getUrl().get())){
      //skip this page
      page.setSkip(true);
    }
    page.putField("author", page.getUrl().regex("https://github\.com/(\w+)/.*").toString());
    page.putField("name",
                  page.getHtml()
                      .xpath("//meta[@property='og:title']/@content")
                      .toString());
    if (page.getResultItems().get("name") == null) {
      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();
  }
}

更进一步

Pipeline 接口参数分析

Pipeline 接口会在每个 Page 解析完成之后回调一次。其中的参数如下:

(1)Task

{
    "exitWhenComplete": true,
    "pageCount": 0, // 抓取的第几页
    "scheduler": {
        "duplicateRemover": {}
    },
    "site": {
        "acceptStatCode": [
            200
        ],
        "allCookies": {},
        "cookies": {},
        "cycleRetryTimes": 0,
        "disableCookieManagement": false,
        "domain": "github.com",
        "headers": {
            ":method": "GET",
            "origin": "https://github.com"
        },
        "retrySleepTime": 1000,
        "retryTimes": 3,
        "sleepTime": 100,
        "timeOut": 10000,
        "useGzip": true
    },
    "spawnUrl": true,
    "startTime": 1544165065094,
    "status": "Running",
    "threadAlive": 1,
    "uUID": "github.com"
}

(2)ResultItems

{
    "all": {
        // 自定义的字段在这里
        "a_key":"a_value"
    },
    "request": {
        "binaryContent": false,
        "cookies": {},
        "headers": {},
        "priority": 0,
        "url": "https://github.com/code4craft?tab=repositories"
    },
    "skip": false
}

排错

Https下无法抓取只支持TLS1.2的站点

作者 code4craft 针对 ISSUE 701 提供了如下的解决方案:

更新会在0.7.4版本发布。

临时适配方式,修改HttpClientGenerator中的buildSSLConnectionSocketFactory方法,

return new SSLConnectionSocketFactory(createIgnoreVerifySSL(), new String[]{"SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2"},
                    null,
                    new DefaultHostnameVerifier())
重写自己实现的HttpClientDownloader,并设置到Spider中。

java.net.UnknownHostException

请检查网络连接。

参考

  1. WebMagic in Action - webmagic.io

免责声明:文章转载自《WebMagic》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇oracle minus 与sqlserver exceptCSS 边框(border)实例下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

http、https网络请求状态码 statusCode 200、300、400、500。WebSocket断开状态码 1006...

一、http、https网络请求状态码 statusCode 200、300、400、500   200-206:服务器成功处理了请求的状态代码,说明网页或资源可以正常访问。 200(成功)  服务器已成功处理了请求。通常,这表示服务器提供了请求的网页或资源。 201(已创建)  请求成功且服务器已创建了新的资源。  202(已接受)  服务器已接受了请...

搜索和浏览离线 Wikipedia 维基百科(中/英)数据工具

  为什么使用离线维基百科?一是因为最近英文维基百科被封,无法访问;二是不受网络限制,使用方便,缺点是不能及时更新,可能会有不影响阅读的乱码。   目前,主要有两种工具用来搜索和浏览离线维基百科数据:Kiwix 和 WikiTaxi 。这两种都是免费的,但 WikiTaxi 只有 Windows 版本,而 Kiwix 不仅支持 Windows、Linux...

开源软硬一体OpenCV AI Kit(OAK)

开源软硬一体OpenCV AI Kit(OAK) OpenCV 涵盖图像处理和计算机视觉方面的很多通用算法,是非常有力的研究工具之一,且稳居开发者最喜爱的 AI 工具/框架榜首。 1、会不会被USA禁止啊? b. 不会, Myriad X 可以销售,性能稍低 (嵌入式芯片 4TOPS),被禁的是100+TOPS的芯片。 2、opencv开发者要花钱用吗?...

人脸识别手机端APK分享 | 极速体验人脸识别功能 创建一个简单的人脸识别手机APP程序

1.前言 虹软公司提供免费离线人脸识别,对于开发者提供了比较友好、完整的可配置demo。但是如需直接体验功能,还是要花一点时间去完成项目编译、配置等一系列工作,对于初学者、不怎么熟悉整个项目的人来说可能会踩不少坑。 本文是基于虹软人脸识别SDK V3.0 Android Java的demo,封装后输出的一个简单的的APK程序,直接安装到手机即可体验功能,...

Facebook应用程序权限请求以及数据获取

最近因工作需要研究了一下facebook的API调用. 虽然是一个不存在的网站,但也是工作内容的一部分,需要认真对待.既然对于咱们国人来说不存在,当然也就没有汉字可看了.英文文档让我头晕了好一阵子,吐了好几次之后终于摸清了脉络. 大致步骤是: 1、创建一个应用程序,可以获得App ID/API Key和App Secret。 2、使用URL: https:...

安装cuda实践

------------恢复内容开始------------ 开头想网络安装,发现从invidia下载东西很慢,改为下载到本地再安装。 反正证书之类的,需要先下载到本地再安装。kx上网或者不kx上网,两个方式都尝试下,下载证书或者是安装包。 两个方式都不能下载的话,我安装uget,然后就下载成功了。而,uget网上说需要先add ppa,这样操作是失败的。...