暑假闲来无事,逛了逛技术论坛,发现有一个简单的爬虫项目,用java实现。正好这学期也是学习了简单的java基础,就当是暑假的作业学习一下,写在这里算是对我学习的一个记录。
先找到了一个爬虫框架WebMagic,还有官方文档,对于整个爬虫框架的设计思想还有架构以及讲述的非常全面了。
首先先在webmagic上下载需要的所有jar包,webmagic默认使用的是maven管理。在这里我并没有使用maven管理,在项目中build-path了相应的jar驱动包。整个爬虫的项目运行基本分为四个组件:Downloader(下载)、PageProcessor(处理)、Scheduler(管理)、Pipeline(持久化)。然后开始码代码。(这里对github进行爬虫,具体爬虫信息需求还需要另外学习:( )
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.JsonFilePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
public class WebSpider implements PageProcessor{
private Site site=Site.me().setRetryTimes(3).setSleepTime(100);
@Override
public void process(Page page) {
// TODO Auto-generated method stub
//添加目标请求页面,下面这段代码就用到了正则表达式,它表示匹配所有"https://github.com/code4craft/webmagic"这样的链接。
page.addTargetRequests(page.getHtml().links().regex("(https://github\\.com/\\w+/\\w+)").all());
//获取的信息--author最后转换为String类型数据,注意:putField的内容可以根据需求改变!!
page.putField("author",page.getUrl().regex("https://github\\.com/(\\w+)/.*").toString());
//下面这段代码使用了XPath,它的意思是“查找所有class属性为'entry-title public'的h1元素,并找到他的strong子节点的a子节点,并提取a节点的文本信息”。
page.putField("name",page.getUrl().xpath("//h1[@class='entry-title public']/strong/a/text()").toString());
if(page.getResultItems().get("name")==null) {
//如果page的name==null,则跳过这个page
page.setSkip(true);
}
page.putField("readme",page.getHtml().xpath("//div[@id='readme']/tidyText()"));
}
@Override
public Site getSite() {
// TODO Auto-generated method stub
return site;
}
public static void main(String[] args){
Spider.create(new WebSpider())
.addUrl("https://github.com/code4craft") //从当前的链接指向网站开始抓取
.addPipeline(new JsonFilePipeline("D:\\webmagic\\")) //抓取的结果用pipeline保存为json的格式
.thread(5) //开启5个线程来抓取
.run(); //启动爬虫
}
}
在编写过程中出现了一些小问题,需要记得的是在Spider.class文件中Attach source;
输出日志需要在项目中添加file,并命名为log4j.properties
并在此文件中写入
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
控制台获取了日志信息,当然不添加此文件,也是可以运行的,只是无日志文件。
哦啊冲!!