B站,N站,汤站,爬虫下载资源总结与技巧(一)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

前言

  • 自己主要是IOS,但是也想业余时间学学后台的一点,之前用过mfc,c#,写点嵌入式辅佐小工具,现在入坑脱做IOS.所以,想向全栈走,就业余时间看看springboot相关,前三篇是不同类型的爬虫代表,今天说说下载对应资源的不同处理。本篇只说一些第三方API使用,其他的下载具体处理会在下期。

webmagic简介地址(请点击)

注意

  • 各种网站的资源都有防盗链处理,第一步,获取资源真实链接。第二步,分析防盗链机制。第三步,资源去重。

  • NicoNico视频资源是采用Cookies校验,破解难度大且麻烦,找第三方 http://www.movies-downloader.com,这里面有个post的搜索api可是使用。在爬的时候发现,老资源都会统一指到一个温馨提示,视频资源。简单地校验视频md5就可以去重了。

  • BiliBili视频资源是采用链接地址解密的办法,解析也可以用第三方 http://www.flvurl.cn/。暂时发现重复的不高。

  • Tumblr最简单什么加密都没有。直接下载就可以了,但是重复资源海量,可以对封面,头像,同时做md5作去重处理。

代码

哔哩哔哩第三方转换

  • 这个返回是Json格式,格式化相对较好。
/**
 * Created by ray on 2017/6/18.
 * 获取 BILIBILI 视频真实地址
 */
@Service
public class FlvUrlService {

    @Value("${flvurl.appId}")
    String appIdKey;

    @Autowired
    RestTemplate restTemplate;

    private String baseUrl = "http://api.v2.flvurl.cn/parse/";

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    public JSONObject parse (String url){
        String reqUrl = baseUrl + "?appid=" + appIdKey + "&type=vod&url=" + url;
        String string = restTemplate.getForObject(reqUrl , String.class);
        JSONObject jsonObject = JSON.parseObject(string,JSONObject.class);
        return jsonObject;
    }

    public FlvUrlRecModel parseToObject (String url){
        String reqUrl = baseUrl + "?appid=" + appIdKey + "&type=vod&url=" + url;
        String string = "";
        FlvUrlRecModel jsonObject = null;
        try {
            string = restTemplate.getForObject(reqUrl , String.class);
            jsonObject = JSON.parseObject(string,FlvUrlRecModel.class);
            return jsonObject;
        }
        catch (Exception e){
            logger.error(reqUrl);
            return null;
        }

    }

NicoNico第三方转换

  • 这个返回是XML格式,要注意各种处理,还有容错。
/**
 * Created by ray on 2017/7/23.
 * 获取NICONICO 视频真实地址
 */

@Service
public class NicoVideoUrlService {

    @Autowired
    RestTemplate restTemplate;

    //post
    private String baseUrl = "http://www.movies-downloader.com/a.cgi";

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    public NicoVideoRecModel parse (String url){

        //url = "http://www.nicovideo.jp/watch/sm31610292";

        NicoVideoRecModel recModel = null;
        String reqUrl = baseUrl;

        try {
            //head
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
            //body
            MultiValueMap map = new LinkedMultiValueMap();
            map.add("url", url);
            //请求封装
            HttpEntity> request = new HttpEntity>(map, headers);
            String body = restTemplate.postForEntity(reqUrl,request,String.class).getBody();
            //logger.info("req map:" + map.toString()  + " body:" + body);



            Html html = new Html(body);
            String aid = url.substring(url.lastIndexOf("/") + 1,url.length());
            String title = html.xpath("//b/text()").toString();
            String imgsrc = html.xpath("//img/@src").toString();
            String href = html.xpath("//a/@href").toString().split("=")[1];
            String videoUrl = "";

            videoUrl = URLDecoder.decode(href,"UTF-8");

            recModel = new NicoVideoRecModel();
            recModel.setAid(aid);
            recModel.setTitle(title);
            recModel.setImgsrc(imgsrc);
            recModel.setVideoUrl(videoUrl);

            logger.info("Nico Api:" + map.toString()  + " body:" + JSON.toJSONString(recModel));
        }
        catch (Exception e){
            logger.error(reqUrl);

        }
        return recModel;
    }

}

原文:http://raychow.linkfun.top/2017/12/22/archives/9_javaSpring/spriderDown/index/

转载于:https://my.oschina.net/u/3729367/blog/1593884

你可能感兴趣的:(B站,N站,汤站,爬虫下载资源总结与技巧(一))