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

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

时间:2024-07-22 19:57:11浏览次数:15  
标签:__ xpath span Python 电影 爬取 url div film

一、深度爬取

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

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

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

        比如点开下列页面中的链接得到另一个页面,而另一个页面就有很多新的数据,就可以爬取更多的东西,当然了,点开后的链接也可以下次爬取,只需要对爬到的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())

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

标签:__,xpath,span,Python,电影,爬取,url,div,film
From: https://blog.csdn.net/qq_64603703/article/details/140616476

相关文章

  • 2024钉钉杯及2023钉钉杯ABC题分析
    钉钉杯,通常指的是钉钉杯大数据挑战赛,这是一场由阿里巴巴旗下钉钉举办的全国性大数据竞赛。以下是对钉钉杯的详细解析:一、竞赛背景与目的钉钉杯大数据挑战赛旨在通过大数据竞赛的形式,激发学生对大数据技术的兴趣,提升他们的数据分析和数据挖掘能力。同时,该竞赛也为学生提供了一......
  • PPT插入的图片去哪找?3款好用的在线PPT工具推荐,办公必备!
    在制作PPT时,一张恰到好处的图片能让PPT更富有吸引力,也能引起观众的兴趣。俗话说,一图胜千言,那么如何为PPT快速找到合适的图片呢?今天这篇文章,我将向你介绍做PPT常用的3款自带无版权图库的PPT软件,这些PPT软件不仅内嵌了海量高质量的无版权图片,而且插入PPT也非常方便。话不多说,让......
  • 攻击方法(Adversarial method)
    简介本文基于文章AReviewofAdversarialAttackandDefenseforClassificationMethods的总结,提供对抗领域的几种常见的攻击方法;一、基于梯度的攻击(Gradient-BasedAttack)非常经典的一种攻击方式,传统论文采用的攻击方法如FGSM,PGD,BIM,C&W等都是基于梯度的攻击方法这些......
  • 谈一谈一条SQL查询语句究竟是如何执行的?
    这里写目录标题理解执行流程衍生知识最后本篇文章是基于《MySQL45讲》来写的个人理解与感悟。理解先看下图:大体来说,MySQL可以分为Server层和存储引擎层两部分。就是对应着图中的两个圈。server层包含查询缓存、分析器、优化器、执行器等,以及及所有的内置函数(如......
  • 7.22数据结构
    笔记链表一.链表的引入1.1总结顺序表的优缺点    1)优点:能够直接通过下表进行定位元素,访问效率高,对元素进行查找修改比较快    2)不足:插入和删除元素需要移动大量的元素,效率较低    3)缺点:存储数据元素有上限,当达到MAX后,就不能再添加元素了、1.2链......
  • 【ACM出版】2024年云计算与大数据国际学术会议(ICCBD 2024,7月26-28)
    2024年云计算与大数据国际学术会议(ICCBD2024)将于2024年7月26-28日在中国大理召开。ICCBD2024将围绕“云计算与大数据”的最新研究领域,旨在为从事研究的专家、学者、工程师和技术人员提供一个国际平台,分享科研成果和尖端技术,了解学术发展趋势,拓宽研究思路,加强学术研......
  • (图文)vscode cph设置文件路径(全网首发,但是丐版)
    目录引言(全是废话,不要看,直接跳到正文)正文(直接看这就行)引言(全是废话,不要看,直接跳到正文)由于我经常使用洛谷刷题,并且我使用vsocde作为编辑器,那么必不可少的就是一个叫做vscode-luogu的插件,这个插件可以实现题目的搜索、查看和提交(不过貌似这个插件已经停更了),如果你还装了c......
  • 【Golang 面试基础题】每日 5 题(三)
    ✍个人博客:Pandaconda-CSDN博客......
  • 猜数字游戏
    代码实现在文章的结尾处猜数字游戏一、rand函数(一)语法结构rand();(二)介绍这个函数是用来生成伪随机数的,伪随机数并不是完全随机的,伪随机数是靠“种子”生成的.rand函数的使用要包含<stdlid>这个头文件实例:#include<stdio.h>#include<stdlib.h>intmain(){ i......
  • 附加篇 函数经典模块
    1.open函数使用 在Python中,open()函数用于打开文件,并返回一个文件对象,可以用于读取或写入文件。f=open("./44.函数的参数.py",mode='r',encoding="utf8")#是否可读#print(f.readable(),f.writable())#读取整个文件返回字符串content=f.read()print(cont......