webmagic

WebMagic-Avalon之分布式实现方案

浪子不回头ぞ 提交于 2019-12-19 17:53:29
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> WebMagic之前具有基本的分布式功能,可以将一个Spider部署到多台机器上,并通过Redis来管理URL,达到多机合作抓取的目标。 我在WebMagic-Avalon里计划完成一个管理后台,通过这个后台可以新建、管理和监控爬虫,具体的产品形态,见草图 http://my.oschina.net/flashsword/blog/202889 。 这个系统涉及到一个Spider的动态创建和管理的问题。之前WebMagic是一个Java应用内部框架,并不具有动态创建的能力,也没有外部管理的能力。于是,在WebMagic-Avalon里,需要一个新的分布式方案。 总体架构: 这个系统共有4个角色: Scheduler: Scheduler是WebMagic的基本角色,它对需要抓取的URL进行管理,并进行去重等工作。Scheduler是集中式的,使用Redis来实现Scheduler是比较好的选择。 Spider: Spider是WebMagic的基本角色,即对某一个站点的爬虫,它包括下载、解析以及持久化的工作。它会从Scheduler中拉到URL来处理,并添加新的URL到Scheduler。Spider是多线程的,单机的多个Spider可能会共用一个线程池。 Worker: Worker对应一台机器

玩转webmagic代码之Scheduler

天大地大妈咪最大 提交于 2019-12-19 17:18:34
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> webmagic上线之后,因为灵活性很强,得到了一些爬虫老手的欢迎,但是对于新手来说可能稍微摸不着头脑,我的需求是这样子,什么模块化,什么灵活性,但是看了半天,我也不知道怎么解决我的问题啊? 这里先谈谈Scheduler,不单关乎框架,更多是一些爬虫通用的思想,希望对大家有帮助。 为什么要有Scheduler 其实Scheduler并非webmagic独创,在scrapy以及其他成熟爬虫中都有类似模块。Scheduler管理了所有待抓取的url,单个爬虫自己是无法控制要抓取什么的,抓什么都由Scheduler决定。 这样子最大的好处就是,爬虫本身没有状态,给一个url,处理一个,非常容易进行水平扩展(就是加线程、或者加机器),而且即使单台爬虫宕机,也不会有什么损失。这跟我们在应用开发中,所说的"服务无状态"的思想是很像的。而相反,如果在单个爬虫线程内部,循环甚至递归的进行抓取,那么这部分工作是无法扩展的,而且宕机之后恢复会很困难。 <!-- lang: java --> public interface Scheduler { public void push(Request request, Task task); public Request poll(Task task); }

WebMagic爬虫实现登陆状态保存

