精华内容
下载资源
问答
  • Java爬虫(二)Java爬虫框架
    千次阅读
    2021-03-01 09:35:05

    关于本文:

    之前写了个Java爬虫(一),拖更了很久,今天终于想着补上Java爬虫二了,今天就粗略水一期,给大家介绍一个比较完善的Java爬虫——WebMagic,而且它的文档写的也很详细,上手非常容易。

    ——野狗菌【希望你能喜欢】

    http://webmagic.io/

    http://webmagic.io/docs/zh/

    这个文档写的十分详细,简单易上手。

    在这个框架里,我比较喜欢的是:

    一、使用Selectable抽取元素

    Selectable相关的抽取元素链式API是WebMagic的一个核心功能。使用Selectable接口,你可以直接完成页面元素的链式抽取,也无需去关心抽取的细节。

    在刚才的例子中可以看到,page.getHtml()返回的是一个Html对象,它实现了Selectable接口。这个接口包含一些重要的方法,我将它分为两类:抽取部分和获取结果部分。

    ec5a6824e2b5cfc3b2bd643b1523e84a.png

    这样在我们想要抓取指定数据时,更加的方便快捷,而无需过多的关心细节问题;

    二、使用Pipeline保存结果

    好了,爬虫编写完成,现在我们可能还有一个问题:我如果想把抓取的结果保存下来,要怎么做呢?WebMagic用于保存结果的组件叫做Pipeline。例如我们通过“控制台输出结果”这件事也是通过一个内置的Pipeline完成的,它叫做ConsolePipeline。那么,我现在想要把结果用Json的格式保存下来,怎么做呢?我只需要将Pipeline的实现换成"JsonFilePipeline"就可以了。

    public static void main(String[] args){

    Spider.create(new GithubRepoPageProcessor())

    //从"https://github.com/code4craft"开始抓

    .addUrl("https://github.com/code4craft")

    .addPipeline(new JsonFilePipeline("D:\\webmagic\\"))

    //开启5个线程抓取

    .thread(5)

    //启动爬虫

    .run();

    }

    这样子下载下来的文件就会保存在D盘的webmagic目录中了;

    三、抓取前端渲染的页面

    爬虫抓取被渲染过的页面源码和我们在浏览器开发者模式里看的源码往往不一样,所以会导致我们抓不到想要的渲染后的页面。

    WebMagic提供两种办法:

    一、利用Selenium,我试过这个,当使用这个的时候,你的电脑会打开浏览器(看你下载的是哪一款驱动),然后执行相应操作(ps:Selenium大家也可以多研究研究,我感觉这个的用途也很广,模拟人的操作使用浏览器,可以用它做一些简单枯燥的重复动作,但是我感觉这个的执行效率比较低);

    二、手动构造URL,直接得到JSON数据(具体可以看WebMagic的文档)

    http://webmagic.io/docs/zh/posts/chx-cases/js-render-page.html

    写在后面:

    WebMagic还有很多功能,大家可以自行阅读它的文档,简单易上手。如果你会用这个框架了,你将是一个灵活的爬虫哈哈哈哈哈~~~~~

    这这里我就不写Demo放上来了,如果大家有不懂的,或者想和我交流学习的,可以私聊我,我会尽我所能的帮助大家,也会和大家交流学习的。

    更多相关内容
  • 一个简约灵活强大的Java爬虫框架。 Features: 1、代码简单易懂,可定制性强 2、简单且易于使用的api 3、支持文件下载、分块抓取 4、请求和相应支持的内容和选项比较丰富
  • Java爬虫框架(20210809123939).pdf
  • JAVA爬虫框架

    万次阅读 2019-08-26 22:41:59
    WebMagic框架 webmagic结构分为Downloader,pageProcessor,Scheduler,pipeline四大组件 并由splider将他们组织起来 这四大组件对应着爬虫生命周期中的下载 处理 管理 和持久化等功能, ...

    WebMagic框架

    webmagic结构分为Downloader,pageProcessor,Scheduler,pipeline四大组件  并由splider将他们组织起来   这四大组件对应着爬虫生命周期中的下载  处理  管理  和持久化等功能,
    

    在这里插入图片描述依赖

      <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web-services</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.7</version>
            </dependency>
    
            <dependency>
                <groupId>us.codecraft</groupId>
                <artifactId>webmagic-core</artifactId>
                <version>0.7.3</version>
            </dependency>
    
    
            <!-- https://mvnrepository.com/artifact/us.codecraft/webmagic-extension -->
            <dependency>
                <groupId>us.codecraft</groupId>
                <artifactId>webmagic-extension</artifactId>
                <version>0.7.3</version>
            </dependency>
    
            <!--布隆过滤器-->
            <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>27.1-jre</version>
            </dependency>
    
         <dependency>
                <groupId>us.codecraft</groupId>
                <artifactId>webmagic-core</artifactId>
                <version>0.7.3</version>
            </dependency>
    

    在这里插入图片描述数据库采用的是springdata JPA
    配置文件

    spring.jpa.database=mysql
    spring.jpa.show-sql=false
    spring.jpa.hibernate.ddl-auto=update
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/movies?serverTimezone=UTC
    spring.datasource.username=root
    spring.datasource.password=123123
    
    

    代码是建立在spring boot之上的 需要开启定时任务
    爬虫主要代码

    
    @Component
    public class JobProcesser implements PageProcessor {
        private String url = "https://search.51job.com/list/090200,000000,0000,38,9,99,JAVA,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=";
    
    
        //解析页面
        @Override
        public void process(Page page) {
            //解析页面 获取招聘信息详情的url地址
            List<Selectable> list = page.getHtml().css("div#resultList div.el").nodes();
    //判断获取到的集合是否为空 如果为空表示这是招聘详情页   如果不为空表示这是列表页
            if (list.size() == 0) {
    //            如果为空  表示这是招聘详情页 解析页面获取招聘信息 保存数据
    
                this.saveJobInfo(page);
            } else {
    //   如果不为空   解析详情页的url地址 放到任务队列中
                    for (Selectable selectable:list){
                        String jobInfoUrl = selectable.links().toString();
                        page.addTargetRequest(jobInfoUrl);   //把获取到的url地址放到任务队列中
                    }
    //                获取下一页的url
                String bkurl = page.getHtml().css("div.p_in li.bk").nodes().get(1).links().toString();
    //            把url放到任务队列中
                page.addTargetRequest(bkurl);
            }
    
    
        }
    
        //解析页面获取招聘信息 保存数据
        private void saveJobInfo(Page page) {
    //        创建对象
            Job job = new Job();
    
    
    //        解析页面
            Html html = page.getHtml();
    
    //        获取数据
            job.setCompanyName(String.valueOf(html.css("div.cn p.cname a","text")));
            job.setCompanyAddr(Jsoup.parse(html.css("div.bmsg").nodes().get(1).toString()).text() );
            job.setCompanyInfo(Jsoup.parse(html.css("div.tmsg").toString()).text());
            job.setJobName(html.css("div.cn h1","text").toString());
            job.setJobAddr(html.css("div.cn p.msg","title").toString());
            job.setJobInfo(Jsoup.parse(html.css("div.job_msg").toString()).text());
            job.setUrl(page.getUrl().toString());
            job.setSalaryMax(Jsoup.parse(html.css("div.cn strong").toString()).text());
            job.setSalaryMin("");
            String time = html.css("div.cn p.msg","title").toString();
            job.setTime(time.substring(time.length()-8));
    //        把结果保存起来
            page.putField("jobinfo",job);
    
        }
    
        private Site site = Site.me()
                .setCharset("gbk")
                .setTimeOut(10 * 1000)  //超时时间
                .setRetrySleepTime(3000)
                .setRetryTimes(3);
    
        @Override
        public Site getSite() {
            return site;
        }
    @Autowired
    SpringDataPipeline springDataPipeline;
        //  initialDelay 当任务启动后  等多久执行方法
    //    fixedDelay   每隔多久执行一次
        @Scheduled(initialDelay = 1000, fixedDelay = 100 * 1000)
        public void process() {
            Spider.create(new JobProcesser())
                    .addUrl(url)
                    .setScheduler(new QueueScheduler().setDuplicateRemover(new BloomFilterDuplicateRemover(100000)))
                    .thread(10)
                    .addPipeline(springDataPipeline)
                    .run();
    
    
        }
    }
    

    其他代码就是对数据库的增删查改了

    展开全文
  • java爬虫框架的使用

    2021-03-01 09:35:10
    原标题:java爬虫框架的使用 随着互联网的发展,编程程序语言也开始被越来越多的人所掌握,但是自始至终,java语言一直是被使用范围最广的编程语言。今天,武汉中软国际主要给大家讲解的是java语言中的爬虫java框架...

    原标题:java爬虫框架的使用

    9ae02b6db84472c42a71bd4c76acbbb3.png

    随着互联网的发展,编程程序语言也开始被越来越多的人所掌握,但是自始至终,java语言一直是被使用范围最广的编程语言。今天,武汉中软国际主要给大家讲解的是java语言中的爬虫java框架结构是怎么使用和编写的。

    消息的设计

    在消息队列中,消息一共有四种类型。分别是url,page,result和自定义类型。在worker的程序中,可以通过messagequeue的四种方法(sendUrl, sendPage, sendResult, send)来插入消息。worker的downloader会处理url消息,processor会处理page消息,saver会处理result消息,freeman会处理所有的自定义的消息。我们所要做的工作,就是实现好worker中的这四个函数。

    Worker接口的设计

    JLiteSpider将整个的爬虫抓取流程抽象成四个部分,由四个接口来定义。分别是downloader,processor,saver和freeman。它们分别处理上述提到的四种消息。

    你所需要做的是,实现这个接口,并将想要抓取的url链表返回。具体的实现细节,可以由你高度定制。

    1. Downloader:

    这部分实现的是页面下载的任务,将想要抓取的url链表,转化(下载后存储)为相应的页面数据链表。

    接口设计如下:

    public interface Downloader {

    /**

    * 下载url所指定的页面。

    * @param url

    * 收到的由消息队列传过来的消息

    * @param mQueue

    * 提供把消息发送到各个消息队列的方法

    * @throws IOException

    */

    public void download(Object url, Map mQueue) throws IOException;

    }

    你同样可以实现这个接口,具体的实现可由你自由定制,只要实现 download 函数。 url 是消息队列推送过来的消息,里面不一定是一条 url ,具体是什么内容,是由你当初传入消息队列时决定的。 mQueue 提供了消息发送到各个消息队列的方法,通过 mQueue.get("...") 选取消息队列,然后执行messagequeue的四种方法(sendUrl, sendPage, sendResult, send)来插入消息。

    2. Processor:

    Processor 是解析器的接口,这里会从网页的原始文件中提取出有用的信息。

    接口设计:

    public interface Processor{

    /**

    * 处理下载下来的页面源代码

    * @param page

    * 消息队列推送过来的页面源代码数据消息

    * @param mQueue

    * 提供把消息发送到各个消息队列的方法

    * @throws IOException

    */

    public void process(Object page, Map mQueue) throws IOException;

    }

    实现这个接口,完成对页面源码的解析处理。 page 是由消息队列推送过来的消息,具体格式同样是由你在传入时决定好的。 mQueue 使用同上。

    3. Saver:

    Saver 实现的是对解析得到结果的处理,可以将你解析后得到的数据存入数据库,文件等等。或者将url重新存入消息队列,实现迭代抓取。

    接口的设计:

    public interface Saver {

    /**

    * 处理最终解析得到的结果

    * @param result

    * 消息队列推送过来的结果消息

    * @param mQueue

    * 提供把消息发送到各个消息队列的方法

    * @throws IOException

    */

    public void save(Object result, Map mQueue) throws IOException;

    }

    通过实现这个接口,可以完成对结果的处理。你同样可以实现这个接口,具体的实现可由你自由定制,只要实现 download 函数。 result 是消息队列推送过来的结果消息,具体的格式是由你当初传入消息队列时决定的。 mQueue 的使用同上。

    4. Freeman:

    通过上述的三个流程,可以实现爬虫抓取的一个正常流程。但是 jlitespider 同样提供了自定义的功能,你可以完善,加强,改进甚至颠覆上述的抓取流程。 freeman就是一个处理自定义消息格式的接口,实现它就可以定义自己的格式,以至于定义自己的流程。

    接口的设计:

    public interface Freeman {

    /**

    * 自定义的处理函数

    * @param key

    * key为自定义的消息标记

    * @param msg

    * 消息队列推送的消息

    * @param mQueue

    * 提供把消息发送到各个消息队列的方法

    * @throws IOException

    */

    public void doSomeThing(String key, Object msg, Map mQueue) throws IOException;

    }

    通过实现 doSomeThing 函数,你就可以处理来自消息队列的自定义消息。 key 为消息的标记, msg 为消息的内容。同样,通过 mQueue 的 send 方法,可以实现向消息队列发送自定义消息的操作。(需要注意,自定义的消息标记不能为: url , page, result 。否则会被认为是 jlitespider 的保留消息,也就是由上述的三个接口函数来处理。)

    总结说明

    jlitespider 的设计可能会让您有些疑惑,不过等您熟悉这一整套的设计之后,您就会发现 jlitespider 是多么的灵活和易于使用。

    责任编辑:

    展开全文
  • SeimiCrawler是一个敏捷的,独立部署的,支持分布式的Java爬虫框架,希望能在最大程度上减少新手开发一个替代高且性能不差的爬虫系统的门生物学,以及提高开发爬虫系统的开发效率。在设计思想上SeimiCrawler受Python...
  • 点击关注公众号,利用碎片时间学习介绍平台以流程图的方式定义爬虫,是一个高度灵活可配置的爬虫平台特性支持Xpath/JsonPath/css选择器/正则提取/混搭提取支持JSON/XML/二...

    点击关注公众号,利用碎片时间学习

    介绍

    平台以流程图的方式定义爬虫,是一个高度灵活可配置的爬虫平台

    特性

    • 支持Xpath/JsonPath/css选择器/正则提取/混搭提取

    • 支持JSON/XML/二进制格式

    • 支持多数据源、SQL select/selectInt/selectOne/insert/update/delete

    • 支持爬取JS动态渲染(或ajax)的页面

    • 支持代理

    • 支持自动保存至数据库/文件

    • 常用字符串、日期、文件、加解密等函数

    • 支持插件扩展(自定义执行器,自定义方法)

    • 任务监控,任务日志

    • 支持HTTP接口

    • 支持Cookie自动管理

    • 支持自定义函数

    插件

    • Selenium插件

    • Redis插件

    • OSS插件

    • Mongodb插件

    • IP代理池插件

    • OCR识别插件

    • 电子邮箱插件

    项目部分截图

    爬虫列表

    9e6adeb56085a35e6edc3cccecd7f23a.png

    爬虫测试7798170a7bc501a36ccb3cd473388455.gif

    Debug

    bc7677df507fb4bb2c06b8e189957466.png

    日志

    a7f7b06f40219203d2fdd6bf4748940c.png

    免责声明

    请勿将spider-flow应用到任何可能会违反法律规定和道德约束的工作中,请友善使用spider-flow,遵守蜘蛛协议,不要将spider-flow用于任何非法用途。

    如您选择使用spider-flow即代表您遵守此协议,作者不承担任何由于您违反此协议带来任何的法律风险和损失,一切后果由您承担。

    开源地址

    https://gitee.com/ssssssss-team/spider-flow

    官网:

    https://www.spiderflow.org/

    推荐:

    主流Java进阶技术(学习资料分享)

    e0c3941d364db787aac093cc887293eb.png

    PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!

    展开全文
  • Java爬虫框架WebMagic

    千次阅读 2020-06-10 15:28:44
    WebMagic的架构设计参照了Scrapy,而实现则应用了HttpClient、Jsoup等Java成熟的工具。 WebMagic由四个组件(Downloader、PageProcessor、Scheduler、Pipeline)构成: Downloader : 下载器 PageProcessor: 页面解析...
  • 关注Java核心技术,推送更多 Java 干货!介绍平台以流程图的方式定义爬虫,是一个高度灵活可配置的爬虫平台特性支持Xpath/JsonPath/css选择器/正则提取/混搭提取支持JS...
  • 新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。平台以流程图的方式定义爬虫,是一个高度灵活可配置的爬虫平台。
  • Java爬虫框架集合含6套源码(基于webmagic的 Java 爬虫应用;新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫;易用的轻量化网络爬虫;Java给爬虫使用的代理IP池;基于springboot构建;Java爬虫...
  • 查了下Java下的爬虫框架自然也不在少数,Nutch,WebMagic,WebCollector,这三个绝对是够用了,爬一般的网站不在话下,至于遇到那些爬取频次限制,前端JS渲染(AngularJS),各种识别码之类的这都都是爬虫的老问题了,...
  • java爬虫框架—WebMagic

    2020-02-23 22:31:10
    什么是网络爬虫 从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分。爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的...
  • java开源爬虫框架

    2016-03-14 12:20:35
    需要maven构建 建议使用idea
  • Java爬虫框架.pdf

    2021-09-30 17:34:47
    Java爬虫框架.pdf
  • 今天我们一起了解一下什么是爬虫,java爬虫框架有哪些。 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些...
  • 主要介绍了分享一个简单的java爬虫框架,具有一定参考价值,需要的朋友可以了解下。
  • 简单介绍一些java爬虫框架

    千次阅读 2020-01-28 18:22:45
    JsoupXpath 官方文档:http://jsoupxpath.wanghaomiao.cn/ githup:https://github.com/zhegexiaohuozi/JsoupXpath maven: <dependency> <groupId>cn.wanghaomiao<...artifactI...
  • SeimiCrawler是一个敏捷的,支持分布式的Java爬虫开发框架,希望能在最大程度上降低新手开发一个可用性高且性能不差的爬虫系统的门槛,以及提升开发爬虫系统的开发效率。在SeimiCrawler的世界里,绝大多数人只需...
  • SeimiCrawler是一个敏捷的,独立部署的,支持分布式的Java爬虫框架,希望能在最大程度上降低新手开发一个可用性高且性能不差的爬虫系统的门槛,以及提升开发爬虫系统的开发效率。在SeimiCrawler的世界里,绝大多数人...
  • 一想到做爬虫大家第一个想到的语言一定是python,...各类JAVA爬虫框架 Python中大的爬虫框架有scrapy(风格类似django),pyspider(国产python爬虫框架)。 除了Python,Java中也有许多爬虫框架。 nutch apache下的
  • 豆瓣文学小说的爬虫框架用到了Quartz和线程池,爬虫则是HttpClient和Jsoup 启动类方法:QuartzMaster.runIt(String task,int task_count,String crawler,int thread_count,String cron); task:任务模型 task_count...
  • 一个基于webmagic框架二次开发的java爬虫框架实战,已实现能爬取腾讯,搜狐,今日头条(单独集成功能)等资讯内容,配合elasticsearch框架用法,实现了自动爬虫,已投入线上生产使用
  • WebMagic是一个简单灵活的Java爬虫框架。基于WebMagic,你可以快速开发出一个高效、易维护的爬虫
  • 这是一个轻量级的分布式java爬虫框架特点这是一个强大,但又轻量级的分布式爬虫框架。jlitespider天生具有分布式的特点,各个worker之间需要通过一个或者多个消息队列来连接。消息队列我的选择是rabbitmq。worker和...
  • Java爬虫框架

    2019-07-22 12:10:58
    待研究! http://www.geccocrawler.com/ http://webmagic.io/
  • 各类JAVA爬虫框架 Python中大的爬虫框架有scrapy(风格类似django),pyspider(国产python爬虫框架)。 除了Python,Java中也有许多爬虫框架。 nutch apache下的开源爬虫程序,功能丰富,文档完整,有数据抓取...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,071
精华内容 13,228
关键字:

java爬虫框架

java 订阅
友情链接: ps2_agreement.zip