boy project

/ Webmagic / 没有评论 / 42浏览

webmagic项目的一个山寨版,供于学习。

模块

对比webmagic

例子

github个人面板Popular repositories信息获取:

processor

/**
 * GithubProcessor主要用于爬取个人Popular repositories
 * GithubRepositoryProcessor主要用于爬取repositories
 *
 * 首先从https://github.com/xuanbo找到Popular repositories的url
 * 然后Popular repositories的url进一步解析repositories(暂时只取title,readme)
 *
 * @author xuan
 * @since 1.0.0
 */
public class GithubProcessor extends AbstractProcessor {

    private static final Logger LOG = LoggerFactory.getLogger(GithubProcessor.class);

    @Override
    protected void doParse(Response response) {
        // 获取links
        List<String> links = Selector.jsoup(response)
                .select(".text-bold")
                .eachAttr("href");
        LOG.info("links: {}", links);

        // 供下次爬取
        next(links, new GithubRepositoryProcessor(), Collections.emptyMap());
    }

}

public class GithubRepositoryProcessor extends AbstractProcessor {

    @Override
    protected void doParse(Response response) {
        Document document = Selector.jsoup(response);
        String title = document.title();
        String readme = document.select("#readme").html();

        // 数据
        Item item = Item.of()
                .put("title", title)
                .put("readme", readme);
        setItem(item);
    }

}

run

public class GithubProcessorTest {

    @Test
    public void run() {
        Spider.create(new GithubProcessor())
                .domain("github.com")
                .addTargetUrl("https://github.com/xuanbo")
                .addPipeline(new TextPipeline("D:\\developer\\Code\\boy\\github.txt"))
                .addPipeline(new ConsolePipeline())
                .thread(5)
                .retry(1)
                .sleep(500)
                .run();
    }

}

基于redis分布式

只需要替换默认的QueueScheduler即可。

public class GithubProcessorTest {

    @Test
    public void run() {
        // Redis Scheduler
        RedisClient client = RedisClient.create("redis://localhost/");
        RedisListScheduler scheduler = new RedisListScheduler(client);

        Spider.create(new GithubProcessor())
                .domain("github.com")
                .addTargetUrl("https://github.com/xuanbo")
                .addPipeline(new TextPipeline("D:\\developer\\Code\\boy\\github.txt"))
                // 采用RedisListScheduler替换默认的QueueScheduler
                .setScheduler(scheduler)
                .thread(5)
                .retry(1)
                .sleep(500)
                .run();
    }

}

基于redis的set去除重复url、list存储待处理url。其中缓存前缀为:boy:allboy:queue

why boy project?

在编写爬虫时,就拿获取商品而言,我们肯定不是漫无目的的爬取网页。

而是有一些目的:

在使用过Python的scrapy、pyspider,Java的webmagic爬虫框架,发现scrapy、webmagic均对所有url统一处理。 需要在解析逻辑中去判断是商品信息url还是详情页url,然后编写不同的解析逻辑。

相反pyspider则通过callback完美的解决了这个问题。

因此,有了boy项目。

github地址

boy