/** * 根据ajax请求链接爬取内容 解析流程是:从rawUrl拼接上城市和limit组成一个原始页面的ajax请求url,获取内容解析成JSONArray, * array中的一项包含有title,和url_163属性("/docs/10/2015052804/AQM4VA369001VA37.html") * 和rawPageUrl:"http://j.news.163.com"拼接后得到访问的页面 我们在url缓存,存入mysql以及HBase的url都是这个pageUrl * docID("AQM4VA369001VA37"),利用docID填充入rawContentUrl * :"http://j.news.163.com/hy/doc.s?info=2&type=10&hash=&docid=%s" 组成一条新闻的ajax请求,请求返回的是一个json字符串 * 解析之后,得到contentJSON,根据这个数据得到里面的content,publish_date字段 * * @param url 从createUrl中获取到的拼接好的字符串,这是一条某城市新闻的ajax请求页面 * @author BAO */ private void craw(String url, List<ParseResult> list) { String html = null; try { html = WangyiPageParser.getHtmlFromUrl(url); } catch (BaseHttpException e1) { LOGGER.error(e1.getMessage() + "获取AJAX页面失败", e1); return; } // 解析ajax请求主页的json,如果失败就直接返回 JSONArray array = null; try { array = JSONArray.parseArray(html); } catch (Exception e) { LOGGER.error(e.getMessage() + "页面JSON解析失败", e); return; } for (int i = 0; i < array.size(); i++) { JSONObject obj = null; try { obj = array.getJSONObject(i); } catch (Exception e) { LOGGER.error(e.getMessage() + "JSON内容获取失败", e); } // 如果obj为null,就跳过 if (obj == null) continue; ParseResult result = parsePage(obj); if (result != null) { list.add(result); } if (!SystemProps.isTest()) { TimerUtils.delayForSeconds(2); } } }
/** * 解析页面中的一项JSON数据,并包装到WebPage当中,并返回WebPage * * @param obj * @param session */ private ParseResult parsePage(JSONObject obj) { WebPage page = new WebPage(); String content = ""; String pageUrl = ""; try { // 每个页面的内容依然是ajax,这里得到的是JSON数据的URL String contentUrl = WangyiPageParser.getContentUrl(obj); pageUrl = WangyiPageParser.getPageUrl(obj); String title = obj.getString("title"); String webSite = "网易新闻"; JSONObject contentJSON = WangyiPageParser.getContentJSON(contentUrl); content = WangyiPageParser.getContent(contentJSON); Timestamp publishDate = WangyiPageParser.getPublishDate(contentJSON); // 不用自带的summary,截取content前200个字符获取summary String summary = WangyiPageParser.getSummary(content); // 如果content或者title为空,则不保存页面 if (content.equals("") || title.equals("") || title == null) { return null; } page.setTitle(title); page.setUrl(pageUrl); page.setWebSite(webSite); page.setDownloadDate(new Timestamp(System.currentTimeMillis())); page.setTitle(title); page.setSummary(summary); page.setPublishDate(publishDate); page.setType(1); page.setIndexedStatus(3); } catch (Exception e) { LOGGER.error("网易新闻页面信息提取失败!"); return null; } if (content.equals("") || content == null) return null; ParseResult res = new ParseResult(); res.setPage(page); res.setContent(content); return res; }