爬虫下载资源总结与技巧(一)
前言
- 自己主要是IOS,但是也想业余时间学学后台的一点,之前用过mfc,c#,写点嵌入式辅佐小工具,现在入坑脱做IOS.所以,想向全栈走,就业余时间看看springboot相关,前三篇是不同类型的爬虫代表,今天说说下载对应资源的不同处理。本篇只说一些第三方API使用,其他的下载具体处理会在下期。
注意
-
各种网站的资源都有防盗链处理,第一步,获取资源真实链接。第二步,分析防盗链机制。第三步,资源去重。
-
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<String, String> map = new LinkedMultiValueMap<String, String>();
map.add("url", url);
//请求封装
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(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;
}
}