微信公众号开发--善忘影视(七)
微信公众号开发--善忘影视(七)
今天我们就来说说数据抓取的问题,数据来源电影网站的数据抓取。首先想着用网上现成的爬虫程序去抓取想要数据,然后倒入到数据库中。
- 八抓鱼采集器
测试了一下, 抓取数据什么的功能不是很复杂, 自己设计的表数据, 住去也都是图形化界面,还有能直接导入的,功能还是挺齐全的, 但是免费版本没办法用。功能限制太大了。对于我导入数据来说太难了,毕竟影视的数据会很多。看下图资费情况 ,如果用于商业的话, 其实也还行,可以节约不少开发时间。不过配置起来的, 还是需要懂一点点代码的,不懂代码来用的话难度还是不小的。
- 火车头采集器
和上面的原因的, 需要自己配置懂点html代码什么的,价格的话, 可能会便宜的, 如下图
所以这两个免费版本都不符合要求, 我还是自己写代码来抓取好了。 桌子前也有过抓取代码的经验, 所以写这个简单的抓取连接并不难。
java抓取数据,解析html比较简单。是用jsoup来做就好。方便快捷。再通过定时器来抓取,比较方便使用。如下代码以‘电影天堂’示例。
网站编码gbk,直接通过jsoup获取会有中文部分乱码,通过去连接url设置字符编码就可以解决乱码问题。
public static String readHtml(String myurl,String charsetName) {
StringBuffer sb = new StringBuffer();
URL url;
try {
url = new URL(myurl);
BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream(), charsetName));
String s = "";
while ((s = br.readLine()) != null) {
sb.append(s + "\r\n");
}
br.close();
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
return sb.toString();
}
一下就是抓取数据的主要代码,就只有几十行
public void downloadUrl(String urlString) {
for (int i = min_page; i <= max_page; i++) {
String url = String.format(urlString, i);
System.out.println("当前链接:" + url);
//这里需要设置http://www.dytt8.net/作为baseurl,解析连接的时候,会补上
Document doc1 = Jsoup.parse(readHtml(url,"GBK"),
"http://www.dytt8.net/");
//解析列表页面链接
Elements links = doc1.select(".co_content8 .ulink");
Elements links = doc1.select("a");
for (Element link : links) {
String absHref = link.attr("abs:href");
if (absHref.indexOf("gndy") == -1 && absHref.indexOf("tv") == -1) {
continue;
}
String title = link.text();
if (StringUtils.isNull(title)) {
continue;
}
//获取链接是否已经存在了,如果存在了,就返回对象
MovieCrawl mc = weiXinService.selectMovieCrawlBySourceUrl(absHref);
System.out.println(absHref);
//解析具体页面字段信息
Document doc = Jsoup.parse(readHtml(absHref,"GBK"), "http://www.dytt8.net/");
MovieCrawl movieCrawl = new MovieCrawl();
Elements contents = doc.select(".co_content8 #Zoom p");
Iterator<Element> it1 = contents.iterator();
if (it1.hasNext()) {
Element content = it1.next();
movieCrawl.setContent(content.html());
}
Elements tables = doc.select(".co_content8 #Zoom table a");
Iterator<Element> it2 = tables.iterator();
List<String> list = new ArrayList<>();
while(it2.hasNext()) {
Element downloadlink = it2.next();
list.add(downloadlink.text());
}
movieCrawl.setPubTime(new Date());
movieCrawl.setCreateTime(new Date());
movieCrawl.setMovieType(7);
movieCrawl.setSourceUrl(absHref);
movieCrawl.setTitle(title);
if (null != mc) {//如果已经抓取过了, 就要判断下载链接是否更新
weiXinService.updateMovieCraw(mc, list);
} else {
weiXinService.insertMovieCraw(movieCrawl, list);
}
}
}
}
这个就是获取url的路径调用方式
String urlString23 = "http://www.ygdy8.net/html/gndy/dyzz/list_23_%1$s.html";
String url = String.format(urlString, i);