爬虫毕设(三):爬取动态网页

2023-11-04

动态网页分析

按照上一篇的分析,直接使用XPath找到该标签,然后通过parse提取出数据,在写入到item中就完事了。但是,当信心满满的写完代码后却发现,控制台输入了一个简简单单的[]
正常
小问号你是否有很多朋友。
小朋友,你是否有很多问号
一顿操作猛如虎,一看输出数据无。那么这到底是怎么回事呢?我们从头开始分析。

打开NetWork,找到tv/,点开Preview,结果发现只有一个框架,内容却是空白的。

这是由于网页执行js代码,通过Ajax请求数据来重新渲染页面的。所以我们需要找到有数据的那一个请求,然后再对该请求的目标url爬取。
在这里插入图片描述
可以在preview中看到这就是我们想要的数据。
异步请求数据
我们再找到该请求的header,找到Request URL。
真正的目标url
我们直接复制链接到地址栏中,看到我们想要的数据,这熟悉的格式,不就是json吗。
在这里插入图片描述
动手撸代码,爬取这个网页,处理json数据,拿到自己想要的数据。

class tvSpider(scrapy.Spider):
    name = "douban_tv"
    allowed_domain = ["movie.douban.com"]

    def __init__(self, *args, **kwargs):
        super(tvSpider, self).__init__(*args, **kwargs)
        self.start_urls = ["https://movie.douban.com/j/search_subjects?type=tv&tag=热门&sort=recommend&page_limit=20&page_start=0"]

    def parse(self, response):
        results = json.loads(response.body)['subjects']
        for result in results:
            tv_item = TvListItem()
            url = result['url']

            tv_item['url'] = url.strip()
            print(url)

