WebMagic

首先,爬虫的本质:基于Http协议请求目标地址获取响应结果解析并存储。

01

导语

1、爬虫基础知识

2、优秀国产开源爬虫框架webmagic剖析

02

爬虫基础

1、爬虫的本质

爬虫的本质:基于Http协议请求目标地址获取响应结果解析并存储。

2、HTTP请求

  1. 请求头(Request Headers):包装了http请求的基本信息,比较重要的如:user-agent、referer、cookie、accept-language(接受语言)、请求方法(post、get)。
  2. 响应头(Response Headers):包装了服务器返回的头信息,如content-language内容语言、content-type内容的类型text/html等 、server服务器类型(tomcat、jetty、nginx等)、status响应状态(如:200、302、404等等)。
  3. Response:服务端具体的返回,类型多种多样,有html页面、js代码、json串、css样式、流等等。

3、解析

通常情况下,web返回的基本都是html页面、json。

  1. xpath:xml路径语言,具备很强的解析能力,chrome、firefox都有对应的工具生成xpath语法,可以很方便的对标准html文件进行解析。
  2. jsonpath:jsonpath是一个json解析的利器,非常类似于xpath语法,用非常简洁的表达式解析json串。
  3. css选择器:这里的css选择器和jquery有点类似,通过元素的css样式来定位元素,大名鼎鼎的jsoup提供丰富的css选择器
  4. 正则表达式
  5. 字符串分割

4、难点

  • 分析请求

ajax的普及,很多网站都采用了动态渲染的模式,请求不再是简单的返回html的模式,那么给爬取带来了巨大的难度,一般只能靠分析异步请求返回的json来具体分析,解析成我们需要的数据格式。还有一类是通过服务端内部转发来渲染页面,这类是最难的,请求不是通过浏览器来请求,而是再服务端跳转几次才渲染给浏览器,这时候需要使用模拟器来模拟请求,如selenium等。

  • 网站的限制

    • cookie限制:很多网站是要登陆后才能绕过filter才能访问,这时候必须模拟cookie
    • user-agent:有的网站为了防爬虫,必须要求是真正浏览器才能访问,这时候可以模拟 user-agent
    • 请求加密:网站的请求如果加密过,那就看不清请求的本来面目,这时候只能靠猜测,通常加密会采用简单的编码,如:base64、urlEncode等,如果过于复杂,只能穷尽的去尝试
    • IP限制:有些网站,会对爬虫ip进行限制,这时候要么换ip,要么伪装ip
    • 曲线方案:对应pc端,很多网站做的防护比较全面,有时候可以改一下思路,请求app端服务试试,通常会有意想不到的收获。
  • 爬取深度

网站通常的表现形式是一个页面超链接着另外的页面,理论上是无限延伸下去的,这时候必须设置一个爬取深度,不能无穷无尽的爬取。

  • 总结

爬虫本质上只做了两件事情:请求和解析结果,但是爬虫的开发是非常困难的,需要不停的分析网站的请求,不停的跟随目标网站来升级自己的程序,试探解密、破解目标网站限制,把它当做网络攻防一点也不为过。

03

webmagic 架构解析

webmagic 是一个优秀的国产爬虫框架、简单易用、提供多种选择器,如css选择器、xpath、正则等等,预留了多个扩展接口,如Pipeline、Scheduler、Downloader等。

上图复制于webmagic官方文档,webmagic由四部分组成

  • Downloader:负责请求url获取访问的数据(html页面、json等)。
  • PageProcessor:解析Downloader获取的数据。
  • Pipeline:PageProcessor解析出的数据由Pipeline来进行保存或者说叫持久化。
  • Scheduler:调度器通常负责url去重,或者保存url队列,PageProcessor解析出的url可以加入Scheduler队列,用于下一次的爬取。

Webmagic使用非常简单,实现PageProcessor 接口,即可利用Spider类启动爬虫任务了。

下面重点解析一下Spider类的几个重要方法,包括锁的使用

1、addUrl

scheduler.push(request, this),把需要爬取的url加入到Scheduler队列。

2、initComponent

初始化downloader、pipelines、threadPool线程池,这里有必要说明一下,webmagic默认down是HttpClientDownloader、默认pipeline是ConsolePipeline.

2、run

run方法是整个爬行运行的核心

  • 任务结束时机

队列为空并且所有正在运行请求完成,且设置了exitWhenComplete为true,这时才会退出任务,这时候必须注意一点是,当页面请求过于慢,导致新解析的url来不及进队列,这时候任务退出导致爬取不完整。一般设置exitWhenComplete为false,但是有时候开启两个爬虫,必须等上一个爬虫完成,才运行下一个爬虫,这时候就会出问题了。实现这种场景,得改一下webmagic源码

  • 等待新请求时间,默认是30s
  • 标题
  • 若scheduler队列里有url,在把任务丢进线程池,页面download成功,则执行pageProcessor的process方法,如果有pipeline,则执行pipeline链里的process方法

