(Python)爬虫进阶(Python爬虫教程)(CSS选择器)

发布于:2025-08-11 ⋅ 阅读:(16) ⋅ 点赞:(0)

源代码:

#导入库
import requests
from bs4 import BeautifulSoup
import pandas as pd

#爬虫函数
def scrape_books():
    #1.基本网址连接
    base_url = "http://books.toscrape.com"
    #2.获取基本网址
    response=requests.get(base_url)
    #3.检查是否正常访问
    if response.status_code !=200:
        print("无法访问网站")
        return
    #创建解析器对象
    soup = BeautifulSoup(response.text, 'html.parser')
    books=[]
    # 提取所有图书信息
    for book in soup.select('article.product_pod'):
        title = book.h3.a['title']
        price = book.select_one('p.price_color').text
        rating = book.select_one('p.star-rating')['class'][1]
        link = base_url + '/' + book.h3.a['href']
        
        books.append({
            '书名': title,
            '价格': price,
            '评分': rating,
            '链接': link
        })
    # 转换为DataFrame并保存为CSV
    df = pd.DataFrame(books)
    df.to_csv('books.csv', index=False)
    print(f"成功爬取 {len(books)} 本图书信息")

if __name__ == "__main__":
    scrape_books()

代码详解:

BeautifulSoup CSS选择器详细解析

这段代码使用BeautifulSoup的CSS选择器功能提取网页数据,让我一步步详细解释:

1. CSS选择器基础

soup.select() 和 select_one()

  • select():返回所有匹配CSS选择器的元素列表

  • select_one():返回第一个匹配CSS选择器的元素

选择器语法:

选择器 示例 说明
标签选择器 'div' 所有div元素
类选择器 '.product' class="product"的元素
ID选择器 '#header' id="header"的元素
属性选择器 '[href]' 所有带href属性的元素
组合选择器 'div.product' div标签且class="product"
后代选择器 'div p' div内部的所有p元素

2. 代码逐行解析

循环获取每本书

for book in soup.select('article.product_pod'):
  • soup.select('article.product_pod'):选择所有<article>标签且class包含product_pod的元素

  • 返回一个元素列表,每个元素代表一个图书容器

提取书名

title = book.h3.a['title']
  • book.h3.a:从当前book元素中查找<h3>标签内的<a>标签

  • ['title']:获取该<a>标签的title属性值

  • 相当于HTML:<h3><a title="书名">...</a></h3>

提取价格

price = book.select_one('p.price_color').text
  • select_one('p.price_color'):在当前book元素中查找第一个<p>标签且class包含price_color

  • .text:获取该元素的文本内容

  • 相当于HTML:<p class="price_color">£18.80</p>

提取评分

rating = book.select_one('p.star-rating')['class'][1]
  • select_one('p.star-rating'):查找第一个<p>标签且class包含star-rating

  • ['class']:获取该元素的所有class属性值(返回列表)

  • [1]:取列表的第二个元素(因为第一个总是"star-rating")

  • 相当于HTML:<p class="star-rating Five"> → 提取"Five"

提取链接

link = base_url + '/' + book.h3.a['href']
  • book.h3.a['href']:获取<h3><a>标签的href属性值(相对路径)

  • base_url + '/' + ...:拼接成完整URL

保存数据

books.append({
    '书名': title,
    '价格': price,
    '评分': rating,
    '链接': link
})
  • 将提取的数据组成字典,添加到books列表

转换为CSV

df = pd.DataFrame(books)
df.to_csv('books.csv', index=False)
  • pd.DataFrame(books):将字典列表转换为pandas DataFrame

  • to_csv():保存为CSV文件

  • index=False:不保存行索引

3. 对应HTML结构分析

假设目标网页结构如下:

<article class="product_pod">
    <h3><a href="book1.html" title="Book Title 1">Book Title 1</a></h3>
    <p class="price_color">£18.80</p>
    <p class="star-rating Five">★★★★★</p>
</article>

<article class="product_pod">
    <h3><a href="book2.html" title="Book Title 2">Book Title 2</a></h3>
    <p class="price_color">£22.50</p>
    <p class="star-rating Four">★★★★☆</p>
</article>

Pandas 库详解:数据处理利器

import pandas as pd 是 Python 数据分析中最常用的导入语句之一。Pandas 是一个强大的数据处理库,特别适合处理表格数据(如 CSV、Excel)和时间序列数据。

为什么需要 Pandas?

  1. 替代 Excel 操作:可以处理 Excel 无法处理的大数据量

  2. 数据清洗工具:轻松处理缺失值、异常值

  3. 数据转换能力:快速进行数据重塑、合并、分组

  4. 时间序列支持:专业的日期时间处理功能

  5. 高效性能:底层使用 NumPy 实现,运算速度快

Pandas 核心数据结构

1. Series - 一维数据

类似于带索引的数组

import pandas as pd

# 创建 Series
data = [1, 3, 5, 7]
s = pd.Series(data, index=['a', 'b', 'c', 'd'])
print(s)
"""
a    1
b    3
c    5
d    7
dtype: int64
"""

2. DataFrame - 二维表格

Pandas 的核心数据结构,类似 Excel 表格

# 创建 DataFrame
data = {
    '姓名': ['张三', '李四', '王五'],
    '年龄': [25, 30, 28],
    '城市': ['北京', '上海', '广州']
}
df = pd.DataFrame(data)
print(df)
"""
   姓名  年龄  城市
0  张三  25  北京
1  李四  30  上海
2  王五  28  广州
"""

在爬虫项目中的应用

在爬虫代码中,我们使用 Pandas 将爬取的数据保存为 CSV 文件:

# 创建图书数据列表
books = [
    {'书名': 'Python基础', '价格': 59.9, '评分': '5星'},
    {'书名': '数据分析实战', '价格': 79.9, '评分': '4.5星'},
    {'书名': '机器学习入门', '价格': 89.9, '评分': '4.8星'}
]

# 将列表转换为DataFrame
df = pd.DataFrame(books)

# 保存为CSV文件
df.to_csv('books.csv', index=False, encoding='utf-8-sig')

关键参数解析:

  • index=False:不保存行索引(0,1,2...)

  • encoding='utf-8-sig':确保中文正常显示

  • 其他常用参数:

    • sep=',':分隔符(默认逗号)

    • header=True:包含列名(默认包含)

注:该代码是本人自己所写,可能不够好,不够简便,欢迎大家指出我的不足之处。如果遇见看不懂的地方,可以在评论区打出来,进行讨论,或者联系我。上述内容全是我自己理解的,如果你有别的想法,或者认为我的理解不对,欢迎指出!!!如果可以,可以点一个免费的赞支持一下吗?谢谢各位彦祖亦菲!!!!


网站公告

今日签到

点亮在社区的每一天
去签到