Java爬蟲框架WebMagic
WebMagic的架構設計參照了Scrapy,而實現則應用了HttpClient、Jsoup等Java成熟的工具。

WebMagic由四個組件(Downloader、PageProcessor、Scheduler、Pipeline)構成:
Downloader : 下載器
PageProcessor: 頁面解析器
Scheduler: 任務分配、url去重
Pipeline:數據存儲、處理
WebMagic數據流轉的對象:
Request : 一個Request對應一個URL地址 。它是是PageProcessor控制Downloader唯一方式。
Page : 代表了從Downloader下載到的內容
ResultItems : 相當于一個Map,它保存PageProcessor處理的結果,供Pipeline使用。
爬蟲引擎–Spider:
Spider是WebMagic內部流程的核心,上面的四個組件都相當于Spider的一個屬性,通過設置這個屬性可以實現不同的功能。
Spider也是WebMagic操作的入口,它封裝了爬蟲的創(chuàng)建、啟動、停止、多線程等功能
使用 Maven來安裝WebMagic
1
2
3
4
5
6
7
8
9
10
WebMagic使用slf4j-log4j12作為slf4j的實現.如果你自己定制了slf4j的實現,需要項目中去掉此依賴。
1
2
3
4
5
6
7
8
9
10
11
如果不使用Maven的話,可以去http://webmagic.io中下載最新的jar包,下載之后進行解壓,然后在項目中import即可。
開始開發(fā)第一個爬蟲
項目中添加了WebMagic的依賴之后,即可開始第一個爬蟲的開發(fā)了!
下面是一個測試,點擊main方法,選擇“運行”,查看是否正常運行。
package com.example.demo; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.processor.PageProcessor; public class DemoPageGet implements PageProcessor { private Site site = Site.me(); @Override public void process(Page page) { System.out.println(page.getHtml()); } @Override public Site getSite() { return site; } public static void main(String[] args) { Spider.create(new DemoPageGet()).addUrl("http://httpbin.org/get").run(); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
編寫基本的爬蟲
在WebMagic里,實現一個基本的爬蟲只需要編寫一個類,實現PageProcessor接口即可。
這部分我們直接通過GithubRepoPageProcessor這個例子來介紹PageProcessor的編寫方式。
PageProcessor的定制分為三個部分,分別是爬蟲的配置、頁面元素的抽取和鏈接的發(fā)現。
public class GithubRepoPageProcessor implements PageProcessor { // 部分一:抓取網站的相關配置,包括編碼、抓取間隔、重試次數等 private Site site = Site.me().setRetryTimes(3).setSleepTime(1000); @Override // process是定制爬蟲邏輯的核心接口,在這里編寫抽取邏輯 public void process(Page page) { // 部分二:定義如何抽取頁面信息,并保存下來 page.putField("author", page.getUrl().regex("https://github\.com/(\w+)/.*").toString()); page.putField("name", page.getHtml().xpath("http://h1[@class='entry-title public']/strong/a/text()").toString()); if (page.getResultItems().get("name") == null) { //skip this page page.setSkip(true); } page.putField("readme", page.getHtml().xpath("http://div[@id='readme']/tidyText()")); // 部分三:從頁面發(fā)現后續(xù)的url地址來抓取 page.addTargetRequests(page.getHtml().links().regex("(https://github\.com/[\w\-]+/[\w\-]+)").all()); } @Override public Site getSite() { return site; } public static void main(String[] args) { Spider.create(new GithubRepoPageProcessor()) //從"https://github.com/code4craft"開始抓 .addUrl("https://github.com/code4craft") //開啟5個線程抓取 .thread(5) //啟動爬蟲 .run(); } }
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
追加請求的鏈接
先把鏈接通過正則匹配出來或者拼接出來,比如: page.getHtml().links().regex("").all()
再通過addTargetRequests方法 page.addTargetRequests(url) 則將這些鏈接加入到待抓取的隊列中去。
爬蟲的配置
Spider: 爬蟲程序的入口,Spider的其他組件(Downloader、Scheduler、Pipeline)都可以通過set方法來進行設置。
Site: 對站點本身的一些配置信息,例如編碼、HTTP頭、超時時間、重試策略等、代理等,都可以通過設置Site對象來進行配置。
配置http代理,在0.7.1版本開始,WebMagic開始使用了新的代理APIProxyProvider,因為相對于Site的“配置”,ProxyProvider定位更多是一個“組件”,所以代理不再從Site設置,而是由HttpClientDownloader設置。
更多內容見官方文檔。
頁面元素的抽取
WebMagic里主要使用了三種數據抽取技術:
XPath
正則表達式
另外,對于JSON格式的內容,可使用JsonPath進行解析
使用Pipeline保存結果
WebMagic用于保存結果的組件叫做Pipeline。
例如我們通過“控制臺輸出結果”這件事也是通過一個內置的Pipeline完成的,它叫做ConsolePipeline。
那么,我現在想要把結果用Json的格式保存下來,怎么做呢?
我只需要將Pipeline的實現換成"JsonFilePipeline"就可以了。
public static void main(String[] args) { Spider.create(new GithubRepoPageProcessor()) //從"https://github.com/code4craft"開始抓 .addUrl("https://github.com/code4craft") .addPipeline(new JsonFilePipeline("./webmagic")) //開啟5個線程抓取 .thread(5) //啟動爬蟲 .run(); }
1
2
3
4
5
6
7
8
9
10
模擬POST請求方法
0.7.1版本之后,廢棄了老的nameValuePair的寫法,采用在Request對象上添加Method和requestBody來實現。
Request request = new Request("http://xxx/path"); request.setMethod(HttpConstant.Method.POST); request.setRequestBody(HttpRequestBody.json("{'id':1}","utf-8"));
1
2
3
HttpRequestBody內置了幾種初始化方式,支持最常見的表單提交、json提交等方式。
HTTP Java
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。