抓取今日头条指定作者下面所有的文章,根据头条上面的userID

抓取今日头条指定作者下面所有的文章,根据头条上面的userID

         /**
 	 * 根据传过来的今日头条的作者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);
	}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值