码迷,mamicode.com
首页 > 编程语言 > 详细

分页爬虫线程模型

时间:2015-08-08 13:41:08      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:

11个主线程+1个列表线程+N个明细线程

对要爬取的网站数据,基本是采用分页的形式展现,通过遍历列表解析明细URL,进而爬取明细页面内容;

每个网站一个处理线程,爬取列表和爬取明细采用单独的子线程,列表爬取线程相当于生成者,分页一般在几十条,有些网站可在请求中指定分页大小参数可达百条一页,生产速度足够消费,单线程爬取解析列表,往无界阻塞队列存待爬的明细url,根据带宽(避免IO超时)和服务器性能(500响应码)配置N个明细爬取线程作为消费者,对爬取内容进行解析,缓存解析后实体对象,达到一定量时批量持久化。列表单线程生产速度可控,看过几个开源框架列表和明细的url是在同一个队列,那就会有优先级问题,队列中同时有列表和明细时需要明细先爬,未区分列表和明细,每个线程既处理列表又处理明细,何时停止爬取是个麻烦问题,队列中没有可用url并不代表爬完,可能有某个线程还在爬一个列表呢。

2、爬完一个网站需要记录爬取情况日志信息,比如新增记录数、修改记录数、服务端异常次数(异常太多可减少明细线程数)、IO异常次数(异常太多可减少明细线程数)、开始时间、结束时间、异常信息等;

3、多个网站同时爬取时在外面套一层,3层线程结构,第一层里启动各源线程,第二层里启动列表和明细;

run()
{
    for(int i=0;i<x;i++)new Thread(new PullXXX()).start();
}

AbstractPull implements Runnable
{
    PullList   implements Runnable{};

    PullDetail implements Runnable{};

    run()
    {
        new Thread(new PullList()).start();

        for(int i=0;i<N;i++)
        {
            new Thread(new PullDetail()).start();
        }

        CountDownLatch.await();
        log();
    }
}


分页爬虫线程模型

标签:

原文地址:http://my.oschina.net/h2do/blog/489470

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!