好久没写博客了,前阵子项目忙着上线,现在有点空闲,就把最近写的一个爬虫和大家分享下,统计结果放在了自己买的阿里云服务器上(点此查看效果),效果如下:

$58[OTE1@`3PLB0D2FTZME3

 

 

 

     程序是在工作之余写的,用了java 的webmgic 框架,这是国内黄亿华大师的作品,框架的核心思想借鉴了python 的scrapy 爬虫。之前也有用scrapy 抓取过一些数据,但这次想尝试下新的东西,结果很赞。

 

     简单来说,webmgic  和scrapy 的 核心分布在4个部分:

  • Downloader:下载器,一心一意从给的的url中下载网页。
  • PageProcessor:页面分析器,负责页面分析,并提取链接。
  • Scheduler:调度器,从事url  管理,从PageProcessor 获取url,然后把它交给Downloader 下载。
  • Pipeline:管道,负责将分析后的内容保存起来,mysql  或者文件中。

    

     框架的整个架构很清晰,另外还有就是webmagic 的一大特色,就是框架使用了Ioc的思想,提供了注解的功能,结合mybatis  框架,及其方便的的实现了PageProcessor 和Pipeline这两部分。

   

      如果从网页中通过正则或者xpath 提取数据不需要经过二次处理,则我们可以用很少的代码量便可将数据插入数据库,当然如果要将数据加工处理完再放入数据库的话,就要自己写个PageProcessor。

 

     在写这个程序的时候,踩过一些坑,这里简单说一下。

      1、在使用scheduler的时候,webmagic  支持提供了RedisScheduler和FileCacheQueueScheduler,我选择了前者,默认只支持使用一个数据库,后面稍微拓展了下,允许通过传入 index 来指定redis中数据库,这样就可以实现多个爬虫同时实用redis 中不同的数据库了。

      2、阿里云安装redis 时候,一开始没有到redis.conf中设置daemonize  为yes  ,导致在shell  中启动redis  卡死了好些次。

      3、爬虫爬了半天后,先后出现这两个错,

1
2
1.WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
2.WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

      解决方案是:

问题一: echo “vm.overcommit_memory=1” > /etc/sysctl.conf 或 vi /etcsysctl.conf , 然后reboot重启机器

问题二:echo 511 > /proc/sys/net/core/somaxconn

 

      4、关于登陆的问题,在浏览器端登陆后,把cookie  复制出来放到请求里就好,另外自己参考这网上的一些示例写了一个简单的模拟登陆的小程序,支持一些没有用js动态控制和生产token的网站,实现了登陆后把cookie 写入配置文件。

1
2
3
4
5
6
7
private Site site = Site.me().setCycleRetryTimes(5).setRetryTimes(5).setSleepTime(300).setTimeOut(3 * 60 * 1000)
            .setUserAgent(
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31")
                    .setCharset("UTF-8")
                    .addCookie("_xsrf", "cf81e98c4f3b9ea548e9df87a4e5a320")
                    .addCookie("_za", "8d9d4056-20d8-4d22-bdf7-e88443560b4e")
                    .addCookie("z_c0", "QUFDQVBrOGlBQUFYQUFBQVlRSlZUYUQ2dGxiSGozdE42SnNlbzg0U2o2WGk5RDZ2Yi1VWUd3PT0=|1452240288|066af60adedc1989e42f55733738e2738a00c2ed") ;

      5、其实写这程序的时候是希望实现通过web 的方式来控制启用和停止爬虫的,中间试过延迟加载bean ,来实现web 控制爬虫启动,但不知咋停止。后面听朋友说,公司一般都是通过脚本来控制爬虫,事实我也是把爬虫丢在linux 上,用脚本控制的,于是乎就觉得这需求没有多大必要,就木有折腾了。嗯,如果非得做出功能的话,大概也是在web程序里面实现脚本调用这样功能吧。

      最后总结下,写这个爬虫还是蛮有乐趣的。从写爬虫,后面买阿里云的服务器,安装nginx,mysql,redis,git,然后用自己在公司学到的spring-boot+mybatis这一套,配合着百度echart,简单整合了下,做出了点能让人看到东西,学到不少。

   
      最后贴上程序在github 上的 地址 https://github.com/QiuMing/zhihuWebSpider

      简单的的模拟的登陆程序,可以保存cookie 到配置文件  https://github.com/QiuMing/SimulateLogin

posted @ 2016-01-20 22:32 兰幽 阅读(2193) 评论(0) 推荐(1) 编辑
摘要: 关org.apache.velocity.exception.ResourceNotFoundException的bug.maven项目资源文件要放在resource文件夹子下 阅读全文
posted @ 2015-08-05 21:22 兰幽 阅读(1574) 评论(0) 推荐(0) 编辑
摘要: 开发中遇到无法启动mysql服务 错误1067:进程意外中止的bug,以及解决方案 阅读全文
posted @ 2015-08-05 20:53 兰幽 阅读(13979) 评论(0) 推荐(0) 编辑
摘要: shiro控制登陆成功后跳回之前的页面以及所遇到的bug 阅读全文
posted @ 2015-07-26 23:18 兰幽 阅读(6924) 评论(0) 推荐(0) 编辑
摘要: 这篇文章主要记录了springboot以xml方式整合shiro的一些步骤,以及springboot加载xml配置文件的过程。 阅读全文
posted @ 2015-07-26 21:23 兰幽 阅读(9007) 评论(2) 推荐(2) 编辑
摘要: 通过控制鼠标来实现屏幕广播的功能 阅读全文
posted @ 2014-12-15 10:42 兰幽 阅读(1604) 评论(0) 推荐(2) 编辑
摘要: 这是一个用java中robot类实现的简单的屏幕共享程序。 阅读全文
posted @ 2014-12-08 03:19 兰幽 阅读(8864) 评论(1) 推荐(6) 编辑
摘要: 近在做一个软工的屏幕监控软件,已经实现了屏幕图片的传输,但是没有图片。用了MouseInfo类中的getPointerInfo()方法获取鼠标位置。 阅读全文
posted @ 2014-11-19 20:32 兰幽 阅读(2318) 评论(0) 推荐(0) 编辑
摘要: 本文讲述3个线程通信实例:1、银行存款与提款多线程实现,使用Lock锁和条件Condition。 附加 : 用监视器进行线程间通信2、生产者消费者实现,使用LinkedList自写缓冲区。 3、多线程之阻塞队列学习,用阻塞队列快速实现生产者消费者模型。 附加:用布尔变量关闭线程 阅读全文
posted @ 2014-09-08 12:38 兰幽 阅读(1739) 评论(0) 推荐(1) 编辑
摘要: 本文主要讲述Java线程基本概念,讲到线程实现方法,线程池,以及线程运行时间统计 阅读全文
posted @ 2014-09-06 16:48 兰幽 阅读(6310) 评论(1) 推荐(0) 编辑
点击右上角即可分享
微信分享提示