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使用的更多相关文章

  1. 爬虫框架--webmagic

    官方有详细的使用文档:http://webmagic.io/docs/zh/ 简介:这只是个java爬虫框架,具体使用需要个人去定制,没有图片验证,不能获取js渲染的网页,但简单易用,可以通过xpat ...

  2. webmagic的设计机制及原理-如何开发一个Java爬虫

    之前就有网友在博客里留言,觉得webmagic的实现比较有意思,想要借此研究一下爬虫.最近终于集中精力,花了三天时间,终于写完了这篇文章.之前垂直爬虫写了一年多,webmagic框架写了一个多月,这方 ...

  3. 基于webmagic的爬虫项目经验小结

    大概在1个月前,利用webmagic做了一个爬虫项目,下面是该项目的一些个人心得,贴在这里备份: 一.为什么选择webmagic? 说实话,开源的爬虫框架已经很多了,有各种语言(比如:python.j ...

  4. webmagic 增量爬取

    webmagic  是一个很好并且很简单的爬虫框架,其教程网址:http://my.oschina.net/flashsword/blog/180623 webmagic参考了scrapy的模块划分, ...

  5. 基于webmagic的爬虫小应用--爬取知乎用户信息

    听到“爬虫”,是不是第一时间想到Python/php ? 多少想玩爬虫的Java学习者就因为语言不通而止步.Java是真的不能做爬虫吗? 当然不是. 只不过python的3行代码能解决的问题,而Jav ...

  6. 02_使用WebMagic爬虫获取CSDN推荐专家的个人博客信息

    本来是想抓取博客园的博客推荐的页面的,但由于一些博客进去的页面格式都不太相同,一时不想花时间去寻找规律,发现CSDN上面的格式较为单一,就决定以CSDN推荐专家的个人博客信息作为爬虫抓取的目标. [首 ...

  7. WebMagic开源垂直爬虫介绍

    WebMagic项目代码分为核心和扩展两部分.核心部分(webmagic-core)是一个精简的.模块化的爬虫实现,而扩展部分则包括一些便利的.实用性的功能.WebMagic的架构设计参照了Scrap ...

  8. WebMagic的设计参考了业界最优秀的爬虫Scrapy

    http://webmagic.io/docs/zh/posts/ch1-overview/thinking.html https://github.com/psvehla/liferay-sprin ...

  9. 大白痴学习webmagic

    摘要 webmagic 学习 从头 刚刚开始学,很多东西可能理解错了,还请各位指教 一些基本类: Request:包含要爬行的url和一些附加信息,是Page的一个成员变量 主要成员变量 String ...

  10. webmagic加上了注解支持

    今天有个网友在博客回帖,能不能用注解来写一个爬虫?想了想,因为Javaer总习惯结果有个对象Model(我在自己用的时候也是这样),ResultItems的key-value形式难免会有点麻烦,何不将 ...

随机推荐

  1. mac地址常识及获取

    mac常识: 网卡地址这个概念有点混淆不清.因为实际上有两个地址,mac地址和物理地址,一般说网卡地址我是指物理地址,不知道别人怎么看?物理地址指的是网卡上的存放地址的ROM里的地址,mac地址是这块 ...

  2. Android Animation 动画

    动画类型 Android的animation由四种类型组成  Android动画模式 Animation主要有两种动画模式:一种是tweened animation(渐变动画) XML中 JavaCo ...

  3. 使用Oracle 11g新特性 Active Database Duplication 搭建Dataguard环境

    Duplication Database 介绍 Duplicate database可以按照用途分为2种: duplicate database(复制出一个数据库) duplicate standby ...

  4. tp_link无线路由器台式机无法上网

    昨天一个朋友问我为什么他买的无线路由器连到电脑上面以后不能上网,不过无线很正常,手机等无线设备都能够上网,但是家里的台式机却无法上网.估计很多朋友都遇到过这样的问题,其实问题很多简单.下面就来介绍一下 ...

  5. 软件安全攻防--缓冲区溢出和shellcode

    缓冲区溢出漏洞实验报告 实验楼中有seed缓冲区溢出漏洞实验,实验内容与课本中要求的实验基本一致,便利用实验楼提供好的现成实验环境来完成这次的实践内容. 一.实验简介 缓冲区溢出是指程序试图向缓冲区写 ...

  6. 《DSP using MATLAB》示例Example7.23

    代码: wp = 0.2*pi; ws = 0.3*pi; Rp = 0.25; As = 50; [delta1, delta2] = db2delta(Rp, As); [N, f, m, wei ...

  7. C#编程的几个建议

    1.属性(properties) 抽象属性可以放在接口的定义里.如: public interface INameValuePair<T>     {         string Nam ...

  8. NSNotificationCenter 通知中心传值

    1.NSNotification 这个类可以理解为一个消息对象,其中有三个成员变量. 这个成员变量是这个消息对象的唯一标识,用于辨别消息对象. @property (readonly, copy) N ...

  9. 洛谷 P1292 倒酒

    题目描述 Winy是一家酒吧的老板,他的酒吧提供两种体积的啤酒,a ml和b ml,分别使用容积为a ml和b ml的酒杯来装载. 酒吧的生意并不好.Winy发现酒鬼们都非常穷.有时,他们会因为负担不 ...

  10. sqlalchemy的基本的使用

    参考链接:http://www.techweb.com.cn/network/system/2016-10-11/2407638.shtml http://www.cnblogs.com/renfan ...