• 爬虫学习(05): 数据解析_bs4篇


    一、bs4模块简介

    1. 作用:对源代码进行数据解析
    2. 安装:到本地终端下,输入以下代码,即可安装
    pip install bs4  # BeautifulSoup
    
    • 1
    1. 导包:
    #  使用BeautifulSoup的模块的时候需要导入模块
    from bs4 import BeautifulSoup
    
    • 1
    • 2
    1. 关于bs4
      本质上我们知道两个东西就好, 一个是find,另一个是find_all, 从名字上看. 一个是查找一个, 另一个是查找所有.
    • find: 在页面中查找一个结果, 找到了就返回
    • find_all: 在页面中查找一堆结果. 找完了才返回(列表
    • 这两个功能拥有相同的参数结构. 学一个即可
    #  伪代码
    find(标签, attrs={属性:})
    
    • 1
    • 2
    1. 应用场景:
      xml(自定义标记语言),svg

    二、bs4实战

    1. 爬取壁纸网站的壁纸

    '''
    需求:爬取网站上的桌面壁纸(点进去后的高清壁纸)
    需要点击图片下面的文字(超链接) -> 进入到子页面中获取图片下载地址
    '''
    import requests
    from bs4 import BeautifulSoup
    from urllib.parse import urljoin  # 专门用于网站路径拼接
    headers = {
            'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'
        }
    def get_source(url):
    
        resp = requests.get(url, headers=headers)
        resp.encoding = 'gb2312'
        return resp.text
    
    def data_parse(resp):
        #  直接把页面源代码塞进去,html.parser是html解析器
        main_page = BeautifulSoup(resp, 'html.parser')
        #  观察页面源代码可以发现,需要的数据全在ul标签下,所以先定位到ul
        #  需要注意的是class='pic-list2  clearfix',选择class中其中一个就可以了
        ul = main_page.find('ul', attrs={'class': 'clearfix'})
        #  拿到所有的a标签(其中包含超链接)
        #  findall返回的是一个列表
        a = ul.find_all('a', attrs={'class': 'pic'})
        return a
    
    def download_img(a, url):
        #  1. 首先需要获取到每个a中的href值
        #  想要从bs4里面拿到某一个标签的某一个属性 用get
        for i in a:
            # i.text  # 获取i
            # 标签中间的文字
            href = i.get('href')
            # print(href)
            #  前面两个href是以exe结尾的,是网站携带的网站,所以需要去掉
            if href.endswith('exe'):
                continue
            #  拼接url,获取到真正的url
            href = urljoin(url, href)
            child_resp = requests.get(href, headers=headers)
            child_page = BeautifulSoup(child_resp.text, 'html.parser')
            src = child_page.find('img', attrs={'id': 'bigImg'}).get('src')
            # print(src)
            resp_img = requests.get(src, headers=headers)
            file_name = src.split('/')[-1]
            file_path = f'练习/{file_name}'
            #  下载图片
            with open(file_path, mode='wb') as f:
                f.write(resp_img.content)
                print(f'{file_name}下载成功!!!')
    
    
    if __name__ == '__main__':
        url = 'https://desk.zol.com.cn/pc/'
        #  1. 获取页面源代码
        resp = get_source(url)
        #  2. 数据解析
        a = data_parse(resp)
        #  3. 通过子链接下载图片
        download_img(a, url)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    2. css选择器在bs4中的应用

    关于选择器. 这里我们讲两个功能

    1. select_one(选择器) 使用选择器获取html文档中的标签, 拿一个
    2. select(选择器) 使用选择器获取html文档中的标签, 拿一堆
    '''需求:和01一样'''
    import requests
    from bs4 import BeautifulSoup
    url = 'https://desk.zol.com.cn/pc/'
    headers = {
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'
    }
    resp = requests.get(url, headers)
    resp.encoding = 'gbk'
    main_page = BeautifulSoup(resp.text,'html.parser')
    # main_page.select(css选择器) # 选一堆
    # main_page.select_ont(css选择器) # 选一个
    
    # 根本目标:拿到每个详情页的url地址 -> a
    a_list = main_page.select(".photo-list-padding > a")
    for a in a_list:
        href = a.get('href')
        print(href)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    三、关于bs4总结

    1. 应用场景xml或者svg文本中,解析数据比其他两个解析方法方便
    2. xpath一样,也是需要先解析页面源代码
    3. bs4 中只需要记住两个操作就够 find()和find_all()
    4. bs4中拿属性 -> 标签名.get(属性名) -> a.get(href) -> 在超链接中获取子url地址
    5. bs4中获取text文本 -> 标签名.text
  • 相关阅读:
    码住这些视频配音软件,一键完成配音
    03_kafka-eagle 监控
    前端项目启动步骤
    中断系统中的设备树__中断号的演变与irq_domain
    linux 分区 添加 挂载centos挂载 Microsoft basic
    搜索技术【深度优先搜索】 - DFS+ 剪枝优化 【POJ No. 2676】数独游戏 Sudoku
    .NET混合开发解决方案6 检测是否已安装合适的WebView2运行时
    ArmSoM-RK3588编解码之mpp编码demo解析:mpi_enc_test
    【C++】STL简介 | STL六大组件 | string类 | string类对象操作
    解决不能拉取 docker 镜像
  • 原文地址:https://blog.csdn.net/m0_48936146/article/details/127455224