Python BeautifulSoup网络数据抓取实战演示
现代数据驱动的世界里,网络数据抓取或称为"网页爬虫"已经成为一种非常重要的技能。无论是社交媒体分析,市场趋势预测,还是竞品研究,甚至机器学习的训练数据采集,都需要利用到这项技能。
Python因为其强大的库支持和易读性,被广泛用于编写爬虫程序。
在众多的Python库中,BeautifulSoup以其简单易用,强大的解析能力,成为了很多Python爬虫程序的首选。
BeautifulSoup能帮助我们轻松地解析网页,提取出我们需要的信息。
它可以把复杂的HTML代码转换成树状的数据结构,让我们能方便地定位和提取元素。
接下来的文章内容,我将会带你一步步走进BeautifulSoup的世界,学习如何使用它来获取网络中的数据。
什么是BeautifulSoup
BeautifulSoup是一个Python库,用于从HTML和XML文件中提取数据。它生成了一个解析树,使原始的复杂HTML文档变得易于搜索和操作。如果你需要对网页进行数据抓取,那么BeautifulSoup将是你的得力助手。它的主要功能包括:
解析HTML,XML文档。
提供简单直观的方式来选择和提取HTML元素。
支持多种解析器,可以根据实际需求选择。
BeautifulSoup的设计非常灵活,不仅可以用来提取网页中的信息,还可以用来修改和重排HTML文档。尤其值得一提的是,BeautifulSoup对于不完整或者不规范的HTML文档有很好的容错能力,可以解析大多数的网页。在接下来的内容中,我们会详细介绍如何使用BeautifulSoup进行数据抓取。
安装BeautifulSoup
在开始使用BeautifulSoup之前,我们首先需要在Python环境中安装它。幸运的是,这个过程非常简单。打开你的终端或命令提示符,输入以下命令:
pip install beautifulsoup4
这个命令将使用pip,Python的包管理器,来安装BeautifulSoup4,这是BeautifulSoup的最新版本。注意,BeautifulSoup4的名字中有一个"4",不要遗漏。安装完成后,你可以通过下面的命令来检查是否安装成功:
python -c "import bs4; print(bs4.__version__)"
如果看到了版本号,说明BeautifulSoup已经成功安装在你的Python环境中了。接下来,我们将开始探索BeautifulSoup的基本使用方法。
BeautifulSoup的基础使用
在这部分,我们将了解BeautifulSoup的一些基础用法,包括如何读取HTML文档,如何解析,以及如何提取数据。1. 读取HTML文档
BeautifulSoup可以读取本地的HTML文件,也可以读取网络上的HTML文件。例如,下面的代码会从本地读取一个名为"example.html"的文件:
from bs4 import BeautifulSoup
with open("example.html", "r") as f:
content = f.read()
soup = BeautifulSoup(content, 'html.parser')
如果你想读取网络上的一个HTML文件,可以使用requests库来发送一个HTTP请求,获取HTML文件:
import requests
from bs4 import BeautifulSoup
response = requests.get('http://example.com')
content = response.text
soup = BeautifulSoup(content, 'html.parser')
2. 使用BeautifulSoup解析HTML
创建了BeautifulSoup对象后,我们就可以使用它来解析HTML文档了。例如,我们可以使用.title属性来获取HTML文档的标题:
print(soup.title)
3. 使用BeautifulSoup提取数据BeautifulSoup提供了很多方法来选择和提取HTML元素。比如,我们可以使用.find()方法来查找第一个符合条件的元素,或者使用.find_all()方法来查找所有符合条件的元素:
# 找到第一个<p>标签
p_tag = soup.find('p')
# 找到所有的<a>标签
a_tags = soup.find_all('a')
# 找到id为"example"的div标签
div_tag = soup.find('div', id='example')
以上只是BeautifulSoup最基础的用法,但这些基础用法已经能够满足大部分的数据抓取需求。在下一部分,我们将介绍一些更高级的用法。
BeautifulSoup进阶使用
在掌握了BeautifulSoup的基本用法之后,我们可以尝试一些更高级的功能。BeautifulSoup提供了一些强大的工具来帮助我们解析更复杂的HTML结构。1. 使用CSS选择器
CSS选择器是一种强大的选择HTML元素的方式。BeautifulSoup提供了.select()方法来使用CSS选择器。比如,我们可以选择所有的标签,或者选择所有class为"example"的<div>标签:
# 找到所有的<a>标签
a_tags = soup.select('a')
# 找到class为"example"的所有<div>标签
div_tags = soup.select('div.example')
2. 导航解析树BeautifulSoup把HTML文档转换为了一个解析树,我们可以沿着这棵树向上或者向下,甚至向左或者向右进行导航。比如,我们可以使用.parent属性来获取一个元素的父元素,或者使用.contents属性来获取一个元素的所有子元素:
# 获取第一个<a>标签的父元素
parent = soup.find('a').parent
# 获取<body>标签的所有子元素
children = soup.find('body').contents
3. 提取元素属性每个HTML元素都可能有一些属性,比如标签的"href"属性。我们可以使用BeautifulSoup提取这些属性:
# 获取第一个<a>标签的"href"属性
href = soup.find('a')['href']
上面介绍的只是BeautifulSoup更多的功能的一部分,它还有很多其他的强大功能。你可以查看官方文档来获取更多的信息。在下一部分,我们将使用BeautifulSoup进行一个实战演示。
实战演示
接下来,我们将从豆瓣top250电影的html页面进行关键信息的提取,首先我们获取了它的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"> / The Shawshank Redemption</span>
<span class="other"> / 月黑高飞(港) / 刺激1995(台)</span>
</a>
<span class="playable">[可播放]</span>
</div>
<div class="bd">
<p class="">
导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins /...<br> 1994 / 美国 / 犯罪 剧情
</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"> / 再见,我的妾 / Farewell My Concubine</span>
</a>
<span class="playable">[可播放]</span>
</div>
<div class="bd">
<p class="">
导演: 陈凯歌 Kaige Chen 主演: 张国荣 Leslie Cheung / 张丰毅 Fengyi Zha...<br> 1993 / 中国大陆 中国香港 / 剧情 爱情 同性
</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进行关键信息的提取,其代码如下:
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")
结果如下:
排名: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信息的提取过程。
总结
在这篇文章中,我尽力为你们揭示Python的BeautifulSoup库在网页爬虫中的巨大作用。我分享了如何安装、理解并高效利用这个强大的库来解析HTML和提取数据,从基础到进阶,直至实际的操作演示。我希望你们喜欢这篇文章,对于BeautifulSoup有了更深的理解和实际应用的能力。我非常期待听到你们在使用这个库的过程中有任何的发现或者创新的用法。