JAVA爬虫(一):豆瓣电影排行榜爬取
JAVA爬虫(一):豆瓣电影排行榜爬取
前言
最近和大创队友一起给大创做的APP增添了新功能,新功能中需要用到爬取豆瓣、QQ音乐、哔哩哔哩等网站。所以写下博客记录这一过程,也算是和大家分享一些经验。
流程图
步骤
一、爬取豆瓣电影榜单网页源代码
为实现这一功能,第一步是需要获取豆瓣热门电影榜单的网页源代码,我们采用Jsoup库中的connect方法建立连接,再用userAgent方法模拟浏览器进行网页访问,再用post方法获取数据。得到的是HTML格式的网页源代码,如下图:
二、网页源码解析
HTML格式解析:
我们发现电影信息存储在上图所示的地方,那我们只需要对这一层进行解析获取数据即可。用Jsoup中的select方法定位至这一区域,再用attr方法逐层选择需要的信息,比如我们获取了”href”下的电影链接、”title”下的电影名字,”src”下的电影图片等等。
总体代码如下
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class Get_DBfilm {
public void main() throws IOException {
String url = "http://movie.douban.com/chart";
//获取html
Document doc = Jsoup.connect(url)
.maxBodySize(Integer.MAX_VALUE)
.data("query", "Java")
.cookie("auth", "token")
.userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134")
.timeout(10000)
.post();
//System.out.println(doc);
//逐层分析html
Elements a = doc.select("div[class=\"\"]");
System.out.println(a);
Elements b= a.select("a[class=nbg]");
//String c = b.attr("href");
//System.out.println(b);
//System.out.println(c);
List<String> url_list = new ArrayList<>();
for(Element element : b){
String video_url = element.attr("href"); // 电影链接地址
String video_name = element.attr("title"); // 电影名字
url_list.add(video_url);
Elements d= element.select("img");
String img_url = d.attr("src"); //电影图片
System.out.println(video_name);
System.out.println(img_url);
System.out.println(video_url);
}
}
}
三、爬取单个电影网页源码
在获取电影榜单之后,我们可以得到每个电影对应的url,就可以进入对应电影的网页获取源代码。之后再进行源代码爬取、HTML解析,过程与上文爬取电影榜单类似,不再赘述。下图为《海王》的电影信息。
四、源代码解析及关键信息获取
最后我们可以得到电影详细信息,由于我们功能需要,我们只爬取了电影导演、电影主演、剧情简介、电影图片等信息。大家可以根据网页返回信息自行添加需要获取的信息。
单个电影信息获取总体代码如下
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class film {
public List main(String url) throws IOException {
List<String> info_list = new ArrayList<>();
info_list.add(url);
//获取html
Document doc = Jsoup.connect(url)
.maxBodySize(Integer.MAX_VALUE)
.data("query", "Java")
.cookie("auth", "token")
.userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134")
.timeout(10000)
.post();
Elements a = doc.select("script[type=\"application/ld+json\"]");
String film_Json = a.toString();
String film_json = film_Json.substring(film_Json.indexOf(">")+1,film_Json.lastIndexOf("<"));
try {
JSONObject film_info = new JSONObject(film_json);
//电影导演
JSONArray director_data=film_info.getJSONArray("director");
String director_name = "";
for(int j=0;j<director_data.length();j++) {
director_name = director_name + director_data.getJSONObject(j).getString("name") + " ";
System.out.println("director_name:" + director_name);
}
//电影主演
JSONArray actor_data=film_info.getJSONArray("actor");
String actor_name = "";
for(int j=0;j<actor_data.length();j++) {
actor_name= actor_name + actor_data.getJSONObject(j).getString("name") + " ";
System.out.println("actor_name:" + actor_name);
}
String info = director_name +
actor_name;
info_list.add(info);
//剧情简介
Elements b = doc.select("span[property=\"v:summary\"]");
String film_summary =CharMatcher.whitespace().trimFrom(b.text());
System.out.println(film_summary);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return info_list;
}
}
说明
参数输入“url”是上文“二、网页源码解析” 中获取的对应每一部电影的url。