文章出處

摘要

網上有很多個人站來分享電影資源,其實有時候我們自己也想做這個一個電影站來分享資源。但是這個時候就有一個問題,電影的資源應該從哪里來呢?難道要自己一條條手動去從網絡上獲取,這樣無疑是緩慢而又效率低下的。這個時候我們可以用自己掌握的知識去寫一個小小爬蟲程序,在網絡上爬去電影資源。

爬去對象---電影天堂

首先打開電影天堂的鏈接,從下面的圖片可以看出電影天堂的電影資源都是已列表頁--詳情頁的方式展示得,這樣是非常易于爬去的。那么我這次就以電影天堂導航欄中的最新資源為例。點開最新資源,是列表也展示的,每頁25條資源。列表頁的訪問鏈接是:http://www.ygdy8.net/html/gndy/dyzz/list_23_PAGE.html (其中PAGE是分頁參數)

列表頁:

詳情頁:
 

其中PAGE是分頁參數,通過更改分頁參數可以達到獲取每一頁中對應電影的詳情頁訪問鏈接。再獲取完詳情頁的鏈接后,再次通過訪問詳情頁的方法,獲取對應電影的下載鏈接和電影名字。

那么梳理一下整個的爬去過程如下:

1.找到電影天堂最新資源的列表頁訪問鏈接

2.循環更改電影列表訪問鏈接的分頁參數.

3.分析列表頁頁面排版規則,獲取電影詳情頁的URL

5.訪問獲取的每一個詳情頁的的URL.分析頁面.獲取電影名稱和電影下載鏈接

6.將獲取的信息存入到存儲介質中.

通過以上6步即可完成電影的爬去!!!

廢話不多說,直接上代碼!!!

爬取代碼

添加需要依賴的jar:

<dependency>
      <groupId>org.jsoup</groupId>
      <artifactId>jsoup</artifactId>
      <version>1.7.2</version>      
</dependency>
CommonMethod.java 該方法類是用于獲取頁面的元素以及將信息寫入文件中
package com.penglei.util;

import com.penglei.vo.MovieVo;

import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.Iterator;
import java.util.List;

/**
 * 公用的方法
 * Created by penglei on 2017/2/13.
 */
public class CommonMethod {
    /**
     * 獲取頁面元素
     * @param url
     * @return
     * @throws IOException
     */
    public static String getHtmlPage(String url) throws IOException {
        String line;
        URL oul = new URL(url);
        //建立連接
        URLConnection conn = oul.openConnection();
        //獲得數據
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "gbk"));
        StringBuilder htmlpage = new StringBuilder();
        while ((line = bufferedReader.readLine()) != null) {
            htmlpage.append(line);
        }
        //返回頁面(String類型的頁面數據)
        return htmlpage.toString();
    }

    /**
     * 將List中的信息寫入txt
     * @param file
     * @param urlList
     */
    public static void insertUrlToFile(String file, List<MovieVo> urlList) throws IOException {
        //下面是寫文件
        boolean flag = false;
        FileWriter fw = null;
        BufferedWriter bw = null;
        try {
            fw = new FileWriter(file, true);
            bw = new BufferedWriter(fw, 100);
            Iterator<MovieVo> iter=urlList.iterator();
            while(iter.hasNext()) {
                bw.write(iter.next().getTitle()+"----["+iter.next().getDownloadUrl()+"]" + "\r\n");
            }
            flag = true;
        } catch (IOException e) {
            System.out.println("write error");
            flag = false;
        } finally {
            if (bw != null) {
                bw.flush();
                bw.close();
            }
            if (fw != null)
                fw.close();
        }
    }
}
View Code

SpiderCommon.java 該方法將被重新

package com.penglei.service;

import java.io.IOException;

/**
 * Created by penglei on 2017/2/13.
 */
public class SpiderCommon {

    public void search(String url) throws IOException {
        System.out.println("The method will be override!");
    }
}
View Code
SpiderMovieList.java 獲取列表頁資源
package com.penglei.service;

import com.penglei.util.CommonMethod;
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;

/**
 *抓取電影天堂列表頁的數據
 * Created by penglei on 2017/2/13.
 */
public class SpiderMovieList extends SpiderCommon {

    private static List<String> uList =new ArrayList<String>();

