Java爬蟲框架WebMagic

      網友投稿 878 2025-04-01

      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

      us.codecraft webmagic-core 0.7.3 us.codecraft webmagic-extension 0.7.3

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      WebMagic使用slf4j-log4j12作為slf4j的實現.如果你自己定制了slf4j的實現,需要項目中去掉此依賴。

      us.codecraft webmagic-extension 0.7.3 org.slf4j slf4j-log4j12

      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

      正則表達式

      CSS選擇器

      另外,對于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

      Java爬蟲框架WebMagic

      HttpRequestBody內置了幾種初始化方式,支持最常見的表單提交、json提交等方式。

      HTTP Java

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Excel表格中橫排數字變成豎排文字的操作方法(如何把excel表格豎排文字變成橫排)
      下一篇:excel表格中雙擊單元格不能直接編輯修改怎么辦?
      相關文章
      亚洲国产精品自在线一区二区| 国产精品V亚洲精品V日韩精品| 亚洲乱码一区二区三区在线观看| 亚洲av中文无码| 久久无码av亚洲精品色午夜| 亚洲日本一线产区和二线| 在线综合亚洲欧洲综合网站| 亚洲乱码一区二区三区国产精品| 亚洲人成电影院在线观看| 亚洲国产日韩在线成人蜜芽| 亚洲精品电影天堂网| 亚洲精品免费在线视频| 亚洲系列国产精品制服丝袜第| 亚洲综合综合在线| 亚洲国产韩国一区二区| 亚洲精品在线免费观看| 亚洲综合区图片小说区| 亚洲va成无码人在线观看| 亚洲伊人久久大香线焦| 亚洲精品第一综合99久久| 亚洲欧美不卡高清在线| 噜噜综合亚洲AV中文无码| 亚洲成a人片在线观看国产| 亚洲AV中文无码乱人伦| 中文字幕亚洲电影| 亚洲国产日韩在线视频| 亚洲日韩图片专区第1页| 亚洲美女精品视频| 最新亚洲春色Av无码专区| 亚洲成在人线在线播放无码| 亚洲A∨精品一区二区三区| 亚洲国产成人久久精品99| 亚洲一区二区精品视频| 国产亚洲精品a在线无码| 亚洲欧洲日韩不卡| 亚洲乱码在线播放| 亚洲av日韩综合一区二区三区| 亚洲女同成人AⅤ人片在线观看| 在线观看亚洲精品福利片| 久久久久亚洲精品成人网小说| 亚洲网红精品大秀在线观看|