上一篇文章说是整合springboot,但跟springboot关系不大,只是解决了项目运行时出现个各种问题。这篇文章要做的是爬取oschina。为什么还要爬取oschina?因为webmagic的作者黄亿华的文章在oschina。
爬取网址:黄亿华的个人空间 - OSCHINA - 中文开源技术交流社区
首先还是得看官网,下面是码云地址,我们按照上面的来,版本我们还是使用0.10.0
webmagic: webmagic 是一个无须配置、便于二次开发的爬虫框架,它提供简单灵活的API,只需少量代码即可实现一个爬虫。
第一个爬虫
pom信息
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>0.10.0</version>
</dependency>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>0.10.0</version>
</dependency>
这里爬取的是黄亿华大佬的地址。
package com.spiden.bazaspiden.processor;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.ConsolePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import java.util.List;
/**
* @author 张高昌
* @date 2024/1/4 19:42
* @description: 简单的爬虫
*/
public class OschinaBlogPageProcessor implements PageProcessor {
private Site site = Site.me().setDomain("my.oschina.net");
@Override
public void process(Page page) {
List<String> links = page.getHtml().links().regex("http://my\\.oschina\\.net/flashsword/blog/\\d+").all();
page.addTargetRequests(links);
page.putField("title", page.getHtml().xpath("//div[@class='BlogEntity']/div[@class='BlogTitle']/h1").toString());
page.putField("content", page.getHtml().$("div.content").toString());
page.putField("tags",page.getHtml().xpath("//div[@class='BlogTags']/a/text()").all());
}
@Override
public Site getSite() {
return site;
}
public static void main(String[] args) {
Spider.create(new OschinaBlogPageProcessor()).addUrl("http://my.oschina.net/flashsword/blog")
.addPipeline(new ConsolePipeline()).run();
}
}
运行main方法结果如下:
运行结果:这很明显是错误的,并不是我们想要的数据。我们想要的是从列表页中获取文章的有效连接,然后从这个连接里爬取到相应的信息。
原因:将http改成https就好了
再次运行
等待了很久后运行结束,看出来这位大佬写了不少的文章,总共120多篇文章。
顺便吐槽一下,官网的文档得更新了。
数据是爬取到了,可总得入库吧!
创建一个新的类:OschinaPipeline
package com.spiden.bazaspiden.pipeline;
import us.codecraft.webmagic.ResultItems;
import us.codecraft.webmagic.Task;
import us.codecraft.webmagic.pipeline.Pipeline;
/**
* @author 张高昌
* @date 2024/1/4 19:42
* @description: 爬取到的数据入库操作
*/
public class OschinaPipeline implements Pipeline {
@Override
public void process(ResultItems resultItems, Task task) {
String title = resultItems.get("title"); //文章题目
String context = resultItems.get("content"); //文章内容
System.out.println("标题:" + title);
System.out.println("内容:" + context);
}
}
对OschinaBlogPageProcessor进行改造
打开网址:黄亿华的个人空间 - OSCHINA - 中文开源技术交流社区
我们这里就点击第一个进入到详情页面;然后打开F12
复制到的内容应该是这样的:
//*[@id="mainScreen"]/div[2]/div[1]/div[1]/div[2]/div[1]/div/div[1]/div/div[1]/h1/a
正文内容操作是一样的:
//*[@id="mainScreen"]/div[2]/div[1]/div[1]/div[2]/div[1]/div/div[1]/div/div[2]/div[1]/div[1]/div
将这2个替换原来官网的内容
page.putField("title", page.getHtml().xpath("//*[@id=\"mainScreen\"]/div[2]/div[1]/div[1]/div[2]/div[1]/div/div[1]/div/div[1]/h1/a").toString());
page.putField("content", page.getHtml().xpath("//*[@id=\"mainScreen\"]/div[2]/div[1]/div[1]/div[2]/div[1]/div/div[1]/div/div[2]/div[1]/div[1]/div").toString());
修改ConsolePipeline()为我们刚刚创建的OschinaPipeline()
Spider.create(new OschinaBlogPageProcessor()).addUrl("https://my.oschina.net/flashsword/blog")
.addPipeline(new OschinaPipeline()).run();
完整代码如下:
package com.spiden.bazaspiden.processor;
import com.spiden.bazaspiden.pipeline.OschinaPipeline;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.ConsolePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import java.util.List;
/**
* @author 张高昌
* @date 2024/1/4 19:42
* @description: 简单的爬虫
*/
public class OschinaBlogPageProcessor implements PageProcessor {
private Site site = Site.me().setDomain("my.oschina.net");
@Override
public void process(Page page) {
List<String> links = page.getHtml().links().regex("https://my\\.oschina\\.net/flashsword/blog/\\d+").all();
page.addTargetRequests(links);
page.putField("title", page.getHtml().xpath("//*[@id=\"mainScreen\"]/div[2]/div[1]/div[1]/div[2]/div[1]/div/div[1]/div/div[1]/h1/a").toString());
page.putField("content", page.getHtml().xpath("//*[@id=\"mainScreen\"]/div[2]/div[1]/div[1]/div[2]/div[1]/div/div[1]/div/div[2]/div[1]/div[1]/div").toString());
}
@Override
public Site getSite() {
return site;
}
public static void main(String[] args) {
Spider.create(new OschinaBlogPageProcessor()).addUrl("https://my.oschina.net/flashsword/blog")
.addPipeline(new OschinaPipeline()).run();
}
}
再次运行:
搞定!!!
这里在选择xpath规则时,我是直接没有说明,我是打算放到后面的时候在讲解;如果感兴趣可以自己看下。
下一篇我们开始爬取csdn