    @Override
    public void search(String url) throws IOException {
        //根據Url地址獲取網頁內容
        String htmlPage = CommonMethod.getHtmlPage(url);
        if (htmlPage != null){
            //對網頁內容進行分析和提取
            Document docx = Jsoup.parse(htmlPage);
            //獲取列表頁對應的table元素
            Elements htmltables = docx.select("table.tbspan");
            //獲取a標簽鏈接元素
            Elements links = htmltables.select("a[href]");
            for (Element link : links) {
                String linkHref = link.attr("href");
                uList.add("http://www.ygdy8.net"+linkHref);
            }
        }
    }

    public List<String> getUrlList() {
        return uList;
    }

    /**
     * 得到列表頁的url
     * @param n 一共有多少頁
     * @param indexurl 頁面的url
     * @throws IOException
     */
    public static List getAllMovieUrl(int n,String indexurl) throws IOException {
        Integer i=1;
        SpiderMovieList spiderMovieList = new SpiderMovieList();
        System.out.println("***********開始爬取列表頁***********");
        for (i = 1; i <= n; i++) {
            String url = indexurl.replace("PAGE",i.toString());
            spiderMovieList.search(url);
            System.out.println("info"+"爬取第"+i+"頁");
        }
        System.out.println("***********列表頁爬取完成***********");
        List<String> resultList=spiderMovieList.getUrlList();
        return resultList;
    }
}
View Code

SpiderMovieDetail.java 獲取電影詳情頁資源

package com.penglei.service;

/**
 * Created by penglei on 2017/2/13.
 */

import com.penglei.util.CommonMethod;
import com.penglei.vo.MovieVo;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;

/**
 * 抓取每個電影對應的列表頁的數據,獲取對應的電影名稱和電影下載鏈接
 */
public class SpiderMovieDetail extends SpiderCommon {

    private MovieVo movieVo;

    @Override
    public void search(String url) throws IOException {
        movieVo = new MovieVo();
        String htmlpage = CommonMethod.getHtmlPage(url);
        if (htmlpage != null){
            //對網頁內容進行分析和提取
            Document doc = Jsoup.parse(htmlpage);
            //獲取標題
            Element link = doc.select("div.title_all").last();
            if(link!=null){
                String title = link.text();
                //獲取鏈接
                Elements elements = doc.select("div#Zoom");
                Element element = elements.select("a[href]").first();
                if(element!=null){
                    String href = element.attr("href");
                    movieVo.setDownloadUrl(href);
                }
                //將標題加入到MovieVo對象中
                movieVo.setTitle(title);
            }

        }
    }
    public MovieVo getMovie() {
        return movieVo;
    }
}
View Code
最后就是執行的main方法了
package com.penglei;

import com.penglei.service.SpiderMovieDetail;
import com.penglei.service.SpiderMovieList;
import com.penglei.util.CommonMethod;
import com.penglei.vo.MovieVo;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by penglei on 2017/2/13.
 */
public class DemoRun {
    /**
     * PAGE是電影天堂的分頁參數,所以通過循環更改PAGE來抓取某一頁
     */
    //最新
    private static String INDEX_DYZZ="http://www.ygdy8.net/html/gndy/dyzz/list_23_PAGE.html";
    
    public static void main(String[] args) throws IOException, InterruptedException {
        List<MovieVo> movieVos=new ArrayList<MovieVo>();
        SpiderMovieDetail detail=new SpiderMovieDetail();
        //獲取列表頁中所有電影的詳情頁訪問鏈接
        List<String> list = SpiderMovieList.getAllMovieUrl(157, INDEX_DYZZ);
        System.out.println(list.size());
        for (int i = 0; i < list.size(); i++) {
            //獲取詳情頁數據
            detail.search(list.get(i));
            movieVos.add(detail.getMovie());
            System.out.println("**********爬取詳情頁**********"+i+"完成");
        }
        System.out.println("**********開始執行插入**********");
        //將獲取資源寫入txt
        CommonMethod.insertUrlToFile("E:\\AMark\\StudyCode\\seed.txt",movieVos);
        System.out.println("**********插入完成**********");
    }
}
View Code

代碼結構如下:

通過以上代碼即可爬去到對應的電影資源!

訪問最新資源共獲取3923條電影資源。

對應代碼資源地址是:https://github.com/whitescholars/spider.git


 

結語

如果你還需要了解更多技術文章信息,請繼續關注白衣秀才的博客
個人網站:http://penglei.top/
Github:https://github.com/whitescholars
微博:http://weibo.com/u/3034107691?refer_flag=1001030102_&is_all=1


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()