/**
* 根据传过来的今日头条的作者ID,获取所有的文章列表
* 并在过滤后添加进数据库
*
* @param dto 这个里面放置着在数据库里面保存的作者的详细信息,
ID就是本地的作者ID
* @author XiaoMingHui
* @throws InterruptedException
* @date 2017-8-1 下午5:59:46
*/
@Override
public void getAllArticleByAuthorId(ArticleSourceDto dto)
throws InterruptedException {
// 获取当前时间戳
long d = System.currentTimeMillis() / 1000L;
// 对比的时间
long contrstTimeL = getContrastTimeLong(dto);
// 判断抓取数据失败的次数
int i = 0;
while (true) {
// 如果抓取数据过程中不停顿的话,会造成今日头条网站不返回数据
Thread.sleep(JitvGuidUtil.getRandom(500, 10000));
// 文章列表map
Map<String, Object> map = getArticleList(dto.getAuthorId(), "1", "30", d);
if (map == null) {// 抓取数据失败,记录次数,线程停顿一段时间
i++;
Thread.sleep(JitvGuidUtil.getRandom(500, 10000));
// 当失败次数达到一定次数,就不再走下去了。
if (i > 5){
break;
}
continue;
}
// 成功抓取,则清空抓取失败次数
i = 0;
// 保存到long d 里面,下次循环抓取使用
d = getNexTimeLong(map);
// 判断是否停止循环
// addListByMap方法把获取到的文章map里面的数据添加到数据库
if (addListByMap(map, dto.getId(), contrstTimeL)) {
break;
}
}
}
/**
* 查询数据库获取到该来源最新一条的热文dto,
* 并获取上一次更新的时间,返回上一次更新时间的时间戳
* 没有抓取过就返回0
*
* @param dto
* @return
* @author XiaoMingHui
* @date 2017-8-4 下午3:50:38
*/
private long getContrastTimeLong(ArticleSourceDto dto) {
// 查询作者最新一条更新的数据
HotPageDto hDto = hotPageDao.getHotPageDtoByArticleSourceId(dto.getId());
if (hDto != null && hDto.getId() != null) {
// 如果存在数据,就获取到该数据的数据创建时间,
// 创建时间即为上次更新的时间
// 将其转换为long的时间戳
return hDto.getCreationTime().getTime() / 1000L;
}
return 0;
}
/**
* 根据各种参数,获取到今日头条作者下的文章列表
*
* @param userId 作者ID
* @param pageType 1是文章
* @param date 当前时间戳,long格式
* @param pageSum 每页多少数据
* @return
* @author XiaoMingHui
* @date 2017-8-1 下午6:04:05
*/
private Map<String, Object> getArticleList(String userId, String pageType,
String pageSum, long date) {
try {
// 根据用户ID获取用户的列表信息
String json = com.aspire.commons.HttpClientHelper.getInstance().post(
Constant.HTTP_JRTT_USERARTICLE,
new NameValuePair("page_type", pageType),
new NameValuePair("user_id", userId),
new NameValuePair("max_behot_time", date + ""),
new NameValuePair("count", pageSum),
new NameValuePair("as", "A18539E7A918279"),
new NameValuePair("cp", "5979A8F29759AE1"));
return com.aspire.commons.util.JsonUtil.toBean(json, Map.class);
} catch (Exception e) {
return null;
}
}
/**
* 从今日头条返回的数据中,获取到下一页的时间戳,用于抓取翻页
*
* @param map
* @return
* @author XiaoMingHui
* @date 2017-8-2 下午6:17:21
*/
@SuppressWarnings("unchecked")
private long getNexTimeLong(Map<String, Object> map) {
// 获取到下一页的时间戳
Object o = ((Map<String, Object>) map.get("next")).get("max_behot_time");
if (o instanceof Integer) {
return (Integer) o;
} else {
return (long) o;
}
}
/**
* 把获取到的文章map里面的数据循环添加进list<dto>里面
*
* @param map 文章列表map
* @param id 来源表ID
* @param contrstTimeL 对比的时间,判断是否要继续抓取
* @return 根据查找到的datalist,是否存在数据,有就返回false,没有就true,用于判断是否要继续循环
* @author XiaoMingHui
* @date 2017-8-4 下午4:05:06
*/
@SuppressWarnings("unchecked")
private boolean addListByMap(Map<String, Object> map, String id, long contrstTimeL) {
// 获取到文章List
List<Map<String, Object>> datalist = (List<Map<String, Object>>) map.get("data");
// 没有数据是就返回true
if (datalist == null || datalist.size() < 1)
return true;
List<HotPageDto> hDtoList = new ArrayList<HotPageDto>();
// 遍历文章列表
for (Map<String, Object> dataMap : datalist) {
// 过滤视频
if ((boolean) dataMap.get("has_video"))
continue;
// 获取今日头条文章map里面的文章发布时间
long time = getMapbehot_time(dataMap);
// 如果文章更新比抓取更新时间早的话,就不继续抓取
// 就是如果数据库中存在改数据,就会进行时间对比,只抓取比上次更新时间晚的数据
if (time <= contrstTimeL)
return true;
hDtoList.add(getDtoByMap(dataMap, id, time));
}
hotPageService.addHotpageList(hDtoList);
return false;
}
/**
* 获取今日头条文章map里面的文章发布时间
*
* @param dataMap
* @return
* @author XiaoMingHui
* @date 2017-8-4 下午4:23:10
*/
private long getMapbehot_time(Map<String, Object> dataMap) {
//获取到时间戳
Object o = dataMap.get("behot_time");
if (o instanceof Integer) {
return (Integer) o;
} else {
return (Long) o;
}
}
/**
* 把今日头条抓取到的文章map转换为热文dto
*
* @param dataMap
* @param id
* @param time
* @return
* @author XiaoMingHui
* @date 2017-8-4 下午4:20:25
*/
private HotPageDto getDtoByMap(Map<String, Object> dataMap, String id,
long time) {
// 随机ID
String dtoId = JitvGuidUtil.getGuid();
// 文章标题
String title = (String) dataMap.get("title");
// 封面图片
String image_url = (String) dataMap.get("image_url");
image_url = PictureUtils.save(countImgUrl(image_url));
// 文章ID
String source_url = (String) dataMap.get("source_url");
// 摘要
String abstractt = (String) dataMap.get("abstract");
// 原文地址
String display_url = (String) dataMap.get("display_url");
// 发布时间
Date pDate = new Date(time * 1000L);
return new HotPageDto(dtoId, title, image_url, source_url, abstractt,
new Date(), display_url, id, pDate);
}