有一点要注意,对于PageProcessor接口和Pipeline接口的实现,特别要注意线程安全的问题,切记不可对单例集合对象塞元素。

  • 线程池CountableThreadPool的execute方法

这里有死锁的风险,当threadAlive数大于等于threadNum线程数,reentrantLock.lock()申请锁,循环condition.await(),与此同时 executorService.execute方法中的threadAlive的decrementAndGet也必须reentrantLock.lock()申请锁,此时,两方互相等待资源而造成死锁,这个小bug调整一下,无碍大局。到时候官方提一个issues

总体说来,Webmagic架构清晰,扩展容易,使用方便,是一款不错的爬虫框架。

WebMagic 剖析相关推荐

  1. volatile关键字之全面深度剖析

    引言 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字 ...

  2. TensorFlow基础剖析

    TensorFlow基础剖析 一.概述 TensorFlow 是一个使用数据流图 (Dataflow Graph) 表达数值计算的开源软件库.它使用节点表示抽象的数学计算,并使用 OP 表达计算的逻辑 ...

  3. c语言赋值x为字母,C语言算术、赋值、关系、逻辑运算详细剖析---

    标识符和关键字 ¨标识符:用来标识程序中的变量.符号常量.函数.数组.类型.文件等对象的名字.标识符只能由字母.数字和下划线组成,且第一个字符必需为字母或下划线.C语言中大小写字母是两个不同的字符. ...

  4. 如何在HHDI中进行数据质量探查并获取数据剖析报告

    通过执行多种数据剖析规则,对目标表(或一段SQL语句)进行数据质量探查,从而得到其数据质量情况.目前支持以下几种数据剖析类型,分别是:数字值分析.值匹配检查.字符值分析.日期值分析.布尔值分析.重复值 ...

  5. 老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 1...

    老李推荐:第14章4节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-端口转发 在初始化HierarchyViewer的实例过程中, ...

  6. JS魔法堂:mmDeferred源码剖析

    一.前言 avalon.js的影响力愈发强劲,而作为子模块之一的mmDeferred必然成为异步调用模式学习之旅的又一站呢!本文将记录我对mmDeferred的认识,若有纰漏请各位指正,谢谢.项目请见 ...

  7. Linux 文件系统剖析

    Linux 文件系统剖析 按照分层结构讨论 Linux 文件系统 M. Tim Jones, 顾问工程师, Emulex Corp. 简介: 在文件系统方面,Linux® 可以算得上操作系统中的 &q ...

  8. 剖析PHP中的输出缓冲

    剖析PHP中的输出缓冲 本文按署名·非商业用途·保持一致授权 作者:  ,发表于2005年12月24日01时54分 我们先来看一段代码. <?php for ($i=10; $i>0; $ ...

  9. libevent源码深度剖析

    原文地址:http://blog.csdn.net/sparkliang/article/details/4957667 libevent源码深度剖析一 --序幕 张亮 1 前言 Libevent是一 ...

最新文章

  1. ICCV 2019 | 加一个任务路由让数百个任务同时跑起来,怎么做到?
  2. C++手册_迅为干货 | C程序调用shell
  3. redis高并发抽奖
  4. mysql用户管理+pymysql模块
  5. 生活中处处有joke!!
  6. C语言学习之企业发放的奖金根据利润提成。利润I低于或等于100000元的,奖金可提成10%;
  7. MIME Type描述消息内容类型的因特网标准
  8. CTU 2017 J - Punching Power (二分图匹配)
  9. mysql5.7 新建远程用户_Centos7中 mysql5.7 用户 创建 、授权、远程登录
  10. android电梯程序设计,课内资源 - 基于Android实现的电梯调度模拟
  11. DR.com客户端解密过程逆向分析
  12. 【差分隐私发论文朝哪个方向走?】差分隐私的过去,现在和将来
  13. JSON 数据格式(基础知识)
  14. 51 -算法 -LeetCode 53最大子序和 动态规划
  15. 消防信号总线原理_消防安全微视频:可燃气体探测报警系统培训
  16. 安卓c语言文档下载,C语言.NET技术09.doc
  17. elk怎么读的_大数据采集和抽取怎么做?这篇文章终于说明白了!
  18. 【C语言】排序详解——冒泡排序
  19. 2003卡在应用计算机设置,计算机操作与应用(Windows XP+Office 2003)
  20. Qt多功能计算器(一)——基本功能

热门文章

  1. Spring循环依赖问题解决
  2. 迁移学习:《SHARPNESS-AWARE MINIMIZATION FOR EFFICIENTLY IMPROVING GENERALIZATION》
  3. 管理员工工作微信小技巧
  4. 网络通信技术中的中继器repeater
  5. webAPI学习笔记2(DOM事件高级)
  6. SIGPIPE的设计意图
  7. matlab交大校歌,一首用matlab编写的浙大校歌—来自寂寞的工科男
  8. 写一段java链接图灵机器人的代码
  9. 设置 gridview 数据 居中 显示
  10. Android BroadCastReceiver突然失效接收不到广播了