JAVA爬虫(一):豆瓣电影排行榜爬取

前言

最近和大创队友一起给大创做的APP增添了新功能,新功能中需要用到爬取豆瓣、QQ音乐、哔哩哔哩等网站。所以写下博客记录这一过程,也算是和大家分享一些经验。

流程图

JAVA爬虫(一):豆瓣电影排行榜爬取

步骤

一、爬取豆瓣电影榜单网页源代码

为实现这一功能,第一步是需要获取豆瓣热门电影榜单的网页源代码,我们采用Jsoup库中的connect方法建立连接,再用userAgent方法模拟浏览器进行网页访问,再用post方法获取数据。得到的是HTML格式的网页源代码,如下图:
JAVA爬虫(一):豆瓣电影排行榜爬取

二、网页源码解析

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解析,过程与上文爬取电影榜单类似,不再赘述。下图为《海王》的电影信息。
JAVA爬虫(一):豆瓣电影排行榜爬取

四、源代码解析及关键信息获取

最后我们可以得到电影详细信息,由于我们功能需要,我们只爬取了电影导演、电影主演、剧情简介、电影图片等信息。大家可以根据网页返回信息自行添加需要获取的信息。
单个电影信息获取总体代码如下

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。