Python BeautifulSoup网络数据抓取实战演示

2023-07-0514:14:40云计算与物联网Comments936 views字数 7402阅读模式

现代数据驱动的世界里,网络数据抓取或称为"网页爬虫"已经成为一种非常重要的技能。无论是社交媒体分析,市场趋势预测,还是竞品研究,甚至机器学习的训练数据采集,都需要利用到这项技能。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

Python因为其强大的库支持和易读性,被广泛用于编写爬虫程序。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

在众多的Python库中,BeautifulSoup以其简单易用,强大的解析能力,成为了很多Python爬虫程序的首选。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

BeautifulSoup能帮助我们轻松地解析网页,提取出我们需要的信息。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

它可以把复杂的HTML代码转换成树状的数据结构,让我们能方便地定位和提取元素。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

接下来的文章内容,我将会带你一步步走进BeautifulSoup的世界,学习如何使用它来获取网络中的数据。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

什么是BeautifulSoup

BeautifulSoup是一个Python库,用于从HTML和XML文件中提取数据。它生成了一个解析树,使原始的复杂HTML文档变得易于搜索和操作。如果你需要对网页进行数据抓取,那么BeautifulSoup将是你的得力助手。它的主要功能包括:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

解析HTML,XML文档。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

提供简单直观的方式来选择和提取HTML元素。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

支持多种解析器,可以根据实际需求选择。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

BeautifulSoup的设计非常灵活,不仅可以用来提取网页中的信息,还可以用来修改和重排HTML文档。尤其值得一提的是,BeautifulSoup对于不完整或者不规范的HTML文档有很好的容错能力,可以解析大多数的网页。在接下来的内容中,我们会详细介绍如何使用BeautifulSoup进行数据抓取。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

安装BeautifulSoup

在开始使用BeautifulSoup之前,我们首先需要在Python环境中安装它。幸运的是,这个过程非常简单。打开你的终端或命令提示符,输入以下命令:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

pip install beautifulsoup4

这个命令将使用pip,Python的包管理器,来安装BeautifulSoup4,这是BeautifulSoup的最新版本。注意,BeautifulSoup4的名字中有一个"4",不要遗漏。安装完成后,你可以通过下面的命令来检查是否安装成功:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

python -c "import bs4; print(bs4.__version__)"

如果看到了版本号,说明BeautifulSoup已经成功安装在你的Python环境中了。接下来,我们将开始探索BeautifulSoup的基本使用方法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

BeautifulSoup的基础使用

在这部分,我们将了解BeautifulSoup的一些基础用法,包括如何读取HTML文档,如何解析,以及如何提取数据。1. 读取HTML文档文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

BeautifulSoup可以读取本地的HTML文件,也可以读取网络上的HTML文件。例如,下面的代码会从本地读取一个名为"example.html"的文件:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

from bs4 import BeautifulSoup
with open("example.html", "r") as f:    content = f.read()
soup = BeautifulSoup(content, 'html.parser')

如果你想读取网络上的一个HTML文件,可以使用requests库来发送一个HTTP请求,获取HTML文件:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

import requestsfrom bs4 import BeautifulSoup
response = requests.get('http://example.com')content = response.text
soup = BeautifulSoup(content, 'html.parser')

2. 使用BeautifulSoup解析HTML文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

创建了BeautifulSoup对象后,我们就可以使用它来解析HTML文档了。例如,我们可以使用.title属性来获取HTML文档的标题:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

print(soup.title)

3. 使用BeautifulSoup提取数据BeautifulSoup提供了很多方法来选择和提取HTML元素。比如,我们可以使用.find()方法来查找第一个符合条件的元素,或者使用.find_all()方法来查找所有符合条件的元素:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

# 找到第一个<p>标签p_tag = soup.find('p')
# 找到所有的<a>标签a_tags = soup.find_all('a')
# 找到id为"example"的div标签div_tag = soup.find('div', id='example')

