WebMagic – 炒鸡实用的Java爬虫框架

概述

WebMagic 的核心部分是一个精简的、模块化的爬虫实现,作者封装了大量的实用性功能。其中Spider是WebMagic内部流程的核心,它封装了爬虫的创建、启动、停止、多线程等功能。其实我们并不需要关注太多,大部分模块WebMagic都已经默认实现,我们只需要写Process部分。

如何使用

我们可以直接下载jar包放在我们的项目下就行了,下载地址 : https://github.com/code4craft/webmagic/releases/tag/webmagic-parent-0.6.1 这里只需要下载第一个文件,源代码没必要下载。

实例

其实官方文档给出了一个例子,这里我实现下载知乎某个问题某个回答里图片作为一个实例。

源码 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package spider;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import java.io.*;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
//http://webmagic.io/docs/zh/posts/ch4-basic-page-processor/pageprocessor.html
public class MySpider implements PageProcessor{
//抓取网站的相关配置
private Site site=Site.me().setRetryTimes(10).setSleepTime(5000).setTimeOut(5000).addCookie("www.zhihu.com", "unlock_ticket", "QUJBTXRpWGJRd2dYQUFBQVlRSlZUZl83Q2xjZkJISHZkZm13R05Jck93eTNFU2IyUE53LWVnPT0=|"
+ "1460335857|e1d68d4125f73b6280312c3eafa71da1b9fc7cab").addCookie("login", "MWRiZWUxNmMzOTA5NDdmNTkwNGRmNWQyZWZhNDRmY2U=|1475371295|b9e9c165fc1d3c314afa2b66e3ff27c514bb4946").addCookie("Domain","www.zhihu.com").addCookie("z_c0","你的cookie").setUserAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36");
//链接的发现
private static final String URL_answer = "https://www\\.zhihu\\.com/question/\\d+/answer/\\d+";
public static void main(String[] args) {
// TODO Auto-generated method stub
//爬虫的入口以及启动和线程设置
String answerUrl = "https://www.zhihu.com/question/36435092/answer/99247306";
Spider.create(new MySpider()).addUrl(answerUrl).thread(1).run();
}
@Override
public Site getSite() {
// TODO Auto-generated method stub
return site;
}
@Override
//process是定制爬虫逻辑的核心接口,在这里编写抽取逻辑
public void process(Page page) {
// TODO Auto-generated method stub
if(page.getUrl().regex(URL_answer).match()){
//定义如何抽取页面信息,并保存下来
List<String> urlList = page.getHtml().xpath("//div[@class=RichContent-inner]//img/@data-original").all();
String questionTitle = page.getHtml().xpath("//h1[@class=QuestionHeader-title]/text()").toString();
System.out.println("题目:"+questionTitle);
System.out.println(urlList);
System.out.println(urlList.size());
List<String> url = new ArrayList<String>();
for (int i=0;i<urlList.size();i=i+2){
url.add(urlList.get(i));
}
String filePath = "D:\\知乎图片\\";
try {
downLoadPics(url,questionTitle,filePath);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static boolean downLoadPics( List<String> imgUrls,String title, String filePath) throws Exception {
boolean isSuccess = true;
// 文件路径+标题
String dir = filePath +title;
// 创建
File fileDir = new File(dir);
fileDir.mkdirs();
int i = 1;
// 循环下载图片
for (String imgUrl : imgUrls) {
URL url = new URL(imgUrl);
// 打开网络输入流
DataInputStream dis = new DataInputStream(url.openStream());
//定义文件名,同时用随机数防止文件重名
int x=(int)(Math.random()*1000000);
String newImageName = dir + "/" + x+"pic" + i + ".jpg";
// 建立一个新的文件
FileOutputStream fos = new FileOutputStream(new File(newImageName));
byte[] buffer = new byte[1024];
int length;
System.out.println("正在下载......第 " + i + "张图片......请稍后");
// 开始填充数据
while ((length = dis.read(buffer)) > 0) {
fos.write(buffer, 0, length);
}
dis.close();
fos.close();
System.out.println("第 " + i + "张图片下载完毕......");
i++;
}
return isSuccess;
}
}

最后

当然要感谢小仙女Albee啦。

当然还有官方文档啦 : http://webmagic.io/docs/zh/

当然还有我炒鸡喜欢的纯音乐啦。

我们一直都向往,面朝大海,春暖花开。 但是几人能做到,心中有爱,四季不败?