这次我们的思路是先拿到每部电视剧的url,然后再回调二次解析的函数获取详细信息。运行爬虫,可以看到我们已经得到了自己想要的结果。
爬接下在就迭代使用scrapy.Request()请求每一个url,再使用二次解析函数parse_detait获取详细数据。
two years later
two years later。经过漫长的debug,终于得到以下代码代码:

    def parse_detail(self, response):
        tv_item = response.meta['tv_item']
        result = Selector(response)

        # 字符串前加u表示处理中文字符

        # 剧名
        title = result.xpath(u'//div[@id="content"]/h1/span[1]/text()').extract()[0] + result.xpath('//div[@id="content"]/h1/span[2]/text()').extract()[0]

        # 又名
        has_alias = result.xpath(u'//div[@id="info"]//span[text()="又名:"]').extract()
        if has_alias:
            alias = result.xpath(u'//div[@id="info"]//span[text()="又名:"]/following::text()[1]').extract()[0]
        else:
            alias = ''
        
        # 图片
        tv_img = result.xpath('//a[@class="nbgnbg"]/img/@src').extract()[0]

        # 导演
        has_dir = result.xpath('//div[@id="content"]//span[text()="导演"]')
        if has_dir:
            directors = result.xpath('//div[@id="info"]//span[@class="attrs"]//a[@rel="v:directedBy"]/text()')
            director_lsit = directors.extract()
            director = '/'.join(director_lsit)

        # 主演
        all_actors = result.xpath('//div[@id="info"]//span[@class="attrs"]//a[@rel="v:starring"]/text()')
        actors_list = all_actors[:5].extract()
        actors = '/'.join(actors_list)

        # 类型
        tv_types = result.xpath('//div[@id="info"]//span[@property="v:genre"]/text()')
        type_list = tv_types.extract()
        tv_type = '/'.join(type_list)

        # 制片地区或国家
        country_or_region = result.xpath(u'//div[@id="info"]//span[text()="制片国家/地区:"]/following::text()[1]').extract()[0]

        # 首播
        first_time = result.xpath('//div[@id="content"]//span[@property="v:initialReleaseDate"]/text()').extract()[0]

        # 集数 
        series = result.xpath(u'//div[@id="content"]//span[text()="集数:"]/following::text()[1]').extract()[0]

        # 单集
        has_single = result.xpath('//div[@id="content"]//span[text()="单集片长:"]')
        if has_single:
            single = result.xpath(u'//div[@id="content"]//span[text()="单集片长:"]/following::text()[1]').extract()[0]

        # 评分
        rate = result.xpath('//strong/text()').extract()[0]

        # 评分人数
        votes_num = result.xpath('//span[@property="v:votes"]/text()').extract()[0]

        # 简介
        synopsis = result.xpath('//span[@property="v:summary"]/text()').extract()[0].strip()

        tv_item['title'] = title.strip()
        tv_item['alias'] = alias.split()
        tv_item['tv_img'] = tv_img.strip()
        tv_item['director'] = director.strip()
        tv_item['actors'] = actors.strip()
        tv_item['tv_type'] = tv_type.strip()
        tv_item['country_or_region'] = country_or_region.strip() 
        tv_item['first_time'] = first_time.strip()
        tv_item['series'] = series.strip()
        tv_item['single'] = single.strip()
        tv_item['rate'] = rate.strip()
        tv_item['votes_num'] = votes_num.strip()
        tv_item['synopsis'] = synopsis

        print('电视剧信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
        print('剧名:' + title)
        print('又名:' + alias)
        print('海报:' + tv_img)
        print('导演:' + director)    
        print('主演:' + actors)       
        print('类型:' + tv_type)     
        print('制片国家或地区:' + country_or_region)
        print('首播:' + first_time)
        print('集数:' + series)
        print('单集时长:' + single)
        print('评分:' + rate)
        print('评分人数:' + votes_num)
        print('简介:' + synopsis)

然后整整二十部电视剧的简介疯狂刷屏:
电视剧刷屏
虽然经历了一番腰酸背痛,头眼昏花,问题好歹是解决了。

个人微信公众号

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬虫毕设(三):爬取动态网页 的相关文章

随机推荐

  • C语言系列:2、数据类型、运算符和表达式

    C语言系列 2 数据类型 运算符和表达式 文章目录 C语言系列 2 数据类型 运算符和表达式 1 前言 2 变量名 3 数据类型和长度 3 1 基本数据类型 3 2 short和long限定符 3 3 signed 与unsigned限定符
  • (三)运行微信小程序:在主页加入扫码组件

    制作了多个页面后 我们试图在小程序中添加些其他功能 比如实现扫码功能 1 在二维码生成网站上 生成一张二维码或条形码照片 百度 二维码生成 即可找到生成网站 这里我们使用 2023你好吗 数字加文字的形式生成如下二维码 并保存到本地 供后续
  • OpenCV获取摄像头编号及名称

    欢迎使用Markdown编辑器 你好 这是你第一次使用 Markdown编辑器 所展示的欢迎页 如果你想学习如何使用Markdown编辑器 可以仔细阅读这篇文章 了解一下Markdown的基本语法知识 方法 OpenCV的VideoCapt
  • Github 项目托管

    为了方便代码的管理 可以使用 github 来托管我们的项目 把每次更新的代码放到 github 上还能够提高代码的共享性 首先需要注册并登我们的 github 账号 https github com 新建仓库 New repository
  • DataPipeline如何实现数据质量管理

    数据质量管理已经成为数据治理的重要组成部分 高质量的数据是企业进行决策的重要依据 DataPipeline数据质量平台整合了数据质量分析 质量校验 质量监控等多方面特性 以保证数据质量的完整性 一致性 准确性及唯一性 帮助企业解决在数据集成
  • vue+webpack实现异步组件加载

    8 9更新 之前想搬迁到csdn的时候由于邀请码问题迟迟没把博客转过来 所以跑去博客园了 今天发现csdn已经帮我把文章搬过来 有必要修正一下这篇文章 写这篇文章的时候因为刚接触vue 所以捣鼓的时候有些迷糊 以下可以跳过 本来很简单的事情
  • Centos8 Failed to download metadata for repo ‘AppStream‘解决

    1 这个问题主要原因是 CentOs Linux 8 从 2021 10 31 号后已经停止维护 CentOS 8 将不再从 CentOS 官方项目获得开发资源 所以之后更新镜像需要通过 vault centos org来获取更新 2 进入
  • 无向图的表示:邻接矩阵和邻接表

    这里将一个无向图用邻接表和邻接矩阵表示 输入 顶底个数n 图中的各个边 用两个顶点表示 输出 这个无线图的邻接矩阵和邻接表 其中邻接表中的链接按元素大小升序排列 先给出一个例子说明 假设有无向图如下 则其邻接矩阵和邻接表如提示框中所示 其实
  • javaweb项目实战(附有源码)

    这个代码是我做微信小程序的时候 专门用java做的web项目 主要是为前端提供接口 便于前端调用数据 如果有想要参考javaweb项目如何做的小伙伴 可以到github上下载 github上有前端和后端代码 在wiki上还有表结构和接口文档
  • VIM 点滴积累

    删除列 1 光标定位到要操作的地方 2 CTRL v 进入 可视 块 模式 选取这一列操作多少行 3 d 删除 插入列 插入操作的话知识稍有区别 例如我们在每一行前都插入 1 光标定位到要操作的地方 2 CTRL v 进入 可视 块 模式
  • java stream SONObject和JSONArray操作

    转自 https zhuanlan zhihu com p 36865573 1 取最后一条数据 stream对象存在方法findFirst 我们可以很方便的取到第一条数据 但它却没有findLast方法 需要取到最后一条数据 我们可以将数
  • 模型微调(Finetune)

    参考 https zhuanlan zhihu com p 35890660 ppt下载地址 https github com jiangzhubo What is Fine tuning 一 什么是模型微调 给定预训练模型 Pre tra
  • IDDPM论文阅读

    论文链接 Improved Denoising Diffusion Probabilistic Models 文章目录 摘要 引言 去噪扩散概率模型 定义 实际训练 对数似然改善 可学习的
  • Linux-Shell技巧-参数化alias

    shell脚本提供了改写命令方式 alias 但是alias改写常用的是直接改写方式 比如如下操作 alias ll ls alt alias g gvim 但通常情况下 有的明林需要传递参数 或者用户可以自定义话一些常用的路径 但有些文件
  • docker-/var/lib/docker数据迁移

    docker默认目录是 var lib docker 位于系统盘上 占用空间比较大 计划迁移到新挂在的盘上 第一步 在新盘上创建文件夹 mkdir p data docker lib 第二步 复制文件到新目录 rsync avz var l
  • 数据结构与算法(二十)快速排序、堆排序(四)

    数据结构与算法 三 软件设计 十九 https blog csdn net ke1ying article details 129252205 排序 分为 稳定排序 和 不稳定排序 内排序 和 外排序 内排序指在内存里 外排序指在外部存储空
  • electron-vue工程创建

    创建工程 创建一个工作文件夹用于存放所有Electron工程 设为 D work 打开CMD cd到 D work 文件夹下 然后执行命令 创建 electron vue 工程 创建过程会多次提示输入信息 vue init simulate
  • 【2011集训队出题】Digit

    Description 在数学课上 小T又被老师发现上课睡觉了 为了向全班同学证明小T刚才没有好好听课 数学老师决定出一道题目刁难一下小T 如果小T答不出 那么 情节就按照俗套的路线发展下去了 小T显然无法解决这么复杂的问题 可怜的小T只能
  • 联想拯救者系统重装?不求人教程

    前阵子帮人重装了联想原装系统 今天总结一下步骤 造福那些想给女同志装联想原装系统而无从下手的工具人 哈哈哈哈哈 进入正题 既然要重装系统 就绕不开做启动盘 要做一个玉洁冰清 小声BB 纯净无插件 的启动盘 U盘启动盘制作工具的选择就很关键
  • 爬虫毕设(三):爬取动态网页

    动态网页分析 按照上一篇的分析 直接使用XPath找到该标签 然后通过parse提取出数据 在写入到item中就完事了 但是 当信心满满的写完代码后却发现 控制台输入了一个简简单单的 小问号你是否有很多朋友 一顿操作猛如虎 一看输出数据无