《0基础》学习Python——第二十四讲__爬虫/<7>深度爬取

news2024/9/22 13:43:38

一、深度爬取

        深度爬取是指在网络爬虫中,获取网页上的所有链接并递归地访问这些链接,以获取更深层次的页面数据。

        通常,一个简单的爬虫只会获取到初始页面上的链接,并不会进一步访问这些链接上的其他页面。而深度爬取则会不断地获取链接,并继续访问这些链接上的页面,直到达到设定的深度限制或者没有更多的链接可供访问为止。这样可以更全面地获取网页上的数据,并且可以发现更多的链接。但是需要注意的是,深度爬取需要谨慎操作,以免对目标网站造成过大的负载。

二、爬取豆瓣电影的电影链接中的数据

        比如点开下列页面中的链接得到另一个页面,而另一个页面就有很多新的数据,就可以爬取更多的东西,当然了,点开后的链接也可以下次爬取,只需要对爬到的URL再次进行发送get请求即可。

点开蓝色选中的链接得到关于这个电影的全部信息:

上图中所有的数据都可以爬取,下面我们就演示一下对电影目录一整页的数据进行深度爬取

三、实战爬取整页电影目录的数据

        1、获取这一整页电影的所有URL:

        经过前面几节课,我们也都学习了怎么样去获取网页信息,因为这些电影都是存放在一个列表里的(在点击网络-元素-在网页中选择一个元素检查的标识,当选中网页中可以看到各个板块的排列位置),或者也可以在‘元素’里看到当前页面电影信息都存放在li标签下,所以可以通过下列图片得到单个电影的URL,下面代码部分就是爬取到了所有电影的URL了:

import requests
from lxml import etree
import fake_useragent

if __name__ == '__main__':
    head={
        'User-Agent':fake_useragent.UserAgent().random   #随机生成一个UA标识
    }
    #获取当前页面的URL
    url='https://movie.douban.com/top250'
    #发送get请求
    response=requests.get(url,headers=head)
    #返回获取到的页面源码
    lxml_info=response.text
    #解析获取到的信息
    tree=etree.HTML(lxml_info)
    #利用xpath定位到所有电影存放的标签下
    film=tree.xpath('//ol[@class="grid_view"]/li')
    #对获取到的所有li标签进行遍历循环
    for li in film:
        #当前位置在li标签,用xpath读取到电影链接,再通过join去除括号
        film_url="".join(li.xpath('./div/div[2]/div[1]/a/@href'))
        print(film_url)

2、爬取链接内的页面信息

通过上一步我们已经得到所有电影的URL了,那么下一步则是对这些URL继续进行get请求:

    for li in film:
        #当前位置在li标签,用xpath读取到电影链接,再通过join去除括号
        film_url="".join(li.xpath('./div/div[2]/div[1]/a/@href'))
        #对获取到的URL发送get请求
        res=requests.get(film_url,headers=head)
        #打印请求到的信息
        res_t=res.text

获取到电影页面信息后我们继续像上部一样对这段数据进行处理,即以下代码:

        res_t=res.text
        # print(res_t)
        #解析获取到的信息
        tree_url=etree.HTML(res_t)
        #定位到所需要信息的位置,比如我们要爬取他的剧情简介
        #首先是电影名称
        fil_name="".join(tree_url.xpath('//body/div[3]/div[1]/h1/span[1]/text()'))

        #其次是电影的简介内容
        #因为此处有两种类型的电影简介标签位置span[1]和span[2],所以做一个判断,如果电影1有内容那么打印电影1,反之打印电影2
        if "".join(tree_url.xpath('//div[@class="related-info"]/div[1]/span[2]/text()')):
            print(fil_name)
            print("".join(tree_url.xpath('//div[@class="related-info"]/div[1]/span[2]/text()')).strip())

        else:
            film_jianjie = "".join(tree_url.xpath('//div[@class="related-info"]/div[1]/span[1]/text()'))
            print(fil_name)
            print(film_jianjie.strip())

注意:此处做了一个判断,因为其中电影的标签存放位置略有不同,即span[1]和span[2]

如下图肖申克的救赎,其简介存放在标签span[2]下,而霸王别姬存放在span[1]下:

霸王别姬如下:

3、完整代码如下:

