本来我觉得这个组件应该叫做session,但是Processor章节介绍过CrawlerSession,所以就讲讲SessionPool吧。顾名思义,SessionPool就是一个session资源池,所以sessionPool本身没有用户可定制的地方的。但是她有许多的参数:

                .setSessionPoolCoreSize(15)// 核心15个用户
                .setSessionPoolMaxSize(55)// 最多55个用户
                .setSessionPoolReuseDuration(60 * 1000)// 每个用户1分钟之内不能同时使用
                .setSessionPoolMaxOnlineDuration(10 * 60 * 1000)// 每个用户最多存活10分钟

这些就是session几个核心控制点,用来确定并发数量,sessionPool是VS可以完美支持多用户并发登录抓取的根本

和seesion相关的其他知识还有

CrawlerHttpClientGenerator

这是一个扩展点,用来定制你的httpclient,你可以通过他来设置你的httpclient的任何参数,因为这个接口给你传递的参数就是一个httpclientBuilder

public interface CrawlerHttpClientGenerator {
    /**
     * 构建一个httpclient,请注意必须使用ProxyFeedBackDecorateHttpClientBuilder构造httpclient,否则代理自动打分功能不会生效
     * ProxyFeedBackDecorateHttpClientBuilder产生的httpclient会自动拦截请求动作,并根据异常情况对IP进行打分
     *
     * @param crawlerHttpClientBuilder httpclient构建器
     * @return 适合爬虫的httpclient对象
     */
    CrawlerHttpClient gen(CrawlerHttpClientBuilder crawlerHttpClientBuilder);
}

然后你可能要问了,我自己创建一个HttpClientBuilder不行么。答案是不行,因为VS对这个HttpClientBuilder做了定制,为了自动的实现代理IP使用评分。

autoLoginPlugin

你可以设置所有session在创建的时候,进行登录,如果登录不成功,则标记该session无效。这个功能在VS中是以插件的形式实现的。为啥要做成插件,以及如何为VS写插件。请后续参见VS事件循环相关文档。

如果要登录,那么问题来了,VS怎么知道如何登录,账号密码又是啥。所以这里引出两个接口分别是:LoginHandler,UserResourceFacade。其中LoginHandler里面可以书写登录逻辑,UserResourceFacade则负责倒入用户账户信息

LoginHandler签名如下

public interface LoginHandler {
    /**
     * 登录
     * 
     * @param user 账户信息
     * @param cookieStore 对应cookieStore,登录成功后需要把cookie写到cookieStore
     * @param crawlerHttpClient 这个httpclient持有cookieStore,可以用它方便的登录
     * @return 是否登录
     */
    boolean onLogin(User user, CookieStore cookieStore, CrawlerHttpClient crawlerHttpClient);

    /**
     * 如果长时间没有抓取,测试一下当前账户时候仍然处于登录状态
     * 
     * @param cookieStore
     * @param crawlerHttpClient
     * @return
     */
    boolean testLogin(CookieStore cookieStore, CrawlerHttpClient crawlerHttpClient);

    // TODO
    void logout(User user, CookieStore cookieStore, CrawlerHttpClient crawlerHttpClient);
}

UserResourceFacade签名如下:

public interface UserResourceFacade {
    Collection<User> importUser();
}

其中VS有一个默认的用户倒入实现,叫做DefaultUserResource,默认有两种策略 1.如果vsCrawler配置文件配置了用户数据,那么加载配置文件中的用户数据,且会实时load新增用户数据;2.如果vsCrawler中没有配置用户数据,那么mock用户数据,产生用户名密码均为空的账户信息。你只需要在爬虫控制文件中添加帐户相关配置,就会自动导入账号数据到VS中

userResource.userInfo=account,password;acount2,password2

随时获得Session对象

在VS的设计理念中,Processor即包括download的步骤,但是为了兼容某些其他爬虫框架用法,VS的扩展中,存在将下载和解析分开的封装。常见的就是AutoParseSeedProcessor,或者说VS有计划桥接webmagic。这个时候如果还想再解析的时候访问网络应该怎么办?因为接口就没有传递downloader对象啊。

我对你们很好,专门考虑了这点儿,你只需要调用方com.virjar.vscrawler.core.util.VSCrawlerCommonUtil\#crawlerSessionInThread 就可以拿到session对象,他是一个静态方法,不需要做什么初始化动作,而且就是绑定再对应的processor上面的。本功能基于ThreadLocal实现,如果你感兴趣,请百度ThreadLocal

results matching ""

    No results matching ""