用WebCollector制作一个爬取《知乎》并进行问题精准抽取的爬虫(JAVA)
简单介绍:
WebCollector是一个无须配置、便于二次开发的JAVA爬虫框架(内核),它提供精简的的API。仅仅需少量代码就可以实现一个功能强大的爬虫。
怎样将WebCollector导入项目请看以下这个教程:
JAVA网络爬虫WebCollector深度解析——爬虫内核
參数:
WebCollector无需繁琐配置。仅仅要在代码中给出以下几个必要參数,就可以启动爬虫:
1.种子(必要):
种子即爬虫的起始页面。一个爬虫可加入一个或多个种子。
2.正则(可选):
正则是约束爬取范围的一些正则式。
正则不一定要给出。假设用户没有给出正则,系统会自己主动将爬取范围限定在种子的域名内。
3.线程数(可选):
WebCollector是一个多线程的爬虫,默认使用10个线程同一时候工作。开发人员能够自己定义线程数。
需求:
简述一下教程里代码的功能:定制一个爬虫,对“知乎”站点进行爬取。不要求下载全部的网页和文件,而是要求对知乎中全部的“提问”页面中的”问题“进行提取。如图:
我们须要提取问题标题:“看了《蝙蝠侠》,假设我闯进纽交所,逼迫全部人卖掉他手里的全部的股票期货债券什么的,会有什么毁灭性后果?",
以及问题的内容:“咱不讨论这可行性,我就想听听这有什么毁灭性那个的后果么?再比方百度。58,新东方什么的在那上市的中国公司?再比方会对其它的比方伦敦交易所什么的影响?中国股市的影响?再比方对其它货币的影响之类的?“
代码:
代码分为两部分,爬取器和控制器。
爬取器通过Override父类中的visit方法(即对每一个正在爬取的页面须要进行的操作),来定制自己的爬取任务。
控制器通过给爬取器设置參数(上面所说的种子、正则、线程数)。启动爬取器来完毕控制功能。
1.爬取器:
WebCollector中集成了多种爬取器(主要是遍历算法不同),最经常使用的遍历器是BreadthCrawler,它是基于广度遍历的算法进行爬取的。我们新建一个JAVA类ZhihuCrawler,继承BreadthCrawler,来定制我们的爬取器。
public class ZhihuCrawler extends BreadthCrawler{ /*visit函数定制訪问每一个页面时所需进行的操作*/
@Override
public void visit(Page page) {
String question_regex="^http://www.zhihu.com/question/[0-9]+";
if(Pattern.matches(question_regex, page.getUrl())){
System.out.println("正在抽取"+page.getUrl());
/*抽取标题*/
String title=page.getDoc().title();
System.out.println(title);
/*抽取提问内容*/
String question=page.getDoc().select("div[id=zh-question-detail]").text();
System.out.println(question); }
}
代码解析:
《知乎》中有非常多种网页:提问网页、用户个人信息网页、专页。我们如今仅仅要对提问网页进行操作。
提问网页的URL一般例如以下:http://www.zhihu.com/question/21962447
question_regex是全部提问网页的正則表達式,代码中:
if(Pattern.matches(question_regex, page.getUrl())){
//操作代码
}
保证我们仅仅对“提问”页面进行抽取。
visit函数的參数Page page,是一个已经爬取并解析成DOM树的页面。Page的參数:
page.getUrl() returns the url of the downloaded page
page.getContent() returns the origin data of the page
page.getDoc() returns an instance of org.jsoup.nodes.Document
page.getResponse() returns the http response of the page
page.getFetchTime() returns the time this page be fetched at generated by System.currentTimeMillis()
特别要注意的是page.getDoc()(DOM树)。这里的page.getDoc()是JSOUP的Document,假设须要做HTML解析、抽取。使用page.getDoc()是不二的选择。关于jsoup的用法,可參考JSOUP的教程:
http://www.brieftools.info/document/jsoup/
ZhihuCrawler中用到了page.getUrl()和page.getDoc()。
我们能够发现,《知乎》提问页面的网页标题就是问题的标题,所以通过:
String title=page.getDoc().title();
就获取了提问标题。
抽取《知乎》提问页面的提问内容,须要从HTML源代码观察规则:
<div data-action="/question/detail" data-resourceid="965792" class="zm-item-rich-text" id="zh-question-detail">
<div class="zm-editable-content">咱不讨论这可行性,我就想听听这有什么毁灭性那个的后果么?<br>
再比方百度,58,新东方什么的在那上市的中国公司?<br>
再比方会对其它的比方伦敦交易所什么的影响?中国股市的影响?<br>再比方对其它货币的影响之类的?
</div>
</div>
对于《知乎》全部的提问界面。我们发现,提问内容都被放在一个id="zh-question-detail"的div中。这是JSOUP最适合适用的一种情况。我们仅仅要找到这个div,将当中的文本(text)取出就可以:
String question=page.getDoc().select("div[id=zh-question-detail]").text();
2.控制器:
我们须要一个控制器来启动爬取器:
public class Controller { public static void main(String[] args) throws IOException{
ZhihuCrawler crawler=new ZhihuCrawler();
crawler.addSeed("http://www.zhihu.com/question/21003086");
crawler.addRegex("http://www.zhihu.com/.*");
crawler.start(5);
}
}
首先实例化刚定义的ZhihuCrawler(爬取器)。
给爬取器一个种子:http://www.zhihu.com/question/21003086
crawler.start(5)并非表示开启5个线程爬取,5表示爬取的深度(广度遍历的层数)。
执行Controller这个类,会发现不断有输出产生。可是输出比較杂乱。这是由于我们不仅输出了我们抽取的提问。还输出了爬虫的日志(爬取记录等):
fetch:http://www.zhihu.com/people/lxjts
fetch:http://www.zhihu.com/question/24597698
正在抽取http://www.zhihu.com/question/24597698
小米4採用304不锈钢除了提升质感和B格。还有其它的实际优点么? - 知乎
信号会不会跟ip4一样悲剧了……
fetch:http://www.zhihu.com/topic/20006139
fetch:http://www.zhihu.com/topic/19559450
fetch:http://www.zhihu.com/question/20014415#
fetch:http://www.zhihu.com/collection/31102864
fetch:http://www.zhihu.com/topic/19663238
fetch:http://www.zhihu.com/collection/20021567
上面的输出片段中,我们能够看到一次visit函数的运行,訪问了http://www.zhihu.com/question/24597698 ,对问题的标题进行了抽取:“小米4採用304不锈钢除了提升质感和B格。还有其它的实际优点么? - 知乎”。同一时候也抽取了问题的内容:“信号会不会跟ip4一样悲剧了……“。
"fetch:http://www.zhihu.com/question/24597698"是日志的输出,表示一个已经爬取的网页。
假设您想看到干净的爬取结果,有以下几种解决方式:
1.在ZhihuCrawler的visit方法里,加入代码。将title和question字符串输出到文件里。
2.在ZhihuCrawler的visit方法里。加入代码,将title和question字符串提交到数据库(推荐)。
可能有人会疑问。为什么我们给爬虫加入种子的时候不加入《知乎》的首页,这是由于《知乎》首页在不登录的情况下会默认返回登录页面。
用WebCollector制作一个爬取《知乎》并进行问题精准抽取的爬虫(JAVA)的更多相关文章
- 一个简单的python爬虫,爬取知乎
一个简单的python爬虫,爬取知乎 主要实现 爬取一个收藏夹 里 所有问题答案下的 图片 文字信息暂未收录,可自行实现,比图片更简单 具体代码里有详细注释,请自行阅读 项目源码: # -*- cod ...
- 利用 Scrapy 爬取知乎用户信息
思路:通过获取知乎某个大V的关注列表和被关注列表,查看该大V和其关注用户和被关注用户的详细信息,然后通过层层递归调用,实现获取关注用户和被关注用户的关注列表和被关注列表,最终实现获取大量用户信息. 一 ...
- 教程+资源,python scrapy实战爬取知乎最性感妹子的爆照合集(12G)!
一.出发点: 之前在知乎看到一位大牛(二胖)写的一篇文章:python爬取知乎最受欢迎的妹子(大概题目是这个,具体记不清了),但是这位二胖哥没有给出源码,而我也没用过python,正好顺便学一学,所以 ...
- python scrapy爬取知乎问题和收藏夹下所有答案的内容和图片
上文介绍了爬取知乎问题信息的整个过程,这里介绍下爬取问题下所有答案的内容和图片,大致过程相同,部分核心代码不同. 爬取一个问题的所有内容流程大致如下: 一个问题url 请求url,获取问题下的答案个数 ...
- 使用python scrapy爬取知乎提问信息
前文介绍了python的scrapy爬虫框架和登录知乎的方法. 这里介绍如何爬取知乎的问题信息,并保存到mysql数据库中. 首先,看一下我要爬取哪些内容: 如下图所示,我要爬取一个问题的6个信息: ...
- scrapy 爬取知乎问题、答案 ,并异步写入数据库(mysql)
python版本 python2.7 爬取知乎流程: 一 .分析 在访问知乎首页的时候(https://www.zhihu.com),在没有登录的情况下,会进行重定向到(https://www. ...
- PHP爬取知乎日报图片显示不了问题
在爬取知乎日报的内容时,虽然能拿到图片的地址,在窗口中也能打开图片,但是在前端却显示不了,报403错误. 经查证,这是因为知乎对图片做了防盗链处理,其中一个解决方法是添加meta标签: <met ...
- python 爬取知乎图片
先上完整代码 import requests import time import datetime import os import json import uuid from pyquery im ...
- scrapy爬取知乎某个问题下的所有图片
前言: 1.仅仅是想下载图片,别人上传的图片也是没有版权的,下载来可以自己欣赏做手机背景但不商用 2.由于爬虫周期的问题,这个代码写于2019.02.13 1.关于知乎爬虫 网上能访问到的理论上都能爬 ...
随机推荐
- html = data.decode('gbk').encode('utf-8')
html = data.decode('gbk').encode('utf-8')此处encode编码要与html文件内charset=utf-8的格式一致,如果不一致,浏览器打开乱码,文本编辑器正常 ...
- IT第二天 - JAVA环境的配置、Hello的编写
IT第二天 上午 HTML的一些讲解 下午 JDK的安配置 JAVA语法的注意事项 Hello的编写 晚上 作业 对println的应用 笔记 1.Classpath环境变量的配置:因为DOS对于文件 ...
- JDBC批量运行executeBatch
JDBC运行SQL语句,有两个处理的接口,一个PreparedStatement,Statement,一般操作JDBC比較用得多的还是PreparedStatement 只是在运行批量,Prepare ...
- Cocos2d-x 创建自己定义项目模板
你是否以前为cocos方便高速开发而兴奋,你是否以前为各种工具的便利开发而感动,但如今的你是否为每次创建一个新的项目都是HelloWorldScene而苦恼? 好吧,事实上我也感觉到了,每次创建一个项 ...
- java多线程监听JMS、MQ队列
本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可. 转载请注明出处和作者.http://blog.csdn.net/xtj332 背景:消息队列中有非常多的消息需要 ...
- 我的Python成长之路---第四天---Python基础(15)---2016年1月23日(寒风刺骨)
二.装饰器 所谓装饰器decorator仅仅是一种语法糖, 可作用的对象可以是函数也可以是类, 装饰器本身是一个函数, 其主要工作方式就是将被装饰的类或者函数当作参数传递给装饰器函数.本质上, ...
- QuartusII中调用Modelsim的方法
Modelsim的使用 1, 建立工程编译通过之后——证明实例工程无语法等简单错误.编写testbench 2, 将testbench 添加到工程中,进行编译通过.会在工程的file中看到test ...
- Raphael入门实例:绘图
raphael 实例 开始 创建画布参数说明 创建一个画布对象. 下面每个例子都会创建一个320*200大小的画布. ? 1 2 // 1.在视口的 (10,50) 坐标位置上创建画布 var pap ...
- ASP.NET MVC 5 学习教程:添加控制器
原文 ASP.NET MVC 5 学习教程:添加控制器 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 通过 ...
- UVA 10340 (13.08.25)
Problem E All in All Input: standard input Output: standard output Time Limit: 2 seconds Memory Limi ...