以上只是BeautifulSoup最基础的用法,但这些基础用法已经能够满足大部分的数据抓取需求。在下一部分,我们将介绍一些更高级的用法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

BeautifulSoup进阶使用

在掌握了BeautifulSoup的基本用法之后,我们可以尝试一些更高级的功能。BeautifulSoup提供了一些强大的工具来帮助我们解析更复杂的HTML结构。1. 使用CSS选择器文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

CSS选择器是一种强大的选择HTML元素的方式。BeautifulSoup提供了.select()方法来使用CSS选择器。比如,我们可以选择所有的标签,或者选择所有class为"example"的<div>标签:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

# 找到所有的<a>标签a_tags = soup.select('a')
# 找到class为"example"的所有<div>标签div_tags = soup.select('div.example')

2. 导航解析树BeautifulSoup把HTML文档转换为了一个解析树,我们可以沿着这棵树向上或者向下,甚至向左或者向右进行导航。比如,我们可以使用.parent属性来获取一个元素的父元素,或者使用.contents属性来获取一个元素的所有子元素:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

# 获取第一个<a>标签的父元素parent = soup.find('a').parent
# 获取<body>标签的所有子元素children = soup.find('body').contents

3. 提取元素属性每个HTML元素都可能有一些属性,比如标签的"href"属性。我们可以使用BeautifulSoup提取这些属性:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

# 获取第一个<a>标签的"href"属性href = soup.find('a')['href']

上面介绍的只是BeautifulSoup更多的功能的一部分,它还有很多其他的强大功能。你可以查看官方文档来获取更多的信息。在下一部分,我们将使用BeautifulSoup进行一个实战演示。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

实战演示

接下来,我们将从豆瓣top250电影的html页面进行关键信息的提取,首先我们获取了它的html,为了显示效果,我取出了一部分放到这里:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

<ol class="grid_view">    <li>        <div class="item">            <div class="pic">                <em class="">1</em>                <a href="https://movie.douban.com/subject/1292052/">                    <img width="100" alt="肖申克的救赎" src="https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp" class="">                </a>            </div>            <div class="info">                <div class="hd">                    <a href="https://movie.douban.com/subject/1292052/" class="">                        <span class="title">肖申克的救赎</span>                        <span class="title">&nbsp;/&nbsp;The Shawshank Redemption</span>                        <span class="other">&nbsp;/&nbsp;月黑高飞(港)  /  刺激1995(台)</span>                    </a>

                    <span class="playable">[可播放]</span>                </div>                <div class="bd">                    <p class="">                        导演: 弗兰克·德拉邦特 Frank Darabont&nbsp;&nbsp;&nbsp;主演: 蒂姆·罗宾斯 Tim Robbins /...<br> 1994&nbsp;/&nbsp;美国&nbsp;/&nbsp;犯罪 剧情                    </p>

                    <div class="star">                        <span class="rating5-t"></span>                        <span class="rating_num" property="v:average">9.7</span>                        <span property="v:best" content="10.0"></span>                        <span>2871837人评价</span>                    </div>
                    <p class="quote">                        <span class="inq">希望让人自由。</span>                    </p>                </div>            </div>        </div>    </li>    <li>        <div class="item">            <div class="pic">                <em class="">2</em>                <a href="https://movie.douban.com/subject/1291546/">                    <img width="100" alt="霸王别姬" src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2561716440.webp" class="">                </a>            </div>            <div class="info">                <div class="hd">                    <a href="https://movie.douban.com/subject/1291546/" class="">                        <span class="title">霸王别姬</span>                        <span class="other">&nbsp;/&nbsp;再见,我的妾  /  Farewell My Concubine</span>                    </a>

                    <span class="playable">[可播放]</span>                </div>                <div class="bd">                    <p class="">                        导演: 陈凯歌 Kaige Chen&nbsp;&nbsp;&nbsp;主演: 张国荣 Leslie Cheung / 张丰毅 Fengyi Zha...<br> 1993&nbsp;/&nbsp;中国大陆 中国香港&nbsp;/&nbsp;剧情 爱情 同性                    </p>

                    <div class="star">                        <span class="rating5-t"></span>                        <span class="rating_num" property="v:average">9.6</span>                        <span property="v:best" content="10.0"></span>                        <span>2121931人评价</span>                    </div>
                    <p class="quote">                        <span class="inq">风华绝代。</span>                    </p>                </div>            </div>        </div>    </li></ol>

