基于WebMagic的爬虫实现(一)

WebMagic是一个简单灵活的Java爬虫框架,基于WebMagic,你可以快速开发出一个高效、易维护的爬虫程序。

你可以直接去官网查看说明文档,也可以跟随本文,一步一步地实现一个简单的知乎答案图片下载爬虫程序。

1. 新建Maven项目

在Intellij Idea中新建一个基于Maven的Module,如果你不清楚怎么新建项目,可以参考 如何新建基于Maven的Module ,确保你新建好的项目能正确运行。

2. 添加依赖,编写代码

在你的pom.xml文件中,加入WebMagic的依赖,我使用的是最新版的:

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>0.7.2</version>
</dependency>

<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>0.7.2</version>
</dependency>

新建一个ZhihuPictureSpider.java类,类的内容:

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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package com.zhaoyh.main;

import com.zhaoyh.utils.DownloadUtils;
import com.zhaoyh.utils.ValidatorUtils;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
* Created by zhaoyh on 2017/07/31.
* 知乎图片下载
*/
public class ZhihuPictureSpider implements PageProcessor {

private String basePath = null;
private static String z_c0 = null;

private static Site site = Site.me().setRetryTimes(5).setSleepTime(5000).setTimeOut(5000)
.addCookie("Domain", "zhihu.com")
.addCookie("z_c0", z_c0)
.setUserAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36");

/**
* 开始处理
* @param page
*/
public void process(Page page) {
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);

List<String> picUrlList = new ArrayList<String>();
for (int i = 0; i < urlList.size(); i = i + 2) {
String url = urlList.get(i);
if (ValidatorUtils.isLegalUrl(url)) {
picUrlList.add(urlList.get(i));
}
}
System.out.println("图片个数:" + picUrlList.size());
try {
downLoadPics(picUrlList, questionTitle, this.basePath);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 下载图片
* @param imgUrls
* @param title
* @param filePath
* @return
* @throws Exception
*/
private static boolean downLoadPics(List<String> imgUrls, String title, String filePath) throws Exception {
boolean isSuccess = true;
//标题
String storagePath = filePath + File.separator + title;
File fileDir = new File(storagePath);
if (imgUrls.size() > 0 && !fileDir.exists()) {
fileDir.mkdirs();
}
int i = 1;

//循环下载图片
for (String imgUrl : imgUrls) {
System.out.println("开始下载下载 " + imgUrl + " " + i);
String ext = imgUrl.substring(imgUrl.lastIndexOf(".") + 1);
String fullPath = storagePath + File.separator + "pic_" + System.currentTimeMillis() + "_" + i + "." + ext;
DownloadUtils.downloadPictureFromUrl(imgUrl, fullPath);
i++;
}
return isSuccess;
}

/**
* 获取站点
* @return
*/
public Site getSite() {
return site;
}

public void setBasePath(String basePath) {
this.basePath = basePath;
}

public static void main(String[] args) {
//配置
String z_c0 = "XXXXXXX";
String basePath = "XXXXX";
String answerUrl = "XXXXX";

//初始化
ZhihuPictureSpider.z_c0 = z_c0;
ZhihuPictureSpider zhihuProcessor = new ZhihuPictureSpider();
zhihuProcessor.setBasePath(basePath);

//启动
Spider spider = Spider.create(zhihuProcessor);
spider.addUrl(answerUrl);
spider.thread(2);
spider.run();
}
}

3. 写入配置并启动

在ZhihuPictureSpider.java类的main方法,前三行是你需要配置的内容,其中

1
String z_c0 = "XXXXXXX";

是你登陆状态下知乎的Cookie,如果你不知道怎么查找这个Cookie的内容,可以打开你的知乎首页,然后点击chrome浏览器的如下图的位置:
image
然后找到你的该Cookie的Value:
image

其次配置好你的图片存储目录,填上你常用的目录即可。

1
String basePath = "XXXXX";

最后是找到知乎你感兴趣的某个回答,或者某个链接,填入到:

1
String answerUrl =  "XXXXX";

以上你就完成了第一个爬虫程序的所有配置步骤,右击点击run即可查看运行效果,下图是我本地的运行效果:

image

代码下载:github