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

    • 一、bs4模块简介
    • 二、bs4实战
      • 1. 爬取壁纸网站的壁纸
      • 2. css选择器在bs4中的应用
    • 三、关于bs4总结

一、bs4模块简介

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

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)

三、关于bs4总结

  1. 应用场景xml或者svg文本中,解析数据比其他两个解析方法方便
  2. xpath一样,也是需要先解析页面源代码
  3. bs4 中只需要记住两个操作就够 find()和find_all()
  4. bs4中拿属性 -> 标签名.get(属性名) -> a.get(href) -> 在超链接中获取子url地址
  5. bs4中获取text文本 -> 标签名.text

你可能感兴趣的:(爬虫学习,爬虫,学习,python)