webmagic使用
webmagic是Java语言用于爬虫的工具。官网地址:http://webmagic.io/,中文文档地址:http://webmagic.io/docs/zh/
使用webmagic有3种配置需要注意,日志配置(log4j),webmagic爬取配置(如超时时间),使用数据库的话数据库连接池配置。有一些配置最好做到可以随机器性能情况而改变配置信息。这样做的目的是为了将项目打成包以后在命令行下执行程序可以随时更改配置。因此有些配置文件就不像c3p0配置文件一样放在源码文件夹下,而是相对与项目路径来说。
webmagic的架构图如下:

从该架构图上可以得到一个信息,对于每一个页面来说,都会经历一个完成的过程,即从downloader--->pipeline,如列表页也会进入pipeline,所以列表页虽然没有数据需要存储,但在pipeline中去拿值就会出现空指针,因此在pipeline中要先进行判断,有值的情况下在进行数据库存储操作。
在页面解析部分(待补充),webmagic将解析语法做了一些改变,
1、如将正则表达式中.用\.表示
2、*变成了.*,直接使用表示通配符
3、xpath语法也进行了扩充。
代码示例:
webmagic版本:0.6.0
package com.lh.pipeline; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; import us.codecraft.webmagic.ResultItems;
import us.codecraft.webmagic.Task;
import us.codecraft.webmagic.pipeline.Pipeline; public class MysqlPipeline implements Pipeline {
//有一个容器
static DataSource ds = new ComboPooledDataSource();//直接使用即可,不用显示的配置,其会自动识别配置文件
public void process(ResultItems resultItems, Task task) {
//每进来一次代表一条记录
//如果容器值达到1000,存一次数据库并将数据清空,否则将数据存入容器
Map<String, Object> m = resultItems.getAll();
if(!m.isEmpty()){
Set<Entry<String, Object>> set = m.entrySet();
Iterator<Entry<String, Object>> reconds = set.iterator();
String url = null;
String name = null;
String content = null;
for(int i=0;i<set.size();i++){
Entry<String, Object> recond =reconds.next();
if(i==0){
url = recond.getValue().toString();
}else if(i==1){
name = recond.getValue().toString();
}else if(i==2){
content = recond.getValue().toString();
} } Connection conn = null;
try {
conn = ds.getConnection();
String sql = "insert into softList(url,name,content) values(?,?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, url);
pstmt.setString(2, name);
pstmt.setString(3, content);
pstmt.execute();
pstmt.close();
conn.close(); } catch (SQLException e) {
e.printStackTrace();
} }
}
}
package com.lh.spider; import com.lh.pipeline.MysqlPipeline; import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.FilePipeline;
import us.codecraft.webmagic.processor.PageProcessor; public class ProgramSpider implements PageProcessor { private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setTimeOut(10000); public static final String URL_LIST = "http://www\\.xiazaiba\\.com/downlist/187_\\d{1,4}\\.html"; public static final String URL_POST = "http://www\\.xiazaiba\\.com/html/\\d+.html"; public void process(Page page) { if(page.getUrl().regex("http://www\\.xiazaiba\\.com/downlist/187\\.html").match()||page.getUrl().regex(URL_LIST).match()){
//第一页
//加入详情页
//加入列表页
page.addTargetRequests(page.getHtml().xpath("//ul[@class='cur-cat-list']/li/a[1]").links().all());
page.addTargetRequests(page.getHtml().xpath("//div[@class='ylmf-page']").links().all());
}else{
//详情页
page.putField("url", page.getUrl());
page.putField("ProgramName", page.getHtml().xpath("//div[@class='soft-title']/html()"));
page.putField("ProgramContent", page.getHtml().xpath("//td[@class='soft-content']/html()"));
}
} public Site getSite() {
return site;
}
public static void main(String[] args) {
Spider.create(new ProgramSpider())
.addUrl("http://www.xiazaiba.com/downlist/187.html")
.addPipeline(new MysqlPipeline()).thread(10)
.run();
}
}
webmagic使用的更多相关文章
- 爬虫框架--webmagic
官方有详细的使用文档:http://webmagic.io/docs/zh/ 简介:这只是个java爬虫框架,具体使用需要个人去定制,没有图片验证,不能获取js渲染的网页,但简单易用,可以通过xpat ...
- webmagic的设计机制及原理-如何开发一个Java爬虫
之前就有网友在博客里留言,觉得webmagic的实现比较有意思,想要借此研究一下爬虫.最近终于集中精力,花了三天时间,终于写完了这篇文章.之前垂直爬虫写了一年多,webmagic框架写了一个多月,这方 ...
- 基于webmagic的爬虫项目经验小结
大概在1个月前,利用webmagic做了一个爬虫项目,下面是该项目的一些个人心得,贴在这里备份: 一.为什么选择webmagic? 说实话,开源的爬虫框架已经很多了,有各种语言(比如:python.j ...
- webmagic 增量爬取
webmagic 是一个很好并且很简单的爬虫框架,其教程网址:http://my.oschina.net/flashsword/blog/180623 webmagic参考了scrapy的模块划分, ...
- 基于webmagic的爬虫小应用--爬取知乎用户信息
听到“爬虫”,是不是第一时间想到Python/php ? 多少想玩爬虫的Java学习者就因为语言不通而止步.Java是真的不能做爬虫吗? 当然不是. 只不过python的3行代码能解决的问题,而Jav ...
- 02_使用WebMagic爬虫获取CSDN推荐专家的个人博客信息
本来是想抓取博客园的博客推荐的页面的,但由于一些博客进去的页面格式都不太相同,一时不想花时间去寻找规律,发现CSDN上面的格式较为单一,就决定以CSDN推荐专家的个人博客信息作为爬虫抓取的目标. [首 ...
- WebMagic开源垂直爬虫介绍
WebMagic项目代码分为核心和扩展两部分.核心部分(webmagic-core)是一个精简的.模块化的爬虫实现,而扩展部分则包括一些便利的.实用性的功能.WebMagic的架构设计参照了Scrap ...
- WebMagic的设计参考了业界最优秀的爬虫Scrapy
http://webmagic.io/docs/zh/posts/ch1-overview/thinking.html https://github.com/psvehla/liferay-sprin ...
- 大白痴学习webmagic
摘要 webmagic 学习 从头 刚刚开始学,很多东西可能理解错了,还请各位指教 一些基本类: Request:包含要爬行的url和一些附加信息,是Page的一个成员变量 主要成员变量 String ...
- webmagic加上了注解支持
今天有个网友在博客回帖,能不能用注解来写一个爬虫?想了想,因为Javaer总习惯结果有个对象Model(我在自己用的时候也是这样),ResultItems的key-value形式难免会有点麻烦,何不将 ...
随机推荐
- cocos2dx lua 热加载实现
[Q]原创 2015-08-30 在公司使用cocos2dx+lua 开发游戏有一段时间了,刚好lua的热更新交给我负责.以前热更新的lua脚本大部分都是在下载之后加载.最近策划又有新需求,需要在游戏 ...
- Lua基础---lua字符串库函数详解,实例及正则表达式
参考这个网友写的,比较简单容易理解. http://blog.csdn.net/wlgy123/article/details/49206183
- Kali Linux破解wifi密码(WEP)
WEP是无线路由器最初广泛使用的一种加密方式,这种加密方式非常容易被破解. 目前很少有人使用wep加密方式,但是还是会有. 建议:使用WPA/WPA2做为加密方式. 抓包和"破解wpa/wp ...
- linux中的vim编辑器的使用
vim的三种模式: 常规模式(命令模式)也是默认模式,从其它模式进行命令模式按esc i 在光标前插入文本 o 命令是指在当前行下方插入新行 dd 是删除光标所在的整个一行 yy 是在光标所在整个放入 ...
- STL源码解析之vector自实现
最近仔细阅读了下侯捷老师的<STL源码剖析>的前三章内容:空间配置器.迭代器.traits技术,为了加强理解和掌握,特参照源码自实现Vector,以下对相关重点知识进行说明. 1. vec ...
- Java集合总结之Collection整体框架
前段时间一直在忙一个物联网的项目,所以Java的学习一直搁置,从今天开始继续学习!望大家多提宝贵意见! java.util包中包含了一些在Java 2中新增加的最令人兴奋的增强功能:类集.一个类集(c ...
- HTML标签01
html标签:table 表格 (里面加的属性指整个表格的)tr 行td 单元格 (可以换成th,只有在单元格里面才能输入文字)th 表头 默认让文字居中 文字还会显示加粗状态 font 文字标签 属 ...
- 在web.config中配置httpHandlers节点是的说明
<system.web> <httpHandlers> <add verb="*" path="*.lcj" type=" ...
- 使用pinyin4j汉字转pinyin
引入maven依赖<dependencies> <dependency> <groupId>com.belerweb</groupId> <art ...
- Python学习系列(五)(文件操作及其字典)
Python学习系列(五)(文件操作及其字典) Python学习系列(四)(列表及其函数) 一.文件操作 1,读文件 在以'r'读模式打开文件以后可以调用read函数一次性将文件内容全部读出 ...