文章目录
  1. 1. 关于网络爬虫
  2. 2. DEMO
    1. 2.1. WebMagic 架构
    2. 2.2. 配置
    3. 2.3. 分析和准备
    4. 2.4. 编写
    5. 2.5. 结果
    6. 2.6. 拓展

前些天,在百度搜索的时候发现一个坑爹的事情。别人未经同意抓取了我的博客文章,更气人的是搜索结果第一条也被他抢去。百度我已无力吐槽,只是这些抓取别人博客的人太可恨。言归正传,我不是来吐槽百度和那些网站的,他们抓取我的文章,肯定是用了网络爬虫。互联网离不开爬虫,爬虫这么重要,我也来学学爬虫,抓一些数据玩一玩。

关于网络爬虫

之前有做过一些网站 SEO 优化的事情,SEO 优化实质就是为了让网络爬虫更容易抓取到数据,并能够优先抓取我们的网站的数据。网络爬虫,又叫做网页蜘蛛。关于网络爬虫更多信息,可以查看百科的解释。网络爬虫的架构如下图:

Architecture of a Web crawler

网上开源的网络爬虫有很多,经过多方查找和看评价,最终选择尝试一下 WebMagic 。WebMagic是一个简单灵活的爬虫框架。基于WebMagic,你可以快速开发出一个高效、易维护的爬虫。

DEMO

WebMagic 架构

WebMagic 的架构如图:

TheArchitectureOfWebmagic

配置

首先要添加依赖,如下:

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

分析和准备

我们以抓取博客园搜索结果页的链接地址为例。打开博客园,搜索 Android Monkey ,我们要把搜索结果页中的搜索结果链接抓取出来。

详细分析和准备步骤是:

  1. 首先准备搜索链接: http://zzk.cnblogs.com/s/blogpost?Keywords=android+log%E5%B7%A5%E5%85%B7%E7%B1%BB (搜索 Android Monkey 的第 27 页)
  2. 查看搜索结果页的源码,找到搜索结果链接,如 http://www.cnblogs.com/jingle1267/p/4068020.html ,查看所有的搜索结果链接,可以发现:博客园的文章链接结构是 http://www.cnblogs.com/…/数字.html ,即域名为博客园的二级域名,文章页面时一个数字串.html ,中间部分不用太关注。
  3. 根据搜索结果链接的规则,我们可以写正则匹配出所有的链接地址。

编写

经过上面的分析和准备,接下来我们需要实现 WebMagic 的 PageProcessor ,代码如下:

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
package com.ihongqiqu.cnblogs;

import com.google.common.collect.Lists;
import us.codecraft.webmagic.*;
import us.codecraft.webmagic.pipeline.CollectorPipeline;
import us.codecraft.webmagic.pipeline.ResultItemsCollectorPipeline;
import us.codecraft.webmagic.processor.PageProcessor;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;

/**
* 网址抓取器
* <p>
* Created by zhenguo on 10/14/16.
*/

public class CnblogsProcessor implements PageProcessor {

public static final String BLOG_URL = "http://zzk.cnblogs.com/s/blogpost?Keywords=%s&pageindex=%d";

public void process(Page page) {
// http://www.cnblogs.com/sunjialiang/archive/2011/08/16/2140636.html
List<String> strings = page.getHtml().links().regex("http://www\\.cnblogs\\.com/.*/?\\d+\\.html").all();
page.putField("url", strings);
}

public Site getSite() {
return Site.me().setDomain("zzk.cnblogs.com")
.setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31")
.setCharset("GBK").setSleepTime(500);
}

public static void main(String[] args) {
CollectorPipeline<ResultItems> collectorPipeline = new ResultItemsCollectorPipeline();

Spider.create(new CnblogsProcessor())
.addUrl(
"http://zzk.cnblogs.com/s/blogpost?Keywords=android+log%E5%B7%A5%E5%85%B7%E7%B1%BB"
)
.addPipeline(collectorPipeline)
.run();
List<ResultItems> resultItemsList = collectorPipeline.getCollected();
List<String> urls = Lists.newArrayList();
for (ResultItems items : resultItemsList) {
List<String> suburls = items.get("url");
urls.addAll(suburls);
}

for (String url : urls) {
System.out.println(url);
}
System.out.println("\n共计 " + urls.size() + " 条信息");
System.out.println("\n===================\n");
}

}

结果

运行 main 方法后,控制台输入的结果如下:

WebMagic Cnblogs Search Result

拓展

根据上面的分析,我们已经可以抓取到搜索结果页的链接,但是这个只是抓取单个页面的数据。通过对搜索链接的分析,其实搜索链接也是有规律可循的,我们可以设置搜索的关键字和抓取的页码,具体键代码:

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
/**
* 根据关键字也分页数来抓去所有搜索到的博文链接
*
* @param keyword 要搜索的关键字
* @param pageStart 开始的分页 pageStart >= 1 默认是1
* @param pageSize 要抓取的页数 pageSize >= 1 默认是1
* @return 搜索到的过滤后的博文链接
*/

public List<String> getUrls(String keyword, int pageStart, int pageSize) {
pageStart = pageSize < 1 ? 1 : pageStart;
pageSize = pageSize < 1 ? 1 : pageSize;

String[] searchUrls = new String[pageSize];
for (int i = 0; i < pageSize; i++) {
try {
searchUrls[i] = String.format("http://zzk.cnblogs.com/s/blogpost?Keywords=%s&pageindex=%d",
URLEncoder.encode(keyword, "UTF-8"), pageStart + i);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}

CollectorPipeline<ResultItems> collectorPipeline = new ResultItemsCollectorPipeline();

Spider.create(new CnblogsProcessor())
.addUrl(searchUrls)
.addPipeline(collectorPipeline)
.run();

List<ResultItems> resultItemsList = collectorPipeline.getCollected();
List<String> urls = Lists.newArrayList();
for (ResultItems items : resultItemsList) {
List<String> suburls = items.get("url");
urls.addAll(suburls);
}

System.out.println("\n共计 " + urls.size() + " 条信息");
System.out.println("\n===================\n");
return urls;
}

正如 WebMagic 作者所言:WebMagic是一个简单灵活的爬虫框架。网络爬虫真实一个好工具!


本文地址 http://ihongqiqu.com/2016/10/26/web-crawler/ 作者为 Zhenguo

author:Zhenguo
Author: Zhenguo      Blog: http://ihongqiqu.com/     Email: jinzhenguo1990@gmail.com
I have almost 6 years of Android application development experience and have a keen interested in the latest emerging technologies. I use my spare time to turn my experience, ideas and love for Android tech into informative articles, tutorials and more in hope to help others and learn more.
文章目录
  1. 1. 关于网络爬虫
  2. 2. DEMO
    1. 2.1. WebMagic 架构
    2. 2.2. 配置
    3. 2.3. 分析和准备
    4. 2.4. 编写
    5. 2.5. 结果
    6. 2.6. 拓展
返回顶部