代码地址如下:
http://www.demodashi.com/demo/12175.html

1. 概述

因为无聊,闲来没事做,故突发奇想,爬个种子,顺便学习爬虫。本文将介绍使用Spring/Mybatis/webmagic等框架构建项目并爬取种子磁链。

2. 项目搭建

如下图为本项目的工程结构,主要代码实现在Spider包中。

3. 数据库设计

参考众多的种子网站,找到描述种子的常用属性,如下:

4. 程序实现

1. 爬虫配置

在抓取种子之前,首先要确定所要抓取的网站地址、编码、抓取时间间隔、重试次数等信息,如下:

	//设置网站源
private static String netSite="PushBT"; private Site site = Site.me().setDomain("http://www.pushbt.com")
.setCharset("UTF-8").setSleepTime(1000)//编码
.setRetryTimes(3);//重试次数
private static String BASE_URL="http://www.pushbt.com";
2. 逻辑编写

process方法是爬虫的核心接口,所有的属性抽取都在此方法中实现

@Override
public void process(Page page) {
//定义如何抽取页面信息,并保存下来
List<String> links = page.getHtml().xpath("//table[@class='items']//tr[@class='odd']/td[2]/a/@href").all();
//将需要待爬的网页地址都存下来,以待后续从中取出
targetUrlList=StringUtil.linkURL(BASE_URL, links);
page.addTargetRequests(targetUrlList);
Seeds seed = new Seeds();
// 获取名称
String name = page.getHtml().xpath("//ul[@id='filelist']//li/span/@title").toString();
if (name==null||"".equals(name)||service.isExistByName(name)) {//名称为空,则跳过;已存在(true),则跳过
page.setSkip(true);
count++;
LOG.info("skip the "+count+" ,title : "+name);
return;
}
page.putField("name", name);
seed.setSeedName(name);
// 获取hash值(无hash值,默认为null)
// String hash = page.getHtml().xpath("//p[@class='dd desc']//b[2]/text()").toString();
page.putField("hash", null);
seed.setSeedHash(null);
// 描述(没有描述信息,则默认为名称)
// String desc = page.getHtml().xpath("//div[@class='dd filelist']/p/text()").toString();
page.putField("desc", name);
seed.setSeedDes(name);
// 文件个数
String number = page.getHtml().xpath("//ul[@class='params-cover']/li[4]/div[@class='value']/text()").toString();
page.putField("number", number);
seed.setNumber(number);
// 文件大小
String size = page.getHtml().xpath("//ul[@class='params-cover']/li[5]/div[@class='value']/text()").toString();
page.putField("size", size);
seed.setSize(size);
// 获取收录时间
String includeDate = page.getHtml().xpath("//ul[@class='params-cover']/li[2]/div[@class='value']/text()").toString();
page.putField("includeDate", includeDate);
seed.setIncludeTime(includeDate);
//最近下载时间
String recentlyDown = page.getHtml().xpath("//ul[@class='params-cover']/li[3]/div[@class='value']/text()").toString();
page.putField("recentlyDown", recentlyDown);
seed.setRecentlyDown(recentlyDown);
// 人气
String popularity = page.getHtml().xpath("//ul[@class='params-cover']/li[6]/div[@class='value']/text()").toString();
page.putField("popularity", popularity);
seed.setPopularity(popularity);
// 下载速度
// String speed = page.getHtml().xpath("//p[@class='dd desc']//b[7]/text()").toString();
page.putField("speed", SpiderUtil.getSpeed(popularity));
seed.setSpeed(SpiderUtil.getSpeed(popularity));
// 获取磁力链接
String magnet = page.getHtml().xpath("//ul[@class='params-cover']/li[9]/div[@class='value']/a/@href").toString();
page.putField("magnet", magnet);
seed.setMagnet(magnet);
// 标签(在详情页面没有tag,暂时以热门搜索为tag)
List<String> tags = page.getHtml().xpath("//div[@class='block oh']/a/span/text()").all();
page.putField("tags", tags);
seed.setTag(tags.toString());
seed.setCreateTime(new Date());
seed.setUpdateTime(new Date());
seed.setSource(netSite);
seed.setCategory("movies");
//保存到数据库
service.insert(seed);
}
3. 其它部分编写

例子用到的其他部分代码,如MVC,数据库操作等,不是本章节的重点,所以不一一介绍了

5. 成果展示



基于webmagic的种子网站爬取

代码地址如下:
http://www.demodashi.com/demo/12175.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

最新文章

  1. Qt:Drag-Drop操作在QGraphicsView及Model/View框架下的实现
  2. Nutch插件原理
  3. ubuntu linux 下wine的使用
  4. 【1】CommonCode快速代码集
  5. hosts文件不显示
  6. mysqldump备份还原mysql
  7. spring加载异常
  8. (四) 虚拟摄像头vivi体验
  9. Codeforces878 A. Short Program
  10. Mono.Cecil
  11. docker环境 宿主机和容器之间复制文件
  12. Python实现批量梯度下降算法
  13. Http指南(3)
  14. Shiro笔记(一)基本概念
  15. &lt;jsp:include&gt;动作元素,附:最易出错的一点
  16. Array.Resize(ref arry, size);
  17. linux 安装Swagger(swagger-editor , swagger-ui)
  18. tesseract-ocr训练方法
  19. C# WebHelper-CookieHelper,CacheHelper,SessionHelper
  20. 广义线性模型 - Andrew Ng机器学习公开课笔记1.6

热门文章

  1. centos6.5 以 zero-dependency Erlang from RabbitMQ 搭建环境
  2. flask框架基本使用(4)(钩子函数,异常,命令行运行)
  3. 如何将django部署从顶级目录迁移到子目录下(NGINX UWSGI DJANGO)
  4. Python的网络编程[5] -&gt; BOOTP + TFTP + FTP -&gt; 实现一个简单的文件传输流程
  5. NOIP2018提高组模拟题(二)
  6. 解密Java内存溢出之持久代
  7. bzoj 1879: [Sdoi2009]Bill的挑战
  8. 1.13(java学习笔记)异常机制
  9. Intent创建Activity
  10. SimpleDateFormat格式