import requests
from lxml import etree
import fake_useragent

if __name__ == '__main__':
    head={
        'User-Agent':fake_useragent.UserAgent().random   #随机生成一个UA标识
    }
    #获取当前页面的URL
    url='https://movie.douban.com/top250'
    #发送get请求
    response=requests.get(url,headers=head)
    #返回获取到的页面源码
    lxml_info=response.text
    #解析获取到的信息
    tree=etree.HTML(lxml_info)
    #利用xpath定位到所有电影存放的标签下
    film=tree.xpath('//ol[@class="grid_view"]/li')
    #对获取到的所有li标签进行遍历循环
    for li in film:
        #当前位置在li标签,用xpath读取到电影链接,再通过join去除括号
        film_url="".join(li.xpath('./div/div[2]/div[1]/a/@href'))
        #对获取到的URL发送get请求
        res=requests.get(film_url,headers=head)
        #打印请求到的信息
        res_t=res.text
        # print(res_t)
        #解析获取到的信息
        tree_url=etree.HTML(res_t)
        #定位到所需要信息的位置,比如我们要爬取他的剧情简介
        #首先是电影名称
        fil_name="".join(tree_url.xpath('//body/div[3]/div[1]/h1/span[1]/text()'))

        #其次是电影的简介内容
        #因为此处有两种类型的电影简介标签位置span[1]和span[2],所以做一个判断,如果电影1有内容那么打印电影1,反之打印电影2
        if "".join(tree_url.xpath('//div[@class="related-info"]/div[1]/span[2]/text()')):
            print(fil_name)
            print("".join(tree_url.xpath('//div[@class="related-info"]/div[1]/span[2]/text()')).strip())

        else:
            film_jianjie = "".join(tree_url.xpath('//div[@class="related-info"]/div[1]/span[1]/text()'))
            print(fil_name)
            print(film_jianjie.strip())

        另外可以在后面加一条创建新文件的代码用来存放这些数据,已达到获取信息存放到本地保存的目的。

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

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

相关文章

vue3 父组件 props 异步传值,子组件接收不到或接收错误

1. 使用场景 我们在子组件中通常需要调用父组件的数据,此时需要使用 vue3 的 props 进行父子组件通信传值。 2. 问题描述 那么此时问题来了,在使用 props 进行父子组件通信时,因为数据传递是异步的,导致子组件无法成功获取数据…

idea设置类注释模板作者、日期、描述等信息

