第22天---Python爬虫---BeautifulSoup库

第22天—Python爬虫—Beautiful Soup库

Beautiful Soup 的简介

简单来说,Beautiful Soup 是 python 的一个库,最主要的功能是从网页抓取数据。官方解释如下:

Beautiful Soup 提供一些简单的、python 式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。 Beautiful Soup 自动将输入文档转换为 Unicode 编码,输出文档转换为 utf-8 编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup 就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。 Beautiful Soup 已成为和 lxml、html6lib 一样出色的 python 解释器,为用户灵活地提供不同的解析策略或强劲的速度。

更多相关知识请看Beautiful Soup官方文档

Beautiful Soup 安装

进入终端输入下面的命令,安装Beautiful Soup三方库

pip install beautifulsoup4

使用Beautiful Soup

from bs4 import BeautifulSoup

html = """
The Dormouse's story

The Dormouse's story

Once upon a time there were three little sisters; and their names were , Lacie and Tillie; and they lived at the bottom of a well.

...

""" # 创建 Beautiful Soup 对象: soup = BeautifulSoup(html, 'lxml') # print(soup, type(soup), sep='\n') # prettify()格式化HTML源码 print(soup.prettify()) # 打印标签: 打印第一个某某标签的内容 print(soup.head.title) # 打印标签内容:4种方法 print(soup.head.title.string) print(soup.head.title.get_text()) print(soup.head.title.text) print(soup.head.title.contents) # 对应结果: """ The Dormouse's story The Dormouse's story The Dormouse's story ["The Dormouse's story"] """ # 选择标签方法内容: # select: 使用(id、class、标签、属性、父子、后代、兄弟、相邻兄弟选择器等)去选择标签,返回的结果是一个列表 # select_one: 使用(id、class、标签、属性、父子、后代、兄弟、相邻兄弟选择器等)去选择标签, 返回的结果是select结果中的第一个元素 p_list = soup.select('body > p') print(p_list) p_list_1 = soup.select('body > .title') print(p_list_1) p = soup.select_one('body > p') print(p) # 对应结果: """ [

The Dormouse's story

,

Once upon a time there were three little sisters; and their names were , Lacie and Tillie; and they lived at the bottom of a well.

,

...

] [

The Dormouse's story

]

The Dormouse's story

"""

HTML页面的结构

超文本标签语言 —> 所有的内容都放在标签下

标签:承载内容

/

/ / /
  • 文本标签 / 链接标签 / 列表 / 表格 / 表单 / 图片 / 音视频 / 窗口

    CSS(Cascading Style Sheet):页面渲染

    ​ 选择器 —> 样式属性名: 样式属性值

    • 标签选择器 —> div
    • 类选择器 —> .foo
    • ID选择器 —> #bar
    • 父子选择器 —> div > p
    • 后代选择器 —> div p
    • 兄弟选择器 —> div ~ p
    • 相邻兄弟选择器 —> div + p
    • 伪类/伪元素 —> a:visited / p:first-letter

    使用Beautiful Soup爬取链家数据

    import requests
    from bs4 import BeautifulSoup
    
    for page in range(1, 10):
    	# 网址
        URL = f'https://cd.lianjia.com/ershoufang/pg{page}/'
        # 请求头
        headers = {
            'User-Agent': 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
        }
        # 抓取页面
        resp = requests.get(url=URL, headers=headers)
    	# 创建 Beautiful Soup 对象:
        soup = BeautifulSoup(resp.text, 'lxml')
    	# 获取li标签,每个li标签包含每个二手房的所有信息
        li_list = soup.select('body > .content > .leftContent > .sellListContent > .clear')
    
        for i in li_list:
            # 标题
            title = i.select_one('li > .info > .title > a').text
            print(title)
    
            # 超链接
            href = i.select_one('li > .info > .title > a').attrs['href']
            print(href)
    
            # 位置
            area = i.select_one('li > .info > .flood > .positionInfo ').text.replace(' ', '')
            print(area)
    
            # 单价
            unit_price = i.select_one('li > div.info > div.priceInfo > div.unitPrice > span').text
            print(unit_price)
    
            # 总价
            total_price = i.select_one('li > div.info.clear > div.priceInfo > div.totalPrice > span').text
            print(total_price)
    
            print('-' * 10)
    
    第22天---Python爬虫---BeautifulSoup库_第1张图片

    练习:

    抓取中国新闻网当天新闻

    import requests
    import time
    from bs4 import BeautifulSoup
    
    flag = True
    page = 1
    
    while flag:
        URL = f'https://www.chinanews.com/scroll-news/news{page}.html'
        headers = {
            'User-Agent': 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
        }
        resp = requests.get(url=URL, headers=headers)
    	# 保证页面正常显示
        resp.encoding = 'utf-8'
    	# 创建 Beautiful Soup 对象:
        soup = BeautifulSoup(resp.text, 'lxml')
    	# 获取li标签 每个li标签包含了每条新闻的所有数据
        li_list = soup.select('#content_right > div.content_list > ul > li')
    	# 页面加一
        page += 1
        # 获取
        localtime = time.localtime()
    
        for i in li_list:
            try:
            	# 获取当天新闻
                if i.select_one('li > div.dd_time').text[:-6] == f'{localtime.tm_mon}-{localtime.tm_mday}':
                	# 新闻类型
                    news_type = i.select_one('li > div.dd_lm').text      
    
    				# 新闻标题
                    news_title = i.select_one('li > div.dd_bt > a').text
    
    				# 新闻链接
                    news_href = 'https:' + i.select_one('li > div.dd_bt > a').attrs['href']
    
    				# 新闻时间
                    news_time = i.select_one('li > div.dd_time').text
    
                    print(news_type, news_title, news_time)
                    print(news_href)
                    print('--' * 30)
                else:
                    flag = False
                    break
            except:
                pass
    

    .attrs[]获取标签里面的属性

    第22天---Python爬虫---BeautifulSoup库_第2张图片
  • 你可能感兴趣的:(python爬虫,python,爬虫,BeautifulSoup)