java知乎爬虫
好久没写博客了,前阵子项目忙着上线,现在有点空闲,就把最近写的一个爬虫和大家分享下,统计结果放在了自己买的阿里云服务器上(点此查看效果),效果如下:
程序是在工作之余写的,用了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.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 写入配置文件。
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
java知乎爬虫的更多相关文章
- 【转】零基础写Java知乎爬虫之进阶篇
转自:脚本之家 说到爬虫,使用Java本身自带的URLConnection可以实现一些基本的抓取页面的功能,但是对于一些比较高级的功能,比如重定向的处理,HTML标记的去除,仅仅使用URLConnec ...
- Java豆瓣电影爬虫——抓取电影详情和电影短评数据
一直想做个这样的爬虫:定制自己的种子,爬取想要的数据,做点力所能及的小分析.正好,这段时间宝宝出生,一边陪宝宝和宝妈,一边把自己做的这个豆瓣电影爬虫的数据采集部分跑起来.现在做一个概要的介绍和演示. ...
- Java开发搜索引擎爬虫
package com.peidon.html; import java.io.BufferedReader; import java.io.File; import java.io.FileOutp ...
- Java知多少(完结篇)
Java知多少(1)语言概述 Java知多少(2)虚拟机(JVM)以及跨平台原理 Java知多少(3) 就业方向 Java知多少(4)J2SE.J2EE.J2ME的区别 Java知多少(5) Java ...
- Java知多少(完结)
系列文章: Java知多少(上) Java知多少(中) Java知多少(下)
- Java知多少(下)
Java知多少(78)Java向量(Vector)及其应用 Java知多少(79)哈希表及其应用 Java知多少(80)图形界面设计基础 Java知多少(81)框架窗口基础 Java知多少(82)标签 ...
- Java知多少(112)数据库之删除记录
删除数据表也有3种方案 一.使用Statement对象 删除数据表记录的SQL语句的语法是: delete from 表名 where 特定条件 例如 : delete from ksInfo whe ...
- Java知多少(111)数据库之修改记录
修改数据表记录也有3种方案. 一.使用Statement对象 实现修改数据表记录的SQL语句的语法是: update表名 set 字段名1 = 字段值1,字段名2 = 字段值2,……where特 ...
- Java知多少(110)数据库之插入记录
插入数据表记录有3种方案 一.使用Statement对象 实现插入数据表记录的SQL语句的语法是: insert into 表名(字段名1,字段名2,……)value (字段值1,字段值2,……) 例 ...
随机推荐
- 免安装版MySQL8数据库的安装
[环境准备] PC版本:Windows10企业版.64位操作系统 数据库:MySQL8.0.12-win64.zip免安装版 [彻底卸载已安装的MySQL数据库] 由于系统中MySQL数据库的卸载不彻 ...
- mariadb或者mysql忘记root密码
windows======================net stop mysql #先停止mysql或者在服务管理里面停止 直接打开Windows的命令行(CMD)窗口(以管理员身份运行),输入 ...
- JavaSE环境下的shiro(源自腾讯课堂)
Shiro作用: 认证(登录).授权(鉴权).加密(用户名/密码加密).会话管理(session).Web集成.缓存 apache官网可以下载 图一 图二 图三 图一 .二是配置文件内容,对于图三的: ...
- UIPickerView的简单使用
UIPickerView是一个选择器它可以生成单列的选择器,也可生成多列的选择器,而且开发者完全可以自定义选择项的外观,因此用法非常灵活,使用也比较简单.下面做了一个关于天气预报的小Demo 用 UI ...
- tp5.1路由报错No input file specified.
问题: 按照官方教安装了框架,打开首页没问题,可是安装教程路由规则打开 "http://127.0.0.1/hello/2" 时, 却报错误 "No input fil ...
- mysql的length与char_length的区别
length: 是计算字段的长度一个汉字是算三个字符,一个数字或字母算一个字符 char_length:不管汉字还是数字或者是字母都算是一个字符 同时这两个函数,可用于判断数据中是否有中文文字 例 ...
- C# IL DASM 使用-破解c#软件方法
IL DASM反编译工具 使用C#的猿人或多或少都会对微软的IL反编译工具(ildasm.exe)有所认识.我最早接触到这工具是公司同事使用他反编译exe程序,进行研读和修改.感觉他还是很强大. IL ...
- 基于Geomesa服务查询轨迹数据无法根据空间和时间范围进行结果查询
一.Geomesa - QuickStart(教程工程包) 百度网盘下载地址:geomesa-tutorials-master.7z 二.解压后,IDEA编译如下 百度网盘下载地址:IDEA201 ...
- 对QP中RTC的理解
1.概念 RTC(Run To Completion)是运行到完成为止的意思.在状态机中,从源状态到目标状态的转换动作要运行到完成. 从字面上来看,这个过程像是不可中断的,但实际并不是,这个过程可以被 ...
- eval函数的作用
eval函数的作用是去掉字符串最外侧的引号,并按照Python的语法执行去掉引号后的字符内容. [实例1] x=eval("12+36")print(x) #结果为48此例中,去 ...