这段html代码被放到test.html这个html文件当中,之后再使用beautifulsoup4进行关键信息的提取,其代码如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

from bs4 import BeautifulSoup
with open('test.html', 'r', encoding='utf-8') as rf:    html_doc = rf.read()
soup = BeautifulSoup(html_doc, 'html.parser')
movies = []items = soup.find_all('li')
for item in items:    movie = {}    movie['rank'] = item.em.text    movie['url'] = item.a['href']    movie['image_url'] = item.img['src']    movie['title_cn'] = item.find('span', class_='title').text    movie['title_en'] = item.find('span', class_='title').find_next_sibling('span').text if item.find('span', class_='title').find_next_sibling('span') else ''    movie['other'] = item.find('span', class_='other').text    movie['playable'] = True if item.find('span', class_='playable') else False    movie['director_and_actors'] = item.find('p', class_='').text.strip()    movie['rating'] = item.find('span', class_='rating_num').text    movie['votes'] = item.find('span', property="v:best").find_next_sibling('span').text    movie['quote'] = item.find('span', class_='inq').text if item.find('span', class_='inq') else ''    movies.append(movie)
for movie in movies:    print(f"排名:{movie['rank']}")    print(f"链接:{movie['url']}")    print(f"图片链接:{movie['image_url']}")    print(f"中文标题:{movie['title_cn']}")    print(f"英文标题:{movie['title_en']}")    print(f"其他信息:{movie['other']}")    print(f"是否可播放:{'是' if movie['playable'] else '否'}")    print(f"导演和演员:{movie['director_and_actors']}")    print(f"评分:{movie['rating']}")    print(f"评论人数:{movie['votes']}")    print(f"经典语录:{movie['quote']}")    print("\n"+"-"*50+"\n")

结果如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

排名:1链接:https://movie.douban.com/subject/1292052/图片链接:https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp中文标题:肖申克的救赎英文标题: / The Shawshank Redemption其他信息: / 月黑高飞(港)  /  刺激1995(台)是否可播放:是导演和演员:导演: 弗兰克·德拉邦特 Frank Darabont   主演: 蒂姆·罗宾斯 Tim Robbins /... 1994 / 美国 / 犯罪 剧情评分:9.7投票人数:2871837人评价经典语录:希望让人自由。
--------------------------------------------------
排名:2链接:https://movie.douban.com/subject/1291546/图片链接:https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2561716440.webp中文标题:霸王别姬英文标题: / 再见,我的妾  /  Farewell My Concubine其他信息: / 再见,我的妾  /  Farewell My Concubine是否可播放:是导演和演员:导演: 陈凯歌 Kaige Chen   主演: 张国荣 Leslie Cheung / 张丰毅 Fengyi Zha... 1993 / 中国大陆 中国香港 / 剧情 爱情 同性评分:9.6投票人数:2121931人评价经典语录:风华绝代。

以上就是对top250的html信息的提取过程。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

总结

在这篇文章中,我尽力为你们揭示Python的BeautifulSoup库在网页爬虫中的巨大作用。我分享了如何安装、理解并高效利用这个强大的库来解析HTML和提取数据,从基础到进阶,直至实际的操作演示。我希望你们喜欢这篇文章,对于BeautifulSoup有了更深的理解和实际应用的能力。我非常期待听到你们在使用这个库的过程中有任何的发现或者创新的用法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/50163.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/yunda/50163.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定