文章目录 前言一、新建类的时候自动添加类注释1.打开设置2.模版配置示例如下3.实际生成效果 前言 由于每次换电脑时都需要重新对idea进行设置,为了方便大家的开发配置,同时也为自己以后配置留一份记录(毕竟每次换环境都需要重新配置一遍&…

DB2 SQL Error: SQLCODE=-302, SQLSTATE=22001, SQLERRMC=null

文章目录 一、报错内容二、原因三、DB2中的VARCHAR(100)类型能存储多少汉字? 一、报错内容 Cause: com.ibm.db2.jcc.am.mo: DB2 SQL Error: SQLCODE-302, SQLSTATE22001, SQLERRMCnull, DRIVER3.58.82 ; DB2 SQL Error: SQLCODE-302, SQLSTATE22001, SQLERRMCnull,…

Aider + Llama 3.1:无需编码开发全栈APP

Llama 3.1在代码生成方面的卓越表现 在代码生成领域,Llama 3.1的表现尤为出色,几乎成为了开源模型中的佼佼者。它不仅在代码自动化和生成方面表现突出,还可以作为AI编程助手,帮助调试代码和开发完整的应用程序。在多个基准测试中…

【用最少数量的箭引爆气球】python刷题记录

R2-贪心篇. 求最小,那就尽可能地假设更多的气球y值不相同咯。 不对,气球除了y值我们随便摆,所以找尽可能多重叠的,就作为同一只箭。 class Solution:def findMinArrowShots(self, points: List[List[int]]) -> int:#贪心策略…

JavaScript关键词

JavaScript 关键词 JavaScript 语句常常通过某个关键词来标识需要执行的 JavaScript 动作。 下面的表格列出了一部分将在教程中学到的关键词: 关键词 描述 break 终止 switch 或循环。 continue 跳出循环并在顶端开始。 debugger 停止执行 JavaScript&…

powershell自定义命令别名

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、查看命令别名二、常见的别名三、自定义别名1.GUI编辑2.命令行编辑 总结 前言 有时候在windows上使用powershell时候常常苦于别名问题,像我这样…

Windows系统下cython_bbox库的正确安装步骤最简单方法

​ 最近做的项目需要安装cython_bbox包,但是当我天真的输入pip install cython_bbox准备满心欢喜的等待安装成功却发现…,它报错了,这是一个从未见过的、非常长的报错,它长这个样子: ​​ 因此不能直接通过pip安装&am…

每日任务:TCP/IP模型和OSI模型的区别

介绍一下TCP/IP模型和OSI模型的区别? OSI模型由国标准化组织提出,而TCP/IP模型是由美国国防部开发的; OSI模型由七个层次组成,从下到上依次为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。而TCP/IP模型只有四层…

心动小站Ⅸ--Nvidia一种夸张的增长

当有灭绝级别的威胁时,你希望它如何出现在头版?华尔街日报或 CNN 的新闻中说它即将发生? 大多数新闻都是在灾难发生后才传到你耳中的。谈到人工智能,我们已经收到了很多警告,这些警告来自各个领域的专家,比…

多模态大模型应用中的Q-Former是什么?

多模态大模型应用中的Q-Former是什么? Q-Former是一种新型的神经网络架构,专注于通过查询(Query)机制来改进信息检索和表示学习。在这篇博客中,我们将详细探讨Q-Former的工作原理、应用场景,并在必要时通过…

jquery+bootstrap实现DOM转图片并下载

🍊jquery实现DOM结构转图片并下载 版本介绍: Bootstrap v3.3.7jQuery v3.5.1domToImage.js 根据Bootstrap实现dialog上一步下一步多个弹窗交互进行大肆修改,完善了第二步生成图片的功能与更强的交互 1.、功能说明 重新设置bootstrap主题色 …

JAVA.抽象、接口、内部类

1.抽象 共性,父类定义抽象方法,子类必须重写,或者子类也是抽象类 示例代码 animal package animalabstract;//定义抽象类animal public abstract class animal {String name;int age;//定义抽象方法eat,子类必须重写public abs…

《企业实战分享 · CodeGeeX 初体验》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

企业级视频拍摄与编辑SDK的全面解决方案

视频已成为企业传播信息、展示品牌、连接用户的重要桥梁,如何高效、专业地制作高质量视频内容,成为众多企业面临的共同挑战。美摄科技,作为视音频技术领域的创新先锋,以其强大的视频拍摄与编辑SDK,为企业量身打造了一站…

react中简单的配置路由

1.安装react-router-dom npm install react-router-dom 2.新建文件 src下新建page文件夹,该文件夹下新建login和index文件夹用于存放登录页面和首页,再在对应文件夹下分别新建入口文件index.js; src下新建router文件用于存放路由配置文件…

【Android】Activity生命周期与五种启动模式

文章目录 生命周期返回栈Activity状态生命周期方法 启动模式standard模式singleTask模式singleTop模式singleInstance模式singleInstancePerTask模式配置方式 生命周期 返回栈 每个Activity的状态由它在Activity栈(又叫“回退栈back stack”)中的位置决…

Web Worker 详细介绍

Web Worker 详细介绍 如果我们有一些处理密集型的任务,但是不想让它们在主线程上运行(那样会使浏览器/UI变慢),这时候我们可能会希望 JavaScript 可以以多线程的方式操作。 虽然 JavaScript 是单线程了,但是在浏览器…

超声波眼镜清洗机哪款好用又实惠?4款高评分眼镜清洗机机型深度测评

眼镜党都知道超声波清洗机吧,每次眼镜脏了,去眼镜店清洗,店员用的就是超声波清洗机。利用超声波的原理,这种清洗机可以深入物品内部进行清洁,效果非常出色。相比手工清洗,超声波清洗机能在清洁过程中保护镜…

远程项目调试-informer2020

informer2020 Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting(原文)Informer 是一个基于Transformer的模型,是为了应对长依赖关系而开发的。本文的主要主题是序列预测。序列预测可以在任何具有不断变化的数据的地方…