話不多說,直接上代碼,代碼中註釋都寫的很清楚了!!!
這樣吧,加一個流程圖,用來方便的瞭解WebMagic
package com.softeem.demo;
import java.awt.print.Pageable;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.List;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Html;
import us.codecraft.webmagic.selector.Selectable;
/**
*
* @author 張智遠
*
*WebMagic框架 使用Java原生開發方式
*核心很簡單,功能性給簡單性讓步
*四個核心組件
*PageProcessor 負責解析頁面
*Scheduler負責管理待抓取的URL
*Pipeline 負責抽取結果處理,做持久化操作
*Downloader 負責從網上下載頁面
*/
public class GetPhoneNumber implements PageProcessor{
PrintWriter pw=null;
//抓取網站的相關配置
private Site site=Site.me()
.setCharset("utf-8")//設置字符集
.setTimeOut(10000)//設置超時時間
.setRetrySleepTime(3)//設置重試次數
.setSleepTime(1000);//設置休眠時間
@Override
public Site getSite() {
return site;
}
//爬取邏輯
@Override
public void process(Page page) {
//獲取到通過Downloader下載下來的URL
Selectable url= page.getUrl();
System.out.println(url);
//通過正則表達式去匹配是否是我們想要的抓取的網頁URL 正則表達式只能匹配格式的爭取行,不能檢驗數據的有效性
if(url.regex("http://www.taohaoma.com/mobile/number\\?p=\\d&order=").match()) {
//開始抓取有用信息
//System.out.println("匹配成功!");
//獲取頁面信息
Html html=page.getHtml();
//System.out.println(html);
//通過Xpath去解析Html Xpath是w3c XSLT標準的主要元素 還是一門在xml文檔中查找信息的語言
//XQuery和Xpointer都是構建在Xpath之上
List<String> list=html.xpath("[@id='f12']/table/tbody/tr/td[1]/a/text()").all();//用id進行定位
//將文件保存到本地
downPhoneNumber(list);
for (String string : list) {
System.out.println(string);
}
}
}
//將內容存放到本地的方法
public void downPhoneNumber(List<String> list) {
//描述存的位置路徑文件
File file=new File("D:/phoneNumber1.txt");
try {
//輸出流
FileOutputStream fos=new FileOutputStream(file);
//字符流
pw=new PrintWriter(fos,true);
//往本地輸出
for (String string : list) {
pw.println(string);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
if(pw!=null)pw.close();
}
}
//程序入口
public static void main(String[] args) {
Spider.create(new GetPhoneNumber())
.thread(1)
.addUrl("http://www.taohaoma.com/mobile/number?p=1&order=")
.run();
}
}