使用Python进行Web数据抓取与分析:从零开始的实战教程
在当今数据驱动的时代,获取和分析网络上的公开数据变得越来越重要。无论是用于市场调研、舆情监控还是学术研究,Web数据抓取(Web Scraping) 都是一项非常实用的技术。本文将通过一个完整的实战案例,介绍如何使用 Python 进行网页数据抓取、解析并进行简单的数据分析。
我们将以 https://books.toscrape.com/ 为目标网站,这是一个专门用于练习网页爬虫的示例网站。我们的目标是:
抓取网站上所有书籍的标题、价格、评分和库存信息;将抓取的数据保存为 CSV 文件;对数据进行简单分析,如找出最贵的书、各评分等级的数量等;可视化展示部分分析结果。环境准备
首先确保你已经安装了以下 Python 库:
pip install requests beautifulsoup4 pandas matplotlib seaborn
requests
:用于发送 HTTP 请求;BeautifulSoup
:用于解析 HTML 内容;pandas
:用于数据处理与分析;matplotlib/seaborn
:用于数据可视化。网页结构分析
访问 https://books.toscrape.com/,我们可以看到这是一个模拟书店的页面。每页显示 20 本书籍,点击“next”可以翻页浏览。
右键点击任意一本书,选择“检查”,可以看到每本书的信息被包裹在 <article class="product_pod">
标签中。
我们关注的字段包括:
标题:<h3><a ... title="书籍标题">
价格:<p class="price_color">£17.23</p>
评分:<p class="star-rating Three">
中的 Three
表示三颗星;库存状态:<p class="instock availability">In stock</p>
编写爬虫代码
3.1 导入所需库
import requestsfrom bs4 import BeautifulSoupimport pandas as pdimport timeimport os
3.2 定义爬取函数
def scrape_books(base_url): books = [] page_num = 1 while True: url = f"{base_url}/catalogue/page-{page_num}.html" response = requests.get(url) if response.status_code != 200: print(f"无法访问第 {page_num} 页") break soup = BeautifulSoup(response.text, 'html.parser') items = soup.select('.product_pod') if not items: print("没有更多书籍了") break for item in items: title = item.h3.a['title'] price = item.select_one('.price_color').text.strip() rating_class = item.p['class'][1] # 获取第二个类名,如'Three' rating = rating_to_number(rating_class) stock = item.select_one('.availability').text.strip() books.append({ "Title": title, "Price": float(price[1:]), # 去掉 £ 符号转为浮点数 "Rating": rating, "Stock": stock }) print(f"已抓取第 {page_num} 页") page_num += 1 time.sleep(1) # 避免请求过快 return pd.DataFrame(books)def rating_to_number(rating_str): ratings = { 'One': 1, 'Two': 2, 'Three': 3, 'Four': 4, 'Five': 5 } return ratings.get(rating_str, 0)
3.3 执行爬虫并保存数据
if __name__ == "__main__": base_url = "https://books.toscrape.com" df = scrape_books(base_url) # 保存为CSV文件 df.to_csv("books_data.csv", index=False) print("数据已保存到 books_data.csv")
数据分析与可视化
接下来,我们对抓取到的数据进行一些基本分析。
4.1 加载数据
df = pd.read_csv("books_data.csv")print(df.head())
输出示例:
Title | Price | Rating | Stock |
---|---|---|---|
A Light in the Attic | 51.77 | 3 | In stock |
Fifty Shades of Grey | 52.12 | 1 | In stock |
4.2 分析最高价书籍
most_expensive = df.loc[df['Price'].idxmax()]print("最贵的书是:")print(most_expensive[['Title', 'Price']])
4.3 按评分统计书籍数量
rating_counts = df['Rating'].value_counts().sort_index()print("各评分等级书籍数量:")print(rating_counts)
4.4 绘制评分分布图
import seaborn as snsimport matplotlib.pyplot as pltplt.figure(figsize=(8, 5))sns.barplot(x=rating_counts.index, y=rating_counts.values, palette="viridis")plt.title("书籍评分分布")plt.xlabel("评分等级")plt.ylabel("书籍数量")plt.xticks(rotation=0)plt.show()
4.5 绘制价格分布直方图
plt.figure(figsize=(8, 5))sns.histplot(df['Price'], bins=20, kde=True, color='skyblue')plt.title("书籍价格分布")plt.xlabel("价格 (£)")plt.ylabel("频数")plt.show()
完整项目流程总结
分析网页结构:使用浏览器开发者工具查看 HTML 结构;构建爬虫逻辑:使用 requests + BeautifulSoup 实现多页抓取;数据清洗与存储:将抓取到的数据整理成 DataFrame 并保存为 CSV;数据分析与可视化:利用 pandas 和 seaborn 进行基础分析与图表展示;遵守网站规则:添加延时避免频繁请求影响服务器。注意事项与合法性说明
爬虫应遵守目标网站的 robots.txt 协议;不应对服务器造成过大压力,建议合理设置请求间隔;本项目仅供学习交流使用,请勿用于非法用途;如果目标网站禁止爬虫行为,请尊重其规定。扩展方向
添加异常处理机制,增强程序健壮性;使用 Scrapy 构建更复杂的爬虫项目;将数据存入数据库(如 SQLite 或 MySQL);增加定时任务自动更新数据;部署爬虫服务,实现自动化运行。通过本文的学习,你已经掌握了从网页抓取数据、清洗、分析到可视化的完整流程。Python 在 Web 数据抓取方面具有强大的生态支持,非常适合初学者入门以及进阶开发。希望你能将这些技术应用到实际项目中,挖掘出更有价值的信息。
如果你有兴趣进一步了解网络爬虫或数据分析,欢迎继续阅读我后续的文章!
免责声明:本文来自网站作者,不代表CIUIC的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:ciuic@ciuic.com