# vscrawler **Repository Path**: ythlibo_admin/vscrawler ## Basic Information - **Project Name**: vscrawler - **Description**: 适合抓取封堵的爬虫框架 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 70 - **Created**: 2017-06-15 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # vscrawler vscrawler是一个更加适合抓取的爬虫框架,他不是教科书似的爬虫,准确说他不是爬虫,没有广度优先遍历这些说法,他所面临的网站URL不是网络里面的网络拓扑图而是一个个目标明确的抓取任务。 vscrawler的一个重要特性就是他把下载和解析放在了同一个组件里面,同时他天生支持多用户登录。vscrawler设计的目的是填补webmagic在某些方面的不足,不过vscrawler本身很多思想也参考webmagic,感谢webmagic作者黄大大。 编写vscrawler的契机是本人在抓取企信宝的时候遇到的滑块验证码突破问题,多用户登录问题,复杂流程抽取问题。同时他基于dungproxy作为网络层API,天生接入了代理服务。vscrawler目前还是我花不到两天弄出来的小框架,可能有各种不完善的地方,不过一定会越来越完善的,期待越来越好的明天 ## maven坐标-快照版本 ``` com.virjar vscrawler-core 0.0.1-SNAPSHOT ossrh https://oss.sonatype.org/content/repositories/snapshots ``` ## maven坐标-正式版本 ``` 期待哦 ``` ## vscrawler特点 ||| |---|---| |合并下载组件和解析组件|抓取的时候,不像普通爬虫简单的GET请求便可以得到数据,实际可能寻找复杂的认证流程,还有多网页状态关联问题。抓取和解析是相互关联,多次之后才能拿到数据。所以下载和解析合并,能够最大限度的让用户扩展认证流程| |多用户隔离和登录状态维护|vscrawler包装session概念,session就是一个登录成功的用户,他和其他用户状态完全隔离的,完整支持多用户并发登录和抓取数据| |任务种子抽象打散|vscrawler的种子定义为字符串,而非一个个URL,普通爬虫就是根据URL在网上进行广度优先遍历。但是抓取场景,种子可能就是一个页码,一个关键字,用户+关键字,url+时间戳(实现分时间抓取相同url),产生的新种子也不一定是url,而是关键字等,这样vscrawler的调度,就是一个个目标明确的请求处理序列。不会像webmagic从首页开始爬,抓很久都不能抓到感兴趣的数据| |代理IP池|vscrawler使用dungproxy作为代理池,这是一个免费的代理IP池,拥有免费代理资源,普通封堵完全够用了,dungproxy本身作为代理池方案,可以友好的处理代理需求,如接入其他代理资源等。dungproxy的顺序惩罚容器算法极大的提高了高质量IP可用性| |事件循环|vscrawler实现了事件循环机制,爬虫运行过程,可以方便的,低耦合的接入和定义事件消息,方便的实现功能扩展。(如用户突然密码错误,证明用户不可用,监听这个事件,可以发送消息通知管理者,更改数据库用户状态等;再或者突然爬虫请求都失败了,失败事件频率变高,证明目标网站可能宕机;或者监听爬虫配置文件变化,动态调整爬虫参数。等等。)| |声明式自动注册事件循环|在事件循环机制上面,配合动态代理,实现了接口-实现的事件扩展机制。实现发送者使用接口发送实现,各个接口实现类都能够接收到事件消息,这样扩展点的挂载,定义,卸载,调用都会非常方便了| |热配置|vscrawler的参数,都是基于配置文件动态控制的,这点和webmagic不同,vscrawler可以在爬虫运行过程修改爬虫参数,修改后实时生效,并发送事件到爬虫内部所有感兴趣的组件。这个机制就是基于自动事件机制实现,也是事件循环的一个运用| |表达式自动计算|配置文件中,为了方便,可以配置一个表达式作为数值,比如1个小时配置为:1 * 60 * 60 *1000 ,系统会自动转化为3600000| |动态线程池|当你觉得爬虫抓取太快,导致大量请求失败,或者爬虫抓取比较慢,像加快爬虫速度。在之前,你可能需要停止爬虫,改程序(或者你的设计好一些,通过配置文件读取线程数目)。现在你不需要这样了,你可以直接修改vscralwer的配置文件,配置线程数目,线程池的线程数目就马上变成你配置的数目了| |等等|更多炫酷的功能,欢迎提建议| ## 序 vscrawler为何产生? 其实并不是想抢当前已经存在的爬虫框架的饭碗。不过确实是因为使用当前已经存在的爬虫框架不能解决我所面临的问题,所以才撸一套。 需要申明一点,本人并不想普渡众生,写这个框架的主要目的是使得个人使用顺手,如果你有好的想法或者issue,欢迎提交,但是个人没有义务帮你解决使用上的问题。 这样说也是因为vscrawler的定义在数据抓取而非简单爬虫,vscrawler在框架灵活性和简便性上面多会选择前者,导致vscrawler的使用难度原因高于webmagic,WebCollector等框架。 vscrawler不是入门级的爬虫框架,拒绝菜鸟入坑 以下几种情况会被认为不适合使用本爬虫: - 我的爬虫经常报timeout的异常,什么原因啊? - 如何提交post请求? - html是js产生的,应该怎么爬取啊? - 为什么我下载下来的网页看不到数据,但是浏览器能够看到? - 如何下载图片? - 网页需要登录,应该怎么办? - 抓取遇到验证码,应该怎么办? - 求问大佬,爬网页的时候突然开始抛Socket超时的异常,这是啥情况,是IP被封了吗?用HtmlUnit的getPage打开百度就正常, 打开我要爬得网页就抛Socket超时异常 - 这个title 我该怎么获取? - xpath规则应该怎么写 上面的问题,应该是你能够自己想到答案的,而不需要像他人请教,或者问题太宽泛,其他人也不能回答。这样的表现使用vscrawler应该是很困难的。 ## 参考 - 主架构参考了webmagic,保留了process、pipeline等概念 - 种子管理,参考了WebCollector,使用BerkeleyDB管理URL 完成 - 分布式方案,将会参考elastic-job 计划中 - 抽取器,将会接入 jsoupXpath 计划中 - 多站点爬虫,参考geccocrawler,使用classloader热加载 计划中 对了求一个好的监控框架