使用Jsoup包抓取豆瓣Top250电影信息

2023-11-26 09:40

本文主要是介绍使用Jsoup包抓取豆瓣Top250电影信息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Java制作爬虫程序主要用到的网页解析工具Jsoup,而在Python使用的是漂亮汤,Jsoup能向JS和JQuery一样获取网页文件的模型(dom),是解析网页文件的有力工具,使用方法见:Jsoup详解(一)——Jsoup详解

Jsoup的使用方法和JS基本相同,进入豆瓣Top250界面:


找到链接地址:

String[] url=new String[25];//进入Top250的界面,抓取单个电影的网址Document document=Jsoup.connect("https://movie.douban.com/top250?start="+j*25).get();Elements bd=document.select("div.hd");for(int i=0;i<bd.size();i++){Elements info=bd.get(i).select("a[href]");url[i]=info.attr("href");}return url;

节这我们需要一个函数,向这个函数传递URL后可以获得网页的全部信息。
如果文本在标签之内,选择这个标签后,text方法提取文本即可,如果不在,比如,在<br>之前,这样的内容属于文本节点,可找邻近的节点,然后使用nextSibling()等方法获得文本节点。需要注意的是:
1、Document:文件对象模型(dom)
2、Elements:元素对象集合
3、Node:节点对象
这三者从大到小排列,一般的节点对象没有text方法,用outhtml方法获取它的值,除了文本节点。

//抓取电影名String name=document.select("span[property=v:itemreviewed]").text();info[0]=name;//抓取导演名String director=document.select("a[rel='v:directedBy']").text();info[1]=director;//抓取编剧String pl=document.select("span.attrs").get(1).text();info[2]=pl;//抓取演员名String actor=document.select("span.attrs").get(2).text();info[3]=actor;//抓取电影类型String type=document.select("span[property='v:genre']").text();info[4]=type;//对是否含有官方网站进行讨论int i=4;if(document.select("span.pl").get(i).text().contains("官方网站")){i++;}//抓取产地国家,它的内容是国家标签的下一个节点String country=document.select("span.pl").get(i).nextSibling().outerHtml();info[5]=country;//抓取语言String lan=document.select("span.pl").get(i+1).nextSibling().outerHtml();info[6]=lan;//抓取时长String runTime=document.select("span[property='v:runtime']").text();info[7]=runTime;//抓取别名String otherName=document.select("span.pl").get(i+4).nextSibling().outerHtml();info[8]=otherName;//抓取评价人数String peoNum=document.select("span[property='v:votes']").text();info[9]=peoNum;//抓取介绍String intro=document.getElementById("link-report").text();info[10]=intro;

这里是抓取豆瓣电影信息的过程




抓取信息后,我们将其放入一个表格中,这里使用的是poi包,它抓门用来处理文档,docx,xlsx等。

private static void writeRow(int i ,String[] row,File file) throws InvalidFormatException, IOException{Workbook workBook=new XSSFWorkbook(new FileInputStream(file));//获得Top250Sheet,前提是有这个sheet,没有会报错Sheet sheet=workBook.getSheet("Top250");Row r=sheet.createRow(i);for(int k=0;k<row.length;k++){r.createCell(k).setCellValue(row[k]);}//将数据写进表格workBook.write(new FileOutputStream(file));}

对每一页遍历,即可获取所有电影的网址
总的代码如下

package spider;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;public class DoubanTop250 
{public static void main(String[] args) throws InterruptedException, IOException, InvalidFormatException {File file=new File("Top250.xlsx");//写好表格标题String[] title= {"电影名","导演","编剧","演员","类型","国家","语言","时长","别名","评价人数","简介"};writeRow(0,title,file);//遍历,抓取Top250电影信息for(int k=0	;k<10;k++) {//抓取每页所有电影的网址String[] url=getMovieUrl(k);
//		String item=url[0];
//		System.out.println(getInfos(item)[8]);for(int i=0;i<=24;i++){String[] list =getInfos(url[i]);//防止豆瓣把你IP禁了Thread.sleep(500);writeRow(i+1+k*25,list, file);}}}//抓取每个电影的链接的函数private static String[] getMovieUrl(int j) throws IOException{String[] url=new String[25];//进入Top250的界面,抓取单个电影的网址Document document=Jsoup.connect("https://movie.douban.com/top250?start="+j*25).header("user-agent", "Chrome").get();Elements bd=document.select("div.hd");for(int i=0;i<bd.size();i++){Elements info=bd.get(i).select("a[href]");url[i]=info.attr("href");}return url;}//获取每个电影的信息,使用的是Jsoup包private static String[] getInfos(String url) {//豆瓣电影这个界面十分复杂,情况很多try{Document document=Jsoup.connect(url).get();String info[]=new String[11];//抓取电影名String name=document.select("span[property=v:itemreviewed]").text();info[0]=name;//抓取导演名String director=document.select("a[rel='v:directedBy']").text();info[1]=director;//抓取编剧int j=1;if(document.select("span.attrs").size()>2) {String pl=document.select("span.attrs").get(j).text();info[2]=pl;//抓取演员名String actor=document.select("span.attrs").get(j+1).text();info[3]=actor;}else if(document.select("span.attrs").size()==2){info[2]=null;info[3]=document.select("span.attrs").get(j).text();}else{info[2]=null;info[3]=null;}//抓取电影类型String type=document.select("span[property='v:genre']").text();info[4]=type;//对是否含有官方网站进行讨论int i=4;if(document.select("span.pl").get(i).text().contains("官方网站")){i++;}//抓取产地国家,它的内容是国家标签的下一个节点String country=document.select("span.pl").get(i).nextSibling().outerHtml();info[5]=country;//抓取语言String lan=document.select("span.pl").get(i+1).nextSibling().outerHtml();info[6]=lan;//抓取时长String runTime=document.select("span[property='v:runtime']").text();info[7]=runTime;//抓取别名String otherName=document.select("span.pl").get(i+4).nextSibling().outerHtml();info[8]=otherName;//抓取评价人数String peoNum=document.select("span[property='v:votes']").text();info[9]=peoNum;//抓取介绍String intro=document.getElementById("link-report").text();info[10]=intro;return info;//出现异常,不要抛出,会导致程序中断}catch (IOException e) {// TODO: handle exceptionreturn null;}}//向表格中写数据,使用POI包private static void writeRow(int i ,String[] row,File file) throws InvalidFormatException, IOException{Workbook workBook=new XSSFWorkbook(new FileInputStream(file));//获得Top250Sheet,前提是有这个sheet,没有会报错Sheet sheet=workBook.getSheet("Top250");Row r=sheet.createRow(i);for(int k=0;k<row.length;k++){r.createCell(k).setCellValue(row[k]);}//将数据写进表格workBook.write(new FileOutputStream(file));}
}

效果图

这篇关于使用Jsoup包抓取豆瓣Top250电影信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/425462

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他