<small id='5fKpR2zWF'></small> <noframes id='sGjlxBtI7'>

  • <tfoot id='NqcZfWLSks'></tfoot>

      <legend id='BfJGQ3yK'><style id='P3mB'><dir id='KV3rph'><q id='wkIOo3nZW'></q></dir></style></legend>
      <i id='sXAi5'><tr id='UVPc5'><dt id='hdTa'><q id='kEZ1I3D'><span id='ivAr6S7'><b id='TFyBmkzaJ'><form id='y9Wh23'><ins id='BvuPTLV'></ins><ul id='fRK1oE'></ul><sub id='Wm5f'></sub></form><legend id='RCpDsA'></legend><bdo id='sY1yv'><pre id='D3tTXI'><center id='Eg3yxAS'></center></pre></bdo></b><th id='xqQ4FjUhG'></th></span></q></dt></tr></i><div id='rdoO'><tfoot id='Mo2qQI8x'></tfoot><dl id='pCXe'><fieldset id='t8Kh'></fieldset></dl></div>

          <bdo id='7ZTtkXcD5'></bdo><ul id='CTWhy7dn'></ul>

          1. <li id='JbTegXLi'></li>
            登陆

            章鱼彩票网-Java 多线程爬虫结构 AiPa

            admin 2019-05-14 154人围观 ,发现0个评论

            一款细巧、灵敏的Java多线程爬虫结构(AiPa)爱爬

            1.简介

            AiPa 是一款细巧,灵敏,扩展性高的多线程爬虫结构。

            AiPa 依靠当下最简略的HTML解析器Jsoup。

            AiPa 只需求运用者供给网址调集,即可在多线程下主动爬取,并对一些反常进行处理。

            2.Maven

            直接引进


            cn.yueshutong
            AiPa
            1.0.0.RELEASE

            3.运用

            先来看下一个简略完好的示例程序:

            有必要完结的接口

            public class MyAiPaWorker implements AiPaWorker {
            @Override
            public String run(Document doc, AiPaUtil util) {
            //运用JSOUP进行HTML解析获取想要的div节点和特点
            //保存在数据库或本地文件中
            //新增aiPaUtil东西类能够再次恳求网址
            return doc.title() + doc.body().text();
            }
            @Override
            public Boolean fail(String link) {
            //使命履行失利
            //能够记载失利网址
            //记载日志
            return false;
            }
            }

            Main办法

             public static void main(String[] args) throws InstantiationException, IllegalAccessException, ExecutionException, InterruptedExcep章鱼彩票网-Java 多线程爬虫结构 AiPation {
            //预备网址调集
            List linkList = new ArrayList<>();
            linkList.add("http://jb39.com/jibing/FeiQiZhong265988.htm");
            linkList.add("http://jb39.com/jibing/XiaoErGuoDu262953.htm");
            linkList.add("http://jb39.com/jibing/XinShengErShiFei250章鱼彩票网-Java 多线程爬虫结构 AiPa995.htm");
            linkList.add("http://jb39.com/jibing/GaoYuanFeiShuiZhong260310.htm");
            linkList.add("http://jb39.com/zhengzhuang/LuoYin337449.htm");
            //第一步:新建AiPa实例
            AiPaExecutor aiPaExecutor = AiPa.newInstance(new MyAiPaWorker()).setCharset(Charset.forName("GBK"));
            //第二步:提交使命
            for (int i = 0; i < 10; i++) {
            aiPaExecutor.submit(linkList);
            }
            //第三步:读取回来值
            List futureList = aiPaExecutor.getFutureList();
            for (int i = 0; i < futureList.size(); i++) {
            //get() 办法会堵塞当时线程直到获取回来值
            System.out.println(futureList.get(i).get());
            }
            //第四步:封闭线程池
            aiPaExecutor.shutdown();
            }

            经过AiPa.newInstance()办法直接创立一个新的AiPa实例,该办法有必要要传入 AiPaWorker 接口的完结类。

            3.1 AiPaWorker接口

            AiPaWorker 接口是用户有必要要完结的事务类。

            该接口办法如下:

            public interface AiPaWorker {
            /**
            * 怎么解析爬下来的HTML文档?
            * @param doc JSOUP供给的文档
            * @param util 爬虫东西类
            * @return
            */
            T run(Document doc, AiPaUtil util);
            /**
            * run办法反常则履行fail办法
            * @param link 网址
            * @return
            */
            S fail(String link);
            }

            run()办法是用户自定义处理爬取的HTML内容,一般是运用Jsoup的Document类进行解析,获取节点或特点等,然后保存到数据库或本地文件中。假如在事务办法需求再次恳求章鱼彩票网-Java 多线程爬虫结构 AiPaURL,能够运用东西类Util。

            fail()办法是当run()办法出现反常或爬取网页时反常,屡次处理无效的状况下进入的办法,该办法的参数为此次犯错的网址。一般是对其进行日志记载等操作。

            3.2 解码,最多失利次数,恳求头

            经过AiPa获取实例后,能够直接在后面跟着设置一大堆特点,比方:setCharset、setThreads、setMaxFailCount等,这些特点啥意思,下面以表格的方式阐明一下:

            办法阐明setThreads作业线程数,默许CPU数量+1,你也能够设置CPU*2等等setMaxFailCount最大失利次数,也便是爬网站出现反常,再次爬总共测验多少次,默许5setCharset网页的编码,私房粽刷屏朋友圈碰到乱码设置这个,默许UTF-8setHeader设置恳求头,只承受Map类型,默许nullsetMethod设置恳求办法,默许Method.GETsetTimeout恳求解析的等候时间,默许30秒。setUserAgent设置恳求的UA,默许电脑版。setCookies设置Cookie调集,默许null

            上面的一般状况下够用了,假如对这些不满意章鱼彩票网-Java 多线程爬虫结构 AiPa,嫌太少啥的,下面给了更优异的解决方案。

            3.3 自定义爬虫办法

            在上面的演示程序中,咱们运用了submit()办法进行提交使命,默许是运用了Jsoup+上面的那些非加粗特点进行爬取,一般状况下够用,假如要一个一个的扩展Jsoup的办法太累了,所以我想到把爬虫办法供给给用户重,让用户自己去扩展,想用什么爬,想设置什么特点都能够。

            下面请看运用Demo:

            public class MyAiPaUtil extends AiPaUtil {
            @Override
            public Document getHtmlDocument(String link) throws IOException {
            // 你能够不必JSOUP,能够运用其它办法进行HTTP恳求,但最终需求转为Document格局
            // 你也能够运用Jsoup完结定制特点
            Connection connection = Jsoup.connect(link).method(Connection.Method.GET);
            String body = connection.execute().charset("GBK").body();

            return Jsoup.parse(body);
            }
            }

            然后,再调用submit办法提交使命,代码示例:

            aiPaExecutor.submit(linkList, MyAiPaUtil.class);

            留意:当你重写爬虫办法后,3.2末节的非加粗特点都会失效。

            3.3 读取回来值与获取线程池

            假如你想要读取回来值来看下使命是否履行成功,你能够运用看下上面的程示例序是怎么做的。

            public List getFutureList()

            getFutureList()办法会回来使命履行之后的成果调集,调集中的成员都是Future类。调用Future目标的 get() 办法会等候当时使命履行完结再回来成果值,也便是会堵塞当时线程。该类还有许多办法,比方get(long timeout, TimeUnit unit),设置等候时间等等。

            public ExecutorService getExecutor()

            该办法会回来AiPa当时运用的Executor线程池,你获取到该线程池后,需求一些运用线程池的一些办法能够自行运用。

            3.4 怎么应对爬取网页时的反常

            关于网页爬取时的反常,这真的是个痛点。原因真的许多,你的网络不可,网站服务器的网络不可,在网上有说把恳求头中Connection设置为close,不必keep-alive。这个以我爬取几百兆数据的经历通知你,然并卵。

            所以我想出了一种无赖打法,重复爬。爬一次不可就两次,爬两次不可就三次,只需网页是能够正常呼应的,根本这个战略没多少问题。当然,如果真的是某个网页就那么别出心裁呢,所以咱们设置一个最大值,关于爬取超越最大值的,抛弃记载下来,看看啥子状况。在我的这个结构中,也给出了fail()办法专门处理这个问题。

            4.测验用例

            在Java SE测验中。没有运用数据库等,直接控制台打印是没问题的。

            在Spring Boot中写了个测验用例,爬取数据保存到数据库,运转也没问题。

            @RunWith(SpringRunner.class)
            @SpringBootTest
            public class InterApplicationTests {
            @Autowired
            private DemoResponse demoResponse;
            @Test
            public void context() throws ExecutionException, InterruptedException {
            AiPaExecutor executor = AiPa.newInstance(new AiPaWorker() {
            @Override
            public Boolean run(Document document, AiPaUtil util) {
            String title = document.title();
            demoResponse.save(new DemoEntity(title));
            return true;
            }
            @Override
            public Boolean fail(String s) {
            demoResponse.save(new DemoEntity(s));
            return false;
            }
            }).setCharset(Charset.forName("GBK"));
            List linkList = new ArrayList<>();
            linkList.add("http://jb39.com/jibing/FeiQiZhong265988.htm");
            linkList.add("http://jb39.com/jibing/XiaoErGuoDu262953.htm");
            linkList.add("http://jb39.com/jibing/XinShengErShiFei250995.htm");
            linkList.add("http://jb39.com/jibing/GaoYuanFeiShuiZhong260310.htm");
            linkList.add("http://jb39.com/zhengzhuang/LuoYin337449.htm");
            executor.submit(linkList);
            List list = executor.getFutureList();
            for (int i = 0; i < list.size(); i++) {
            //get() 办法会堵塞当时线程直到获取章鱼彩票网-Java 多线程爬虫结构 AiPa回来值
            System.out.println(list.get(i).get());
            }
            executor.shutdown();
            }
            }

            运转成果:

            Hibernate: insert into demo (title) values (?)
            Hibernate: insert into demo (title) values (?)
            Hibernate: insert into demo (title) values (?)
            Hibernate: insert into demo (title) values (?)
            Hibernate: insert into demo (title) values (?)
            请关注微信公众号
            微信二维码
            不容错过
            Powered By Z-BlogPHP