java webmagic 抓取靜態網頁資源,抓取動態網頁資源
阿新 • • 發佈:2018-11-06
webmagicJava爬蟲框架
fastjson 阿里巴巴提供的 json 轉為物件的快捷包,裡面有下載jar包的地址
抓取靜態網頁資源 。例項:抓取李開復部落格:標題,內容,釋出日期。
public class LiKaiFuBlogReading implements PageProcessor{ private Site site = Site.me().setRetryTimes(3).setSleepTime(2000); private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static final String startPage = "http://blog.sina.com.cn/s/articlelist_1197161814_0_1.html"; // 目錄頁 public static void main(String[] args) { // TODO Auto-generated method stub Spider.create(new LiKaiFuBlogReading()) .addPipeline(new JsonFilePipeline("C:\\Users\\Root\\Desktop\\Spider")) // 寫入到本地的Spider 資料夾裡,如果沒有就會自動生成。 .addUrl(startPage) .thread(10) .run(); } @Override public Site getSite() { return site; } @Override public void process(Page page) { String url = page.getRequest().getUrl(); if(url.startsWith("http://blog.sina.com.cn/s/articlelist_1197161814_0_1.html")) // 目錄頁開始 { // 提取目錄列表 List<String> links = page.getHtml().xpath("//span[@class='atc_title']/a/@href").all(); page.addTargetRequests(links); //然後提取其他列表頁地址 links = page.getHtml().xpath("//ul[@class='SG_pages']/li/a/@href").all(); page.addTargetRequests(links); page.setSkip(true); }else if(url.startsWith("http://blog.sina.com.cn/s")){ //內容頁 // 獲取 第一篇 李開復:母親的十件禮物|悼文 內容 文章標題 // 標題 String title = page.getHtml().xpath("//h1[@class='h1_tit']/text()").get(); // 內容 String content = page.getHtml().xpath("//div[@class='BNE_cont']/allText()").get(); // 時間 String timeAndSource = page.getHtml().xpath("//span[@class='time SG_txtc']/text()").get(); // // 閱讀數 // String readingAmount = page.getHtml().xpath("//div[@class='BNE_txtA OL']/span[1]/text()").get(); // //評論數 // String comment = page.getHtml().xpath("//div[@class='BNE_txtA OL']/span[2]/text()").get(); if(title==null && content == null ) // 說明不是第一篇 李開復:母親的十件禮物|悼文 ,需要重新 get 內容 { title = page.getHtml().xpath("//div[@class='articalTitle']/h2/text()").get(); content = page.getHtml().xpath("//div[@id='sina_keyword_ad_area2']/allText()").get(); // 抓取樣式 : ((2018-01-26 18:24:31) timeAndSource = page.getHtml().regex("\\d{4}-\\d{2}-\\d{2}\\s\\d+.\\d+.\\d+").toString(); }// 最終保證 不為空 page.putField("CONTENT",content); //置入 文章內容 page.putField("TITLE",title); // 置入文章標題 page.putField("URL", url); // 存入 url try { long pubtime = format.parse(timeAndSource).getTime(); page.putField("PUBTIME", pubtime); } catch (ParseException e) { e.printStackTrace(); } page.putField("PUBTIME",timeAndSource); // 置入文章標題 } } }
抓取動態網頁資源。 需要 fastjson.jar 包。示例,抓取京東手機頁:手機名稱,價格(是動態抓取的),詳情頁連線,產品 ID。
public class JingDongMobilePhone implements PageProcessor { private Site site = Site.me().setRetryTimes(3).setSleepTime(2000); private static AddJDMoblieInfo addJDMoblieInfo; // private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //public static final String startPage = "http://list.jd.com/list.html?cat=9987,653,655"; // 京東起始頁 public static final String startPage = "http://list.jd.com/list.html?cat=9987,653,655"; // 京東起始頁 http://item.jd.com/5089273.html public static void main(String args[]) { addJDMoblieInfo = new AddJDMoblieInfo(); Spider spider = Spider.create(new JingDongMobilePhone()); spider.addPipeline(new JsonFilePipeline("C:\\Users\\User\\Desktop\\Spider")); spider.addUrl(startPage); spider.thread(100); spider.run(); } @Override public Site getSite() { // TODO Auto-generated method stub return site; } @Override public void process(Page page) { String url = page.getRequest().getUrl(); // System.out.println("請求的url是:"+url); if(url.startsWith("http://list.jd.com/list.html?cat=9987,653,655")) { // 手機列表頁 // 獲取手機的所有連結 List<String> links = page.getHtml().xpath("//div[@class='p-img']/a/@href").all(); page.addTargetRequests(links); // 獲取其他列表的資訊 下一頁的資訊 String nextLink = page.getHtml().xpath("//a[@class='pn-next']/@href").get(); nextLink = "http://list.jd.com"+nextLink; page.addTargetRequest(nextLink); // page.setSkip(true); }else if(url.startsWith("http://item.jd.com/")){ // 手機詳情頁 http://item.jd.com/7437780.html /** * 手機資訊顯示詳情頁 * 1. 產品名稱 * 2. 產品價格 */ page.putField("shoujiUrl", url); // 產品 id想· String skuId = url.replace("http://item.jd.com/", "").replace(".html", ""); page.putField("SKUID", skuId); // //產品名稱 String name = page.getHtml().xpath("//div[@class='sku-name']/text()").get(); page.putField("NAME", name); String ajaxLink ="http://p.3.cn/prices/mgets?skuIds=J_"+skuId+""; // 此連結是通過 查詢頁面的請求連線,最後拼接出來的請求,目前來說這種拼接還是需要人工來拼接 page.putField("priceUrl", ajaxLink); // try { // addJDMoblieInfo.insertMobileUrlNameSkuId(url, name, skuId); // } catch (SQLException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } page.addTargetRequest(ajaxLink); }else if(url.startsWith("http://p.3.cn/prices/mgets?")){ String skuId = url.replace("http://p.3.cn/prices/mgets?skuIds=J_", ""); page.putField("SkuId", skuId); String json = page.getRawText(); JSONArray jsonArray = JSONArray.parseArray(json); Price price = jsonArray.getObject(0, Price.class); String JDPrice = price.getOp(); page.putField("JDPrice", JDPrice); // try { // addJDMoblieInfo.insertMobilePrice(skuId, JDPrice); // 這些是新增到資料庫的操作 // } catch (SQLException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } } } } // 源網頁 http://list.jd.com/list.html?cat=9987,653,655&page=2&sort=sort_rank_asc&trans=1&JL=6_0_0&ms=5#J_main // 接受網頁 http://list.jd.com /list.html?cat=9987,653,655&page=4&sort=sort_rank_asc&trans=1&JL=6_0_0
Price.java
public class Price { private String op; private String m; private String id; private String p; public String getOp() { return op; } public void setOp(String op) { this.op = op; } public String getM() { return m; } public void setM(String m) { this.m = m; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getP() { return p; } public void setP(String p) { this.p = p; } }