java爬蟲爬取網際網路上的各大影視網站---360影視(附原始碼下載)
關於爬蟲:
全球資訊網上有著無數的網頁,包含著海量的資訊,無孔不入、森羅永珍。但很多時候,無論出於資料分析或產品需求,我們需要從某些網站,提取出我們感興趣、有價值的內容,但是縱然是進化到21世紀的人類,依然只有兩隻手,一雙眼,不可能去每一個網頁去點去看,然後再複製貼上。所以我們需要一種能自動獲取網頁內容並可以按照指定規則提取相應內容的程式,這就是爬蟲。
本篇文章就以小編用java語言爬取360視訊網站為例,為大家進行復雜而又簡單的爬蟲技術的應用。
如上圖所示,360影視網站共有電視劇,電影,綜藝,動漫四個大的頻道,分析其連結url,也有規律可言,分別為
1.https://www.360kan.com/dianshi/list 2.https://www.360kan.com/dianying/list
3.https://www.360kan.com/zongyi/list 4.https://www.360kan.com/dongman/list
接下來便開始通過url對需要的內容進行抓取
小編所使用到的工具有MyEclipse開發工具,Apache Tomcat伺服器。具體的使用方法和配置在這裡不詳細介紹,不懂得的可以百度。需要做的是將安裝的Tomcat與MyEclipse進行繫結,以使web程式能夠在伺服器上執行。首先新建工程,注意工程裡需要匯入我們的java爬蟲常用工具jsoup.jar,然後在工程裡寫兩個java web的Servlet,首頁index.jsp,以及播放介面player.jsp,
(1)首頁程式碼如下所示:
<div class="form"> <form action="/LongVideos/Search" method="post" target="ifr"> <input type="text" placeholder="盡情搜吧" name="v_name"> <input type="submit" value="搜搜"> </form> </div> <% String p=request.getParameter("pageId"); for(int i=1;i<=24;i++){ String pa=i+""; } if("1".equals(p)){ p="1"; }else if("2".equals(p)){ p="2"; }else if("3".equals(p)){ p="3"; }else if("4".equals(p)){ p="4"; }else if("5".equals(p)){ p="5"; }else if("6".equals(p)){ p="6"; }else if("7".equals(p)){ p="7"; }else if("8".equals(p)){ p="8"; }else if("9".equals(p)){ p="9"; }else if("10".equals(p)){ p="10"; }else if("11".equals(p)){ p="11"; }else if("12".equals(p)){ p="12"; }else if("13".equals(p)){ p="13"; }else if("14".equals(p)){ p="14"; }else if("15".equals(p)){ p="15"; }else if("16".equals(p)){ p="16"; }else if("17".equals(p)){ p="17"; }else if("18".equals(p)){ p="18"; }else if("19".equals(p)){ p="19"; }else if("20".equals(p)){ p="20"; }else if("21".equals(p)){ p="21"; }else if("22".equals(p)){ p="22"; }else if("23".equals(p)){ p="23"; }else if("24".equals(p)){ p="24"; }else{ p="1"; } System.out.print(p); %> <div class="tab" align="center"> <a href="/LongVideos/SpideImg?type=tvplay&pageId=<%=p %>" target="ifr">電視劇</a> <a href="/LongVideos/SpideImg?type=movie&pageId=<%=p %>" target="ifr">電影</a> <a href="/LongVideos/SpideImg?type=variety&pageId=<%=p %>" target="ifr">綜藝</a> <a href="/LongVideos/SpideImg?type=cartoon&pageId=<%=p %>" target="ifr">動漫</a> </div> <iframe src="/LongVideos/SpideImg?type=movie" name="ifr" width="100%" height="100%;"></iframe> <div class="page" align="center"> <%for(int j=1;j<=24;j++){ String pageIndex="<a href=\"/LongVideos/index.jsp?pageId="+j+"\">"+j+"</a>"; out.write(pageIndex); //System.out.println(pageIndex); } %> </div>
執行後的介面如下
(2)兩個Servlet程式碼如下所示
【1】SpideServlet該Servlet實現抓取網頁中的視訊內容並顯示,
String type=request.getParameter("type");
String page=request.getParameter("pageId");
if(type.equals("tvplay")){
type="dianshi";
}else if(type.equals("movie")){
type="dianying";
}else if(type.equals("variety")){
type="zongyi";
}else if(type.equals("cartoon")){
type="dongman";
}
String main="https://www.360kan.com";
String url="https://www.360kan.com/"+type+"/list.php?rank=rankhot&cat=all&area=all&year=all&pageno="+page;//?rank=rankhot&cat=all&area=all&year=all&pageno=2
Document doc=Jsoup.connect(url).get();//?rank=rankhot&cat=all&area=all&act=all&year=all&pageno=4
Elements plays=doc.getElementsByClass("js-tongjic");
PrintWriter out=response.getWriter();
out.println("<head>");
out.println("<title>Long Bro影院歡迎你</title>");
out.println("<link rel=\"stylesheet\" type=\"text/css\" href=\"css/index.css\"> ");
out.println("</head>");
//遍歷完imgs後,srcL連結串列已包含所有圖片地�?
for(Element play: plays){
// Attribute
// String href=play.attr("href");
String p=play.toString();
//寫一個方法,取出href裡面的內容,src裡面的內容,以及span裡的年份,視訊名和評分,還有演員
String[] s=p.split(">");
String hr=s[0]+">";
String hre=main+hr.substring(hr.indexOf("href=")+6, hr.indexOf("\">"));
String sr=s[2]+">";
String src=sr.substring(sr.indexOf("src=")+5, sr.indexOf("\">"));
String year,name,score,actor;
if(p.contains("付費")){
// System.out.println("360付費影視");
year=s[6].substring(0,4);
// System.out.println("年份+year);
name=s[11].split("<")[0];
// System.out.println("片名�?+name);
score=s[13].split("<")[0];
// System.out.println("評分�?+score);
actor=s[16].split("<")[0];
// System.out.println("主演�?+actor);
}else{
year=s[4].substring(0, 4);
name=s[9].split("<")[0];
score=s[11].split("<")[0];
actor=s[14].split("<")[0];
}
if(name.length()>11){
name=name.substring(0,11)+"...";
}
if(actor.length()>11){
actor=actor.substring(0, 11)+"...";
}
if(score.equals("")){
score="暫無";
}
if(year.length()!=4){
year="暫無";
}
if(actor.equals("")){
actor="暫無";
}
///LongVideos/player.jsp?href=
//得到hre中的網頁原始碼,以從中篩選出想要的資訊
Document docu=Jsoup.connect(hre).get();
Elements btns=docu.getElementsByClass("s-cover");//播放連結在這個id中
String pu=null;
String sb=btns.toString();
// System.out.println(sb);
// PlayerUrl獲取該視訊的播放連結
pu=sb.substring(sb.indexOf("href=\"")+6,sb.indexOf("\" class=\""));
// System.out.println(name+"\n"+pu);
//從href網頁原始碼中獲取其他資訊,如視訊的詳情,劇集,等等,然後傳入播放介面並顯示
//或者只將hre傳入player.jsp,在其裡面進行這些資訊的爬取操作
// System.out.println("--------------------");
out.write(" <div class='whole'><a href=\"/LongVideos/player.jsp?type="+type+"&url="+hre+"&href="+pu+"\" target='_blank'>"
+ "<img src='"+src+"' title='"+name+"' alt='"+src+"'>"
+ "<em>"+name+"</em><br><em>"+actor+"</em><br><em>年份:"+year+"</em><br>"
+ "<em>評分:"+score+"</em></a></div>");
【2】SearchServlet該Servlet實現影視的搜尋功能
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import bean.SimInfo;
/**
* @author Long Bro
*
*/
public class Search extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");//
response.setCharacterEncoding("UTF-8");//設定瀏覽器響應的編碼方式,即控制瀏覽器的編碼
response.setContentType("text/html;charset=UTF-8");//
String kw=request.getParameter("v_name");
System.out.println(kw);
PrintWriter out=response.getWriter();
out.println("<html><head>");
out.println("<title>Long Bro-Video搜搜</title>");
out.println("<link rel=\"stylesheet\" type=\"text/css\" href=\"css/index.css\"> ");
out.println("<style type=\"text/css\">");
out.print("body{margin-left:60px;}");
out.println("</style>");
out.println("</head>");
// String kw="意外";
ArrayList<SimInfo> sis=searchInfo(kw,response);
out.write("<body>");
for(int i=0;i<sis.size();i++){
SimInfo si=sis.get(i);
String url=si.getUrl();
//得到播放連結
Document docu=Jsoup.connect(url).get();
Elements btns=docu.getElementsByClass("s-cover");//播放連結在這個id中
String pu=null;
String sb=btns.toString();
// System.out.println(sb);
// PlayerUrl獲取該視訊的播放連結
pu=sb.substring(sb.indexOf("href=\"")+6,sb.indexOf("\" class=\""));
System.out.println(pu);
String img=si.getImg();
String name=si.getVname();
String type=si.getType();
System.out.println(url+" "+name);
String typ=null;
if(type.equals("電視劇")){
typ="dianshi";
}else if(type.equals("電影")){
typ="dianying";
}else if(type.equals("綜藝")){
typ="zongyi";
}else if(type.equals("動漫")){
typ="dongman";
}
out.write("<a href='/LongVideos/player.jsp?type="+typ+"&url="+url+"&href="+pu+"' target='_blank'><div class='whole'>"
+ "<img src='"+img+"' alt='"+name+"' title='"+name+"'><br><em>片名:"+name+"</em><br><br><em>型別:"+type+"</em></div></a>");
}
out.write("</body></html");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
public static ArrayList searchInfo(String kw,HttpServletResponse response)throws IOException{
kw=URLEncoder.encode(kw,"utf-8");//將漢字轉為url編碼
String url="https://so.360kan.com/index.php?kw="+kw;
System.out.println(url);
Document doc=Jsoup.connect(url).get();
// System.out.println("doc"+doc);
Elements es=doc.getElementsByClass("js-longitem");
// System.out.println(es);
ArrayList<SimInfo> sis=new ArrayList<SimInfo>();
for(Element s:es){
// System.out.println(s);
System.out.println("----------------------------------------------------");
String ss=s.toString();
//視訊詳情網址
String uu=ss.substring(ss.indexOf("<a href=\"")+9,ss.indexOf("\" class=\"g-playicon") );
//視訊圖片
String img=ss.substring(ss.indexOf("<img src=\"")+10,ss.indexOf("\" alt=\""));
//視訊名
String name=ss.substring(ss.indexOf("title=\"")+7,ss.indexOf("\" data-logger=\"ctype"));
// System.out.println(name);
String type=ss.substring(ss.indexOf("<span class=\"playtype\">")+24,ss.indexOf("]</span>"));
// System.out.println(type);
SimInfo si=new SimInfo();
si.setUrl(uu);
si.setImg(img);
si.setVname(name);
si.setType(type);
sis.add(si);
}
return sis;
}
}
(3)player.jsp程式碼如下所示,這裡呼叫的是beac視訊解析介面來解析並播放視訊
<%@page import="org.jsoup.nodes.Element"%>
<%@page import="org.jsoup.select.Elements"%>
<%@page import="org.jsoup.Jsoup"%>
<%@page import="org.jsoup.nodes.Document"%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
request.setCharacterEncoding("UTF-8");//
response.setCharacterEncoding("UTF-8");//設定瀏覽器響應的編碼方式,即控制瀏覽器的編碼
response.setContentType("text/html;charset=UTF-8");//
String type=request.getParameter("type");
String hre=request.getParameter("href");//獲取該視訊的播放連結
String url=request.getParameter("url");
System.out.println(url);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>正在播放中......</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<link rel="stylesheet" type="text/css" href="css/index.css">
</head>
<body>
<iframe src='http://beaacc.com/api.php?url=<%=hre %>' class="player" width='800px' height="500px" align="left"></iframe><br>
<!-- http://api.baiyug.cn/vip/?url=-->
<%
if(type.equals("dianshi")||type.equals("dongman")){
System.out.println(type);
Document doc=Jsoup.connect(url).get();//?rank=rankhot&cat=all&area=all&act=all&year=all&pageno=4
Elements s=doc.getElementsByClass("s-top-list-ji");
String ss=s.toString();
System.out.println(ss);
String se="";
if(ss.contains("display:none")){//集數較多,摺疊的
se=s.toString().substring(ss.indexOf("display:none")+15,ss.indexOf("收起</a>")-63);
}else if(ss.contains("<i class=\"ico-yugao\">")){//有預告片的
se=s.toString().substring(ss.indexOf("js-tab")+14,ss.indexOf("<i class=\"ico-yugao\">"));
}else{//無預告片且未摺疊,有預告片且摺疊
se=s.toString().substring(ss.indexOf("js-tab")+14);
}
System.out.println(se);
String[] hs=se.split("href=\"");
String u="";
out.write("<div class='episode'>");
for(int i=1;i<hs.length;i++){
//<a data-num="40" data-daochu="to=qq" http://v.qq.com/x/cover/uutv6yv0c4jn95h/d002608a679.html?ptag=360kan.tv.free"> 40 <i class="ico-new"></i> </a>
u=hs[i].substring(0,hs[i].indexOf("\">"));
// h=h.substring(0,42);
System.out.println(u);
System.out.println("-------------------------------");
out.write("<a href='/LongVideos/player.jsp?type="+type+"&url="+url+"&href="+u+"'>"+i+"</a> ");
//每行八集
if(i%8==0){
out.write("<br>");
}
}
out.write("</div><br>");
//
Elements info=doc.getElementsByClass("s-top-info");
String sinfo=info.toString();
System.out.println(sinfo);
String title=sinfo.substring(sinfo.indexOf("<h1>")+4,sinfo.indexOf("</h1>"));
out.println("<br>正在播放:<em class='title'>"+title+"</em><br>");
if(type.equals("dianshi")){
Element s8=doc.getElementById("js-desc-switch");
String[] r=s8.toString().split("<span>");
//型別
String style=r[1].substring(10, r[1].indexOf("</p>"));
//年份
String year=r[2].substring(10,r[2].indexOf("</p>"));
//地區
String area=r[3].substring(10,r[3].indexOf("</p>"));
//導演
String lD=r[4].substring(r[4].indexOf("href")+6, r[4].indexOf("\">"));
String director=r[4].substring(r[4].indexOf("\">")+2, r[4].indexOf("</a>"));
out.println("型別:<des>"+style+"</des> 年份:<des>"+year+"</des> 地區:<des>"+area+"</des> 導演:<des>"+director+"</des><br><br>");
}
//簡介
String desc=sinfo.substring(sinfo.indexOf("<p class=\"item-desc js-close-wrap\" style=\"display:none;\">")+73,sinfo.indexOf("<a href=\"#\" class=\"js-close btn\">"));
out.println("簡介:"+desc);
}
else if(type.equals("dianying")||type.equals("zongyi")){
Document doc=Jsoup.connect(url).get();
Elements s=doc.getElementsByClass("top-info");//電影
String ss=s.toString();
out.write("<div class='episode'>");
//片名
String title=ss.substring(ss.indexOf("<h1>")+4,ss.indexOf("</h1>"));
if(type.equals("dianying")){
//評分
String score=ss.substring(ss.indexOf("<span class=\"s\">")+16,ss.indexOf("</span>"));
if(score.length()>6){
out.println("<br>正在播放:<em class='title'>"+title+"</em><br><br>");
}else{
out.println("<br>正在播放:<em class='title'>"+title+"</em> "+score+"<br><br>");
}
Element s8=doc.getElementById("js-desc-switch");
String[] r=s8.toString().split("<span>");
//年份
String year=r[1].substring(10, r[1].indexOf("</p>"));
//地區
String area=r[2].substring(10,r[2].indexOf("</p>"));
//演員
String actor=r[3].substring(10,r[3].indexOf("</p>"));
//導演
String lD=r[4].substring(r[4].indexOf("href")+6, r[4].indexOf("\">"));
String director=r[4].substring(r[4].indexOf("\">")+2, r[4].indexOf("</a>"));
out.println("年份:<des>"+year+"</des> 地區:<des>"+area+"</des> 導演:<des>"+director+"</des><br><br>");
}
//簡介
String desc=ss.substring(ss.indexOf("<p class=\"item-desc js-close-wrap\" style=\"display:none;\">")+73,ss.indexOf("<a href=\"#\" class=\"js-close btn\">"));
out.println("簡介:<span>"+desc+"</span>");
out.write("</div>");
}
%>
</body>
</html>
效果圖如下所示:
只需以上四個檔案,一個簡單的視訊爬取網站就算完成了,介面較low,莫要見怪。接下來需要做的就是利用css,js等技術,加上一些額外的功能來完善你做的視訊網站。
相關推薦
java爬蟲爬取網際網路上的各大影視網站---360影視(附原始碼下載)
關於爬蟲: 全球資訊網上有著無數的網頁,包含著海量的資訊,無孔不入、森羅永珍。但很多時候,無論出於資料分析或產品需求,我們需要從某些網站,提取出我們感興趣、有價值的內容,但是縱然是進化到21世紀的人類,依然只有兩隻手,一雙眼,不可能去每一個網頁去點去看,然後再複製貼上。所以
JAVA小白啟蒙篇:第一個SSM框架搭建示例(附原始碼下載)
HelloWorld工程原始碼下載 http://download.csdn.net/detail/baidu_31657889/9682606 有償連結(0.1rmb):https://www.fageka.com/Home/Index/sell?id=ctLT7f4
教你分分鐘爬取百度貼吧,新手可操作(附原始碼及解析)
不要以為這個教程很難,其實非常容易上手。並且講解非常詳細。 原理:通過檢視原始碼扣出關鍵資料,然後將其儲存到本地txt檔案下。(一通百通 ,原理大多一樣。) 【新建一個BugBaidu.py檔案,然後將程式碼複製到裡面後,雙擊執行。將貼吧中樓主釋出的內容打包txt儲存到本地。】 學
Java爬蟲爬取京東商品信息
1.2 image 商品 void code 更改 size pri name 以下內容轉載於《https://www.cnblogs.com/zhuangbiing/p/9194994.html》,在此僅供學習借鑒只用。 Maven地址 <dependency>
java爬蟲爬取資源,小白必須會的入門程式碼塊
java作為目前最火的語言之一,他的實用性也在被無數的java語言愛好者逐漸的開發,目前比較流行的爬取資源,用java來做也更簡單一些,下面是爬取網頁上所有手機型號,引數等極為簡便的資料 package day1805; import java.io.IOException; im
JAVA爬蟲爬取網頁資料資料庫中,並且去除重複資料
pom檔案 <!-- 新增Httpclient支援 --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId&
java程式爬取網頁上的圖片
最近需要在網上找一寫圖片,所以寫了一個爬取圖片的程式,新手有寫的不足之處還請各位大佬指點一二。 原始碼如下 package com.sysh.ssm.service; import org.apache.commons.lang3.StringEscapeUtils; i
Java爬蟲爬取網易汽車車型庫
最近由於工作需要,寫了一個小的爬蟲,主要用於爬取網易汽車車型庫(http://product.auto.163.com/)上的不同品牌/車標(共175個車標)下不同車系(共1650個系列)的的圖片(各八張) 程式碼下載 程式碼如下: 共CarBra
java爬蟲爬取美女圖片
前言:抓住國慶假期的小尾巴,分享一波福利。 if (!existUrl(cache, saveUrl)) { //插入資料庫
java爬蟲 爬取網頁資訊
今天接觸到一個專案中非要讓我用爬蟲來爬取一個學校網頁的新聞頁面加子頁面所有文字資訊,畢竟需求就是上帝,然後查詢了一會之後發現並不難就是匹配字元、標籤是有些麻煩 好了直接上pom.xml &
java爬蟲 爬取網站資訊 儲存資料庫
需求分析 1:爬取虎嗅首頁獲取首頁文章地址:https://www.huxiu.com/ 2:爬取虎嗅分頁地址,獲取分頁上的文章地址。 3:爬取文章詳情頁,獲取文章資訊(標題、正文、作者、釋出時間、評論數、點贊數、收藏數)。 4:將爬到的文章資訊入庫。 實現思路 1:爬首頁
java 爬蟲爬取酷狗歌手資料
記錄防止忘記 包: jsoup-1.4.1 html解析 httpcore-4.0.1_1 httpclient-4.0.1 程式碼: 已經訪問的url佇列 //已經訪問連結佇列 public class VisitedUrlQueue { public static
Java爬蟲爬取網站電影下載連結
之前有看過一段時間爬蟲,瞭解了爬蟲的原理,以及一些實現的方法,本專案完成於2017年初,一直放在那裡,現在和大家分享出來。網路爬蟲簡單的原理就是把程式想象成為一個小蟲子,一旦進去了一個大門,這個小蟲子就像進入了新世界一樣,只要符合他的口味的東西就會放在自己的袋子裡,但是他還不
java爬蟲爬取網站資料例項
WebSite web = new WebSite(“https://www.bdqnhyq.com”);</font></font><font></font><font style="vertical-align: inherit;"><fo
超簡單的JAVA爬蟲爬取晉江小說的簡介和評論
Java爬取晉江書城的某個分類下小說的簡介和評論 寫在前面,一開始是因為書荒又找不到自己喜歡的,就打算去晉江書城看看,結果排在前面的也不是我的菜,一本本挑又嫌太麻煩就打算把資料爬下來慢慢的看。分析了一下晉江的網頁,發現可以爬下來的資料有書名、作者、型別、簡介、標籤、收藏、下
python:爬蟲爬取資料的處理之Json字串的處理(2)
#Json字串的處理 Json字串轉化為Python資料型別 import json JsonStr ='{"name":"sunck","age":"18","hobby":["money","power","English"],"parames":{"a":1,"b":2}}' Js
python3 爬蟲—爬取天氣預報多個城市七天資訊(三)
一、內容: 利用BeautifulSoup抓取中國天氣網各個城市7天的 時間 天氣狀態 最高溫 最低溫 的相關資訊,並記錄儲存在本地csv表格檔案中。 爬取的頁面截圖: html獲取資訊截圖: 二、原理: 1.利用requests獲取請求
爬取大半導體網新聞內容儲存到word(基於python3.6)
#!/usr/bin/python3# -*- coding: utf-8 -*-# @File : Spider# @Author : moucong# @Date : 2018/12/25 16:36# @Software: PyCharm from urllib import reque
python3實現爬取淘寶頁面的商品的資料資訊(selenium+pyquery+mongodb)
1.環境須知 做這個爬取的時候需要安裝好python3.6和selenium、pyquery等等一些比較常用的爬取和解析庫,還需要安裝MongoDB這個分散式資料庫。 2.直接上程式碼 spider.py import re from config
一文看懂 BDTC 2018:探祕大資料新應用(附 PPT 下載)
12 月 8 日,北京新雲南皇冠假日酒店,由中國計算機學會主辦,CCF 大資料專家委員會承辦,CSDN、中科天璣資料科技股份有限公司協辦的 2018 中國大資料技術大會(BDTC)圓滿落下帷幕。 從 2008 第一屆 Hadoop 沙龍,到 2018 的千人大會,活動已