使用Python进行Web数据抓取与分析:从零开始的实战教程

12分钟前 5阅读

在当今数据驱动的时代,获取和分析网络上的公开数据变得越来越重要。无论是用于市场调研、舆情监控还是学术研究,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())

输出示例:

TitlePriceRatingStock
A Light in the Attic51.773In stock
Fifty Shades of Grey52.121In 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

目录[+]

您是本站第7071名访客 今日有16篇新文章

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!