半城伤御伤魂 提交于 2019-12-19 16:46:50
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 由于WebMagic的网络请求是通过Apache HttpClient请求,只需要拿到该对象进行登陆处理,后续的请求再使用同一个HttpClient对象请求,即可实现登陆状态下的请求,登陆相关的cookies不需要自己进行管理,HttpClient会自动处理 查看源码后,发现HttpClient的在HttpClientDownloader中使用 @ThreadSafe public class HttpClientDownloader extends AbstractDownloader { private Logger logger = LoggerFactory.getLogger(this.getClass()); private final Map<String, CloseableHttpClient> httpClients = new HashMap(); private HttpClientGenerator httpClientGenerator = new HttpClientGenerator(); private HttpUriRequestConverter httpUriRequestConverter = new HttpUriRequestConverter(); private

Jsoup代码解读之七-实现一个CSS Selector

情到浓时终转凉″ 提交于 2019-12-12 21:02:31
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 当当当!终于来到了Jsoup的特色:CSS Selector部分。selector也是我写的爬虫框架 webmagic 开发的一个重点。附上一张street fighter的图,希望以后webmagic也能挑战Jsoup! select机制 Jsoup的select包里,类结构如下: 在最开始介绍Jsoup的时候,就已经说过 NodeVisitor 和 Selector 了。 Selector 是select部分的对外facade,而 NodeVisitor 则是遍历树的底层API,CSS Selector也是根据 NodeVisitor 实现的遍历。 Jsoup的select核心是 Evaluator 。Selector所传递的表达式,会经过 QueryParser ,最终编译成一个 Evaluator 。 Evaluator 是一个抽象类,它只有一个方法: <!-- lang: java --> public abstract boolean matches(Element root, Element element); 注意这里传入了root,是为了某些情况下对树进行遍历时用的。 Evaluator的设计简洁明了,所有的Selector表达式单词都会编译到对应的Evaluator。例如 #xx 对应 Id

使用Selenium来抓取动态加载的页面

元气小坏坏 提交于 2019-12-11 11:30:18
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一般的爬虫都是直接使用http协议,下载指定url的html内容,并对内容进行分析和抽取。在我写的爬虫框架 webmagic 里也使用了HttpClient来完成这样的任务。 但是有些页面是通过js以及ajax动态加载的,例如: 花瓣网 。这时如果我们直接分析原始页面的html,是得不到有效的信息的。当然,因为无论怎样动态加载,基础信息总归是包含在初始页面中得,所以我们可以用爬虫代码来模拟js代码,js读取页面元素值,我们也读取页面元素值;js发送ajax,我们就拼凑参数、发送ajax并解析返回的json。这样总归是能做的,但是比较麻烦,有没有比较省力的方法呢?比较好的方法大概是内嵌一个浏览器了。 Selenium 是一个模拟浏览器,进行自动化测试的工具,它提供一组API可以与真实的浏览器内核交互。Selenium是跨语言的,有Java、C#、python等版本,并且支持多种浏览器,chrome、firefox以及IE都支持。 在Java项目中使用Selenium,需要做两件事: 在项目中引入Selenium的Java模块,以Maven为例: <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java<

WebMagic 实现爬虫入门教程

核能气质少年 提交于 2019-12-09 15:35:21
本示例实现某电影网站最新片源名称列表及详情页下载地址的抓取。 webmagic是一个开源的Java垂直爬虫框架,目标是简化爬虫的开发流程,让开发者专注于逻辑功能的开发。 WebMagic 特点: 完全模块化的设计,强大的可扩展性。 核心简单但是涵盖爬虫的全部流程,灵活而强大,也是学习爬虫入门的好材料。 提供丰富的抽取页面API。 无配置,但是可通过POJO+注解形式实现一个爬虫。 支持多线程。 支持分布式。 支持爬取js动态渲染的页面。 无框架依赖,可以灵活的嵌入到项目中去。 示例 本示例实现:https://www.dytt8.net/html/gndy/dyzz/list_23_1.html 电影网站最新片源名称及详情页影片下载链接内容的抓取。 配置Maven依赖 pom.xml配置,这里因为日志文件和spring boot冲突了,所以移除webmagic的日志依赖 log4j12 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0

【java爬虫】利用webmagic框架实战demo

六月ゝ 毕业季﹏ 提交于 2019-12-04 08:21:19
webmagic框架: http://webmagic.io/ WebMagic的结构分为 Downloader 、 PageProcessor 、 Scheduler 、 Pipeline 四大组件 PageProcessor主要分为三个部分,分别是爬虫的配置、页面元素的抽取和链接的发现。 Pipeline 用于保存结果的组件,下面我们实现自定义Pipeline,可以实现保存结果到文件、数据库等一系列功能 很多功能自己进去慢慢研究哈,这里就不一一赘述了。 下面直接进入主题,爬我的博客首页的数据:https://www.cnblogs.com/loaderman/ 查看首页的源码研究一下下: 第一步:maven配置webmagic 详见: http://webmagic.io/docs/zh/posts/ch2-install/with-maven.html 第二步:直接根据文档进行编码实战: 定义实体类 public class LoadermanModel { private String title; private String detailUrl; private String content; private String date; public LoadermanModel() { } public LoadermanModel(String title,

哪个爬虫框架好”简单对比”

匿名 (未验证) 提交于 2019-12-02 23:57:01
  对于爬虫框架本身来说,都是很优秀的,说那个更好,不如说那个更适合公司的业务需求。比如javaweb项目中需要某些网站的金融系列新闻,得每天定时去抓取一些数据,你就可以考虑WebMagic框架,能够轻松的将爬虫代码逻辑模块化到项目中,毫无违和感。当然也可以是别的框架,只要合适就好(以上爬虫框架就不介绍了,真要说说,估计得长篇大论了.....可以查阅相关资料进行详细的了解)。   这些开源的爬虫框架大都是把复杂的问题解决掉,然后封装,在之后就是我们用的很简单、方便,不必考虑那些URL去重、代理、线程池管理等等问题,当然建议 看看源码 , 多想想他们的设计思想以及实现逻辑 。   我们在以前项目中用的爬虫框架是java语言的WebMagic和python语言的PySpider。普通java爬虫项目中都可以多多考虑WebMagic和WebCollector绝对够用(反正用啥都得考虑动态js抓取,图片验证码识别等等那些反爬虫机制,这一定是个持久战,哈哈),上手简单易扩展,注重业务开发就好。如果大型分布式、业务够复杂、需求点够多、数据够庞大下的估计用哪个框架也得进行二次扩展了。所以选那个框架不必那么纠结。   另外搞爬虫不得不推荐python了,易学,语法简单,一个简单的爬虫程序可能半个小时就搞定了。虽然在调试上很费时间,但是当有一定经验了,很多问题就可以规避掉或者bug定位很快

webmagic 爬取网页所有文章的标题时间作者和内容

匿名 (未验证) 提交于 2019-12-02 21:53:32
package com.ij34; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.pipeline.FilePipeline; import us.codecraft.webmagic.processor.PageProcessor; import java.util.List; public class HuxiuTest implements PageProcessor { @Override public void process(Page page) { List<String> requests = page.getHtml().links().regex(".*article.*").all(); page.addTargetRequests(requests); page.putField("标题",page.getHtml().xpath("//div[@class='wrap-left pull-left']//h1/text()")); page.putField("作者", page.getHtml().xpath("//div[

java 爬虫 WebMagic(四)-Scheduler

匿名 (未验证) 提交于 2019-12-02 21:52:03
Scheduler是WebMagic中对url进行管理的组件,它主要有2个功能: 对待抓取的URL队列进行管理。 对已抓取的URL进行去重。 一般使用不需要自定义,WebMagic默认实现了QueueScheduler。 WebMagic内置了几个常用的Scheduler。 所有默认的Scheduler都默认实现了 DuplicateRemover接口,去url进行去重。 如果想要关闭去重的功能能,可以自己实现DuplicateRemover接口,在isDuplicate()方法中返回fasle就行了 public class DonothingDuplicateRemover implements DuplicateRemover { @Override public boolean isDuplicate ( Request request , Task task ) { return false ; } @Override public void resetDuplicateCheck ( Task task ) { } @Override public int getTotalRequestsCount ( Task task ) { return 0 ; } } 来源:博客园 作者: 懒到饿死的猫 链接:https://www.cnblogs.com/yhood/p