【Python从入门到进阶】51、电影天堂网站多页面下载实战

接上篇《50、当当网Scrapy项目实战(三)》
上一篇我们讲解了使用Scrapy框架在当当网抓取多页书籍数据的效果,本篇我们来抓取电影天堂网站的数据,同样采用Scrapy框架多页面下载的模式来实现。

一、抓取需求

打开电影天堂网站(https://dy2018.com/),点击最新电影的更多页面(https://www.dy2018.com/html/gndy/dyzz/index.html),这里需要抓取最新电影的名字,以及详情页的图片:


要完成这个目标,我们需要造Scrapy框架中封装一个里外嵌套的item对象。下面我们来进行开发。

二、创建工程及爬虫文件

首先我们打开编辑器,打开控制台,进入爬虫文件夹,使用“scrapy startproject 项目名”指令,来创建我们的爬虫工程:

然后进入配置文件settings.py,设置ROBOTSTXT_OBEY参数为false,即不遵循robots协议。
然后进入工程文件的spiders文件夹下,使用“scrapy genspider 爬虫文件名 爬取路径”创建我们的爬虫文件,这里我命名爬虫文件为“movies”:

三、编写爬虫逻辑

默认生成的spider爬虫代码如下:

import scrapyclass MoviesSpider(scrapy.Spider):name = "movies"allowed_domains = ["www.dy2018.com"]start_urls = ["https://www.dy2018.com/html/gndy/dyzz/index.html"]def parse(self, response):pass

我们把其中的“pass”替换为“print("=============")”,使用“scrapy crawl 爬虫文件名”执行该爬虫:

可以看到正常输出了我们打印的等于号,可以证明网站并没有设置反爬虫。下面我们来编写实际内容,首先我们先定义我们最终要包装成的item对象:

import scrapyclass ScrapyMovieItem(scrapy.Item):name = scrapy.Field()src = scrapy.Field()

这里我们主要定义了两个参数,一个是电影名字name,一个是电影封面地址src。

然后我们回到电影天堂列表界面,F12查看电影名字的Html代码:

可以看到是由td包裹的标签,其中a标签中的内容即为电影名字,其中的href参数为电影的详情页面地址。
然后邮件Html中的电影名所在标签,使用xpath工具,获取到电影名字的xpath路径:

xpath地址为:

/html/body/div/div/div[3]/div[6]/div[2]/div[2]/div[2]/ul/table[1]/tbody/tr[2]/td[2]/b/a

这里full xpath获取的地址太长,我们再观察一下,发在它是在class为co_content8的div下面的:

xpath地址可以缩减为:
(1)电影名称

//div[@class="co_content8"]//td[2]//a[1]/text()

(2)详情地址

//div[@class="co_content8"]//td[2]//a[1]/@href

所以爬虫代码可以编写为:

import scrapyclass MoviesSpider(scrapy.Spider):name = "movies"allowed_domains = ["www.dy2018.com"]start_urls = ["https://www.dy2018.com/html/gndy/dyzz/index.html"]def parse(self, response):# 抓取电影名称以及详情页的封面a_list = response.xpath('//div[@class="co_content8"]//td[2]//a[1]')for a in a_list:# 获取第一页的name和要点击的详情链接地址name = a.xpath('./text()').extract_first()href = a.xpath('./@href').extract_first()print(name,href)

执行一下爬虫,可以看到能拿到相应结果:

然后完善详情界面的地址,进入详情地址,然后获取详情页的图片:

import scrapyclass MoviesSpider(scrapy.Spider):name = "movies"allowed_domains = ["www.dy2018.com"]start_urls = ["https://www.dy2018.com/html/gndy/dyzz/index.html"]def parse(self, response):# 抓取电影名称以及详情页的封面a_list = response.xpath('//div[@class="co_content8"]//td[2]//a[1]')for a in a_list:# 获取第一页的name和要点击的详情链接地址name = a.xpath('./text()').extract_first()href = a.xpath('./@href').extract_first()# 拼接得到详情页地址url = 'https://www.dy2018.com'+href# 对第二页的链接发起访问yield scrapy.Request(url=url, callback=self.parse_second, meta={'name': name})def parse_second(self, response):print("第二个解析方法")

这里我们执行了第二个解析方法,并在下面定义了这个方法“parse_second”,并在上一个函数中,将name作为meta参数带入进去。
此时我们去电影天堂网站打开第一个电影的详情页,右键或F12查看电影封面:

可以大致推断出封面路径的xpath地址为:

//div[@id="Zoom"]//img[1]/@src

所以解析详情图片的代码为(ScrapyMovieItem需要import一下):

def parse_second(self, response):src = response.xpath('//div[@id="Zoom"]//img[1]/@src').extract_first()# 获取上一步得到的meta参数中的namename = response.meta['name']movie = ScrapyMovieItem(name=name, src=src)yield movie

最后将封装好的movie对象返回给管道。完整代码:

import scrapyfrom scrapy_movie.items import ScrapyMovieItemclass MoviesSpider(scrapy.Spider):name = "movies"allowed_domains = ["www.dy2018.com"]start_urls = ["https://www.dy2018.com/html/gndy/dyzz/index.html"]def parse(self, response):# 抓取电影名称以及详情页的封面a_list = response.xpath('//div[@class="co_content8"]//td[2]//a[1]')for a in a_list:# 获取第一页的name和要点击的详情链接地址name = a.xpath('./text()').extract_first()href = a.xpath('./@href').extract_first()# 拼接得到详情页地址url = 'https://www.dy2018.com' + href# 对第二页的链接发起访问yield scrapy.Request(url=url, callback=self.parse_second, meta={'name': name})def parse_second(self, response):src = response.xpath('//div[@id="Zoom"]//img[1]/@src').extract_first()# 获取上一步得到的meta参数中的namename = response.meta['name']print(name, src)movie = ScrapyMovieItem(name=name, src=src)yield movie

四、开启并定义管道

此时我们前往settings.py开启管道(将ITEM_PIPELINES注释取消即可):

ITEM_PIPELINES = {"scrapy_movie.pipelines.ScrapyMoviePipeline": 300,
}

然后打开pipelines.py,编写一段逻辑,将获取的电影名字和封面地址写入一个json文件中:

# 如果需要使用管道,要在setting.py中打开ITEM_PIPELINES参数
class ScrapyMoviePipeline:# 1、在爬虫文件开始执行前执行的方法def open_spider(self, spider):print('++++++++爬虫开始++++++++')# 这里写入文件需要用'a'追加模式,而不是'w'写入模式,因为写入模式会覆盖之前写的self.fp = open('movies.json', 'a', encoding='utf-8')  # 打开文件写入# 2、爬虫文件执行时,返回数据时执行的方法# process_item函数中的item,就是爬虫文件yield的movie对象def process_item(self, item, spider):# write方法必须写一个字符串,而不能是其他的对象self.fp.write(str(item))  # 将爬取信息写入文件return item# 在爬虫文件开始执行后执行的方法def close_spider(self, spider):print('++++++++爬虫结束++++++++')self.fp.close()  # 关闭文件写入

五、执行测试

编写完item、spider、pipeline之后,我们运行爬虫,查看输出的json文件:

可以看到完整获取电影的名称以及封面图片的下载地址。

以上就是电影天堂网站多页面下载的实战内容。下一篇我们来讲解scrapy中链接提取器的使用。

参考:尚硅谷Python爬虫教程小白零基础速通
转载请注明出处:https://guangzai.blog.csdn.net/article/details/136994919

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/768574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用ADB一键停止Android设备上所有应用程序的批处理脚本

当在 Android 设备上进行开发或测试时,经常需要停止某些应用程序。这可能是为了清除缓存、重新加载应用程序或测试新的应用程序行为。幸运的是,通过使用 ADB(Android 调试桥),可以通过命令行轻松地停止应用程序。 以下…

[leetcode] 26. 删除有序数组中的重复项

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k ,你…

C语言之strsep用法实例(八十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

C++实现FFmpeg音视频实时拉流并播放

1.准备工作: 下载rtsp流媒体服务器rtsp-simple-server,安装go开发环境并编译 编译好后启动流媒体服务器 准备一个要推流的mp4视频文件,如db.mp4 使用ffmpeg开始推流 推流命令: ffmpeg -re -stream_loop -1 -i db.mp4 -c copy -rtsp_transport tcp -f rtsp rtsp://192.168.16…

Soot 安装和简单使用

目录 前言 一、Soot 的下载和安装 1.1 在命令行中使用 Soot 1.2 在项目中使用 Soot 二、使用 Soot 生成中间代码 (IR) 三、使用 Soot 进行 Java 类插桩 四、使用 Soot 生成控制流图 (CFG) 4.1 按语句划分的控制流程图 4.2 按基本块划分的控制流程图 五、Graphviz 工具…

Docker jupyter 容器中添加matplotlib 中文支持

本教程基于 jupyter/datascience-notebook,适用其他容器。 # 查看所有 Docker 容器 docker ps -a # 进入已经运行的 Jupyter 容器 docker exec -it CONTAINER_ID bash 本例中CONTAINER_ID为2e # 切换到 matplotlib 的字体目录(find / -name "…

HTML5和CSS3新特性

Html新增属性 1.新增语义化标签 <header>&#xff1a;头部标签 <nav>&#xff1a;导航标签 <article>&#xff1a;内容标签 <section>&#xff1a;定义文档某个区域 <aside>&#xff1a;侧边栏标签 <footer>&#xff1a;尾部标签 2.…

kafka优化--来自gpt

增加Topic的分区数&#xff1a; 分区数越多&#xff0c;可以并行处理的能力越强。 配置参数&#xff1a;num.partitions 增加消费者&#xff08;Consumer&#xff09;的并行度&#xff1a; 根据硬件资源调整消费者实例的数量。 配置消费者组内的消费者实例数。 调整消费者&…

力扣hot100:994. 腐烂的橘子(多源BFS)

这是一个典型的多源BFS问题&#xff0c;如果初学数据结构的同学&#xff0c;可能第一次不能想到&#xff0c;但是如果做过一次应该就能运用了。      主要思路大概是初始时&#xff0c;多个点进入队列然后进行BFS。将某一等价集合视作同一个起始点&#xff08;超级源点&…

blender插件笔记

目录 文件拖拽导入 smpl导入导出 好像可以导入动画 smpl_blender_addon导入一帧 保存pose 导入导出完整代码 文件拖拽导入 https://github.com/mika-f/blender-drag-and-drop 支持格式&#xff1a; *.abc*.bvh*.dae*.fbx*.glb*.gltf*.obj*.ply*.stl*.svg*.usd*.usda*.…

【QT问题】 Qt信号函数如果重名,调用怎么处理

问题描述&#xff1a; 在调用某个类的信号函数的时候&#xff0c;出现信号函数名字相同&#xff0c;参数不同的情况&#xff0c;但是Qt在链接信号槽的时候&#xff0c;又不需要指明信号函数参数&#xff0c;此时就会出现无法分辨的情况。 例如&#xff1a;QComboBox的信号 Q_…

前端学习之用css和html做一个仿淘宝的导航栏

代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>仿淘宝界面案例</title><style>/* 最外层盒子 */.container{width: 270px;height: 385px;border: 1px solid rgb(255, 208, 0);bord…

MacOS快速安装FFmpeg、ffprobe、ffplay

文章目录 一、工具简介二、mac 安装ffprobe、FFmpeg等相关工具2.1 方法一&#xff1a;使用Homebrew安装FFmpeg2.2 从官网下载FFmpeg安装包&#xff0c;源码安装2.3 macOS 无法验证开发者时安装 一、工具简介 这些工具都是与多媒体处理和流媒体相关的开源工具&#xff0c;它们都…

学习vue3第十节(插槽v-slot)

本节主要介绍一下 v-slot 插槽指令&#xff0c;以及插槽相关内容 1、定义&#xff1a; 子组件给父组件提供使用的一个位置&#xff0c;使用<slot></slot>表示&#xff0c;父组件可以在这个位置填充任何代码&#xff1b; 2、默认插槽 匿名插槽&#xff1a;会自定…

JavaScript中的正则表达式使用总结

JavaScript中的正则表达式是一种强大的工具&#xff0c;用于处理文本数据&#xff0c;包括搜索、匹配和替换文本中的特定字符或模式。以下是对JavaScript中正则表达式使用的一些总结&#xff1a; 1. 创建正则表达式 在JavaScript中&#xff0c;你可以使用字面量或RegExp对象来…

管道疏通房屋补漏官方网站源码-视频搭建教程

[安全]修复jquery低版本的xss安全漏洞&#xff0c;升级用最新版jquery&#xff1b; [新增]后台的登录页、欢迎页支持自定义模板文件&#xff1b; [新增]后台多语言列表管理支持手工同步文档数据&#xff1b; [新增]后台商品发布时&#xff0c;单规格商品支持会员折扣价的设置…

微信小程序多图列表页面性能问题为什么会出现?如何解决?

微信小程序中的多图列表页面性能问题主要是由于以下几个原因导致的&#xff1a; 图片过大&#xff1a;在多图列表页面中&#xff0c;如果图片过大&#xff0c;会导致页面加载时间过长&#xff0c;从而影响用户体验。请求过多&#xff1a;在多图列表页面中&#xff0c;如果一次…

C语言自定义类型联合体和枚举

union n.工会&#xff1b;联邦&#xff0c;联盟&#xff1b;协会&#xff0c;俱乐部&#xff1b;联合&#xff0c;合并&#xff1b; 结婚&#xff0c;婚姻&#xff1b;美利坚合众国&#xff08;the Union&#xff09;&#xff1b; &#xff08;数&#xff09;并&#xff0c;并集…

Java学习10

目录 一.多态&#xff1a; 1.方法的多态&#xff1a; 2.对象的多态&#xff1a; 3.多态的注意事项与细节&#xff1a; 5.多态的应用: 二.Java的动态绑定机制&#xff1a; 三.多态应用&#xff1a; 1.多态数组&#xff1a; 2.多态参数&#xff1a; 三.Object类&#xf…

交互式QGraphicsView(平移/缩放/旋转)

一 简述 Graphics View提供了一个平台&#xff0c;用于大量自定义 2D 图元的管理与交互&#xff0c;框架包括一个事件传播架构&#xff0c;支持场景 Scene 中的图元 Item 进行精确的双精度交互功能。Item 可以处理键盘事件、鼠标按下、移动、释放和双击事件&#xff0c;同时也…