目前爬虫框架层出不穷,当然很多公司也会根据自己的业务做二次开发,Java的有WebMagic和WebCollector等,Python的有PySpider和Scrapy等。不能说孰好孰坏,只能说根据自己的业务场景选择不同框架,Python作为爬虫的开发语言已经火的一塌糊涂,但是我为什么选择Java语言呢?因为我不会Python,也不想劳神费力再学一门语言,那就从Java的WebMagic玩起吧。
爬虫的应用场景也各色各异,比如有好玩的同学喜欢爬取网易云音乐的热门评论、还有人爬各种招聘网站的在招职位。商业用途也有很多,比如竞品分析、全球POI更新等等。
红色1是我们要的内容,红色2是对应的html结构。
<dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-core</artifactId> <version>0.7.3</version> </dependency> <dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-extension</artifactId> <version>0.7.3</version> </dependency> 复制代码
package com.daervin.demo; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.processor.PageProcessor; import us.codecraft.webmagic.selector.Html; import us.codecraft.webmagic.selector.Selectable; import java.util.List; public class FilmProcessor implements PageProcessor { public static final String URL = "http://www.dytt8.net"; @Override public void process(Page page) { Html html = page.getHtml(); //解析列表页 List<Selectable> contentNodes = html.xpath("//div[@class='co_content2']/ul/a").nodes(); for (int i = 1; i < contentNodes.size(); i++) { //第一条过滤,从第二条开始遍历 Selectable linkNode = contentNodes.get(i); if (linkNode == null) { continue; } String linkTmp = linkNode.links().get(); if (linkTmp != null && linkTmp.length() > 0) { //将找到的链接放到addTargetRequest里面,会自动发起请求 page.addTargetRequest(linkTmp); //输出到控制台 System.out.println(linkTmp); } } } @Override public Site getSite() { return Site.me().setTimeOut(10000); } } 复制代码
package com.daervin.demo; import us.codecraft.webmagic.Spider; public class FilmTest { public static void main(String[] args) { Spider.create(new FilmProcessor()).addUrl(FilmProcessor.URL).run(); } } 复制代码
只是拿到了列表对应的详情页地址,没达到获取下载地址的目的!继续...
获取到电影名称和迅雷下载地址
package com.daervin.demo; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.processor.PageProcessor; import us.codecraft.webmagic.selector.Html; import us.codecraft.webmagic.selector.Selectable; import java.util.List; public class FilmProcessor implements PageProcessor { public static final String URL = "http://www.dytt8.net"; @Override public void process(Page page) { Html html = page.getHtml(); //解析列表页 if (URL.equals(page.getUrl().toString())) { //抽取结果 List<Selectable> contentNodes = html.xpath("//div[@class='co_content2']/ul/a").nodes(); for (int i = 1; i < contentNodes.size(); i++) { //第一条过滤,从第二条开始遍历 Selectable linkNode = contentNodes.get(i); if (linkNode == null) { continue; } String linkTmp = linkNode.links().get(); if (linkTmp != null && linkTmp.length() > 0) { //将找到的链接放到addTargetRequest里面,会自动发起请求 page.addTargetRequest(linkTmp); //输出到控制台 System.out.println(linkTmp); } } } else {//解析电影详情页面 //获取html Selectable movieNameS = html.xpath("//title/text()"); Selectable movieDownloadS = html.xpath("//a[starts-with(@href,'ftp')]/text()"); System.out.println("movieName:" + movieNameS.get()); System.out.println("downloadURL:" + movieDownloadS.get()); System.out.println("-----------------------------------"); } } @Override public Site getSite() { return Site.me().setTimeOut(10000); } } 复制代码
菜鸟一只,欢迎交流。