👏🏻 你好!欢迎访问IT教程网,0门教程,教程全部原创,计算机教程大全,全免费!

🔥 新增教程

《黑神话 悟空》游戏开发教程,共40节,完全免费,点击学习

《AI副业教程》,完全原创教程,点击学习

13 存储数据之存储为CSV

在上篇中,我们讨论了如何使用 XPathCSS选择器 解析网页内容,并提取了我们需要的数据。在本篇中,我们将重点介绍如何将提取到的数据存储为 CSV 格式,这是数据存储和交换中一种非常常见且实用的格式。在下一篇中,我们会探讨如何将数据存储到数据库中。在继续之前,让我们先了解一下 CSV 格式的基本特征。

什么是CSV格式?

CSV,全称为“Comma-Separated Values”,即“逗号分隔值”,它是一种以纯文本形式存储数据的方式。每行代表一条记录,字段之间用逗号分隔。这种格式的优点是简单易读,广泛支持,方便与各种应用进行数据交互。

CSV 格式示例

假设我们提取到了一些书籍的信息,包括标题、作者和出版年份,存储为CSV格式可以是这样的:

1
2
3
4
标题,作者,出版年份
《算法导论》,Thomas H. Cormen, 2009
《数据结构与算法分析》,Mark Allen Weiss, 2013
《人工智能:一种现代的方法》,Stuart Russell, 2020

将数据存储为CSV

接下来,我们来看一个示例,展示如何将我们从网页上提取的数据存储到 CSV 文件中。在本示例中,我们将使用 Pythoncsv 模块。

示例代码

以下是一个使用 csv 模块将书籍信息存储为CSV文件的示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import csv

# 假设我们从网页上提取到的数据
books = [
{"title": "算法导论", "author": "Thomas H. Cormen", "year": 2009},
{"title": "数据结构与算法分析", "author": "Mark Allen Weiss", "year": 2013},
{"title": "人工智能:一种现代的方法", "author": "Stuart Russell", "year": 2020},
]

# 指定CSV文件名
csv_file = "books.csv"

# 写入CSV文件
with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
writer = csv.DictWriter(file, fieldnames=["title", "author", "year"])

# 写入表头
writer.writeheader()

# 写入数据行
for book in books:
writer.writerow(book)

print(f"数据已成功存储到 {csv_file}")

代码讲解

  1. 导入模块:首先,我们导入了 csv 模块,用于处理CSV文件的读写。
  2. 数据准备:我们假设已经提取到了一些书籍的信息,存储在 books 列表中,每一本书的信息用字典表示。
  3. 创建CSV文件:使用 with open 打开(或创建)名为 books.csv 的文件,使用 mode='w' 表示写入模式,newline='' 避免在Windows系统中出现多余的新行,encoding='utf-8' 以确认文件使用UTF-8编码。
  4. 写入文件
    • 创建 DictWriter 对象,并指定字段名(即表头)。
    • 使用 writeheader() 方法写入表头。
    • 遍历 books 列表,通过 writerow() 方法写入每一本书的数据。
  5. 确认输出:最后,我们打印一条信息以确认数据已成功写入。

运行结果

执行上述代码后,在当前目录下会生成一个名为 books.csv 的文件,内容如下:

1
2
3
4
title,author,year
算法导论,Thomas H. Cormen,2009
数据结构与算法分析,Mark Allen Weiss,2013
人工智能:一种现代的方法,Stuart Russell,2020

小结

在本篇教程中,我们学习了如何将提取到的数据存储为 CSV 格式。这是一种非常实用的数据存储方式,尤其是在数据量不大时,CSV 文件简单明了,易于使用。在下一篇中,我们将探讨如何将数据存储到数据库中,这将更好地应对大规模数据和复杂查询的需求。

希望本篇教程能够帮助你掌握数据存储为 CSV 的基本方法,接下来我们将继续深入学习存储数据的更多方法!

分享转发

14 存储数据之存储为数据库

在爬取数据后,接下来的步骤就是将数据保存到合适的存储形式,其中一种常见的方式就是将数据存储到数据库。相较于将数据存储为CSV文件,数据库具有更强的查询能力和数据管理特点,尤其在处理大规模数据时,它的优势表现得尤为明显。

数据库的选择

在本文中,我们将使用 SQLite 作为示例数据库,因为它轻量级、易于使用上手,不需要复杂的安装过程,非常适合爬虫小白进行学习和实践。如果你爬取的数据量较大或需要支持并发操作,可以考虑 MySQL 或者 PostgreSQL 等数据库。

安装与准备

要使用 SQLite,你只需要 Python 的内置库 sqlite3。你可以用以下命令来检查 Python 是否已经包含此模块:

1
python -c "import sqlite3"

如果没有错误信息,那么你就可以开始使用它了。

创建数据库和表

首先,我们需要创建一个数据库文件,并在其中建立一个存储数据的表。以下是一个简单的示例,展示了如何创建数据库和表。

示例:创建数据库与表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import sqlite3

# 连接到 SQLite 数据库(如果数据库不存在,则会创建一个)
conn = sqlite3.connect('data.db')

# 创建一个游标对象
cursor = conn.cursor()

# 创建一个表,假设我们爬取的是书籍信息
cursor.execute('''
CREATE TABLE IF NOT EXISTS books (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
author TEXT NOT NULL,
publish_year INTEGER
)
''')

# 提交事务
conn.commit()

# 关闭连接
conn.close()

插入数据

创建好表结构后,我们可以将爬取的数据插入到数据库中。可以通过 INSERT 语句将数据添加到表中。

示例:插入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import sqlite3

# 假设我们爬取的书籍数据
books_data = [
('《Python编程:从入门到实践》', 'Eric Matthes', 2019),
('《流畅的Python》', 'Luciano Ramalho', 2015),
('《深入理解计算机系统》', 'Randal E. Bryant', 2015)
]

# 连接到数据库
conn = sqlite3.connect('data.db')
cursor = conn.cursor()

# 插入数据
cursor.executemany('''
INSERT INTO books (title, author, publish_year)
VALUES (?, ?, ?)
''', books_data)

# 提交事务
conn.commit()

# 关闭连接
conn.close()

在这个示例中,我们使用 executemany 方法批量插入数据。利用 ? 占位符来避免 SQL 注入,是个好的实践。

查询数据

数据存储进数据库后,你可能需要查询它。你可以使用 SELECT 语句来获取所需信息。

示例:查询数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import sqlite3

# 连接到数据库
conn = sqlite3.connect('data.db')
cursor = conn.cursor()

# 查询所有书籍
cursor.execute('SELECT * FROM books')
rows = cursor.fetchall()

# 输出结果
for row in rows:
print(row)

# 关闭连接
conn.close()

该代码将查询出表中所有的书籍记录,并逐行打印出来。

总结

到此为止,我们已经学习了如何将数据存储到数据库中,包括创建数据库、创建表、插入数据以及查询数据。数据库的使用使得数据存储更加灵活和高效,能够更方便地进行数据操作与管理。

在下一篇教程中,我们将讨论如何将数据存储为文件格式,继续拓展我们在数据存储方面的知识。希望大家在数据库的应用上能有更深入的实践与理解。

分享转发

15 存储数据之文件存储

在本系列教程中,我们将探讨如何将从网页爬取的数据存储为文件。这是一个基础但非常重要的主题,因为选择合适的存储方式可以帮助我们更高效地管理和利用爬取的数据。在上一篇文章中,我们讨论了如何将数据存储到数据库中,而在本篇中,我们将重点关注如何将数据保存在文件中,以及在这些存储过程中要注意的事项。

1. 文件存储的基本概念

文件存储是一种简单而直观的数据存储方式,适用于较小的数据集或不需要复杂查询的场景。常见的文件存储格式包括文本文件CSVJSONXML等。选择合适的文件格式可以提高数据的可读性和可用性。

1.1 文本文件

文本文件是最基础的存储格式,非常容易实现。我们可以将爬取的数据以行的形式存储到一个.txt文件中。以下是一个简单的示例:

1
2
3
4
5
6
# 将数据存储为文本文件
data = ["信息1", "信息2", "信息3"]

with open('data.txt', 'w', encoding='utf-8') as f:
for line in data:
f.write(line + '\n')

1.2 CSV 文件

CSV(Comma-Separated Values)是常用的表格数据存储格式,非常适合存储结构化数据。使用 CSV 文件,我们可以将每一行看作一条记录,每个字段之间用逗号分隔。

1
2
3
4
5
6
7
8
9
10
11
12
import csv

data = [
["标题1", "描述1", "链接1"],
["标题2", "描述2", "链接2"],
["标题3", "描述3", "链接3"]
]

with open('data.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(["标题", "描述", "链接"]) # 写入表头
writer.writerows(data) # 写入数据

1.3 JSON 文件

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于存储结构化数据,格式易于人和机器理解。在爬虫中,使用 JSON 文件存储数据是非常常见的做法。

1
2
3
4
5
6
7
8
9
10
import json

data = [
{"标题": "标题1", "描述": "描述1", "链接": "链接1"},
{"标题": "标题2", "描述": "描述2", "链接": "链接2"},
{"标题": "标题3", "描述": "描述3", "链接": "链接3"}
]

with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)

2. 文件存储的优缺点

优点

  • 简单易用:文件存储不需要复杂的库或服务,便于实现和调试。
  • 便携性:文件可以轻松迁移和共享,适合小型项目。

缺点

  • 查询能力有限:文件存储不支持复杂查询和过滤,处理大量数据时效率低下。
  • 文件管理:随着数据量的增加,管理和维护文件将变得复杂。

3. 文件存储的注意事项

在选择文件存储方法时,有几个关键点需要考虑:

  • 编码格式:确保使用合适的编码格式(如utf-8),以避免字符乱码问题。
  • 文件命名:使用有意义的文件名和目录结构,方便之后数据的查找和访问。
  • 数据更新:考虑数据更新时如何处理,例如是否需要覆盖、追加或版本控制等。
  • 数据安全:如果存储敏感信息,需要确保文件的安全性和隐私保护。

4. 结论

在本篇中,我们介绍了文件存储的相关内容,包括常用的文件格式及其优缺点。无论是新手还是经验丰富的开发者,文件存储都是一种值得掌握的数据管理技能。下一篇我们将进行更深入的讨论,关注爬虫在数据存储时可能面临的反爬虫机制及其应对策略,帮助大家在爬虫过程中更好地应对挑战。


通过代码示例和案例分析,我们希望能够让读者更清楚地理解文件存储在爬虫中的应用。希望这篇文章对你的学习之路有所裨益,期待在下一篇中再次见面!

分享转发

16 反爬虫机制与应对之常见的反爬虫技术

在上篇中,我们讨论了如何有效地将爬取到的数据存储到文件中,以便于后续的数据分析和处理。在今天的内容中,我们将探讨一些常见的反爬虫机制以及对应的技术,这些机制旨在保护网站的资源和数据安全。了解这些机制,以及我们如何对抗它们,是学习网络爬虫的重要一步。

常见的反爬虫机制

1. IP 封禁

许多网站通过监控请求的来源 IP 地址来识别并限制爬虫。例如,如果在短时间内某个 IP 发起的请求数量超过了网站设定的阈值,该 IP 可能会被临时或永久封禁。这种机制有效防止了过度爬取。

案例: 假设你用一个 IP 频繁请求某个新闻网站的文章,若该网站设置了限制请求频率为每分钟10次,你在一分钟内发送了15次请求,你的 IP 可能会被封禁。

2. 用户代理(User-Agent)检测

网站会检查请求头中的 User-Agent 字段,以判断请求是否来自爬虫。大多数爬虫使用默认的用户代理,如果没有设置,网站容易识别并进行封禁。

解决方案: 在请求中设置自定义的User-Agent来伪装成浏览器。

1
2
3
4
5
6
import requests

headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
}
response = requests.get("http://example.com", headers=headers)

3. 反爬虫验证码

一些网站使用验证码(如Google的reCAPTCHA)来区分人和机器。只有通过验证码的用户才能继续访问该网站的内容。

解决方案: 通常,解决验证码需要人力干预,或者使用一些自动识别验证码的服务,但有时这会涉及法律和道德问题。

4. 动态内容加载

现代网站使用AJAX等技术动态加载内容。这意味着在初始的页面请求中可能并不包含所有数据,爬虫很难获取完整的内容。

解决方案: 使用浏览器自动化工具(如Selenium)模拟用户行为来加载完整页面并提取数据。

1
2
3
4
5
6
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://example.com")
content = driver.page_source
driver.quit()

一些网站要求用户在请求中发送有效的Cookie,以此确保访问者是经过验证的用户。爬虫在此情况下可能会因为缺乏有效的Cookie而无法访问内容。

解决方案: 手动抓取Cookie,并在后续请求中使用它们。

1
2
3
4
cookies = {
'sessionid': 'your_session_id'
}
response = requests.get("http://example.com", cookies=cookies)

小结

在学习和使用爬虫技术时,了解和应对反爬虫机制是一个不可忽视的环节。我们介绍了多种常见的反爬虫技术,包括IP 封禁用户代理检测验证码动态内容加载Cookie 验证等。这些技术和机制将帮助你更好地理解如何设计爬虫程序,避免被封禁,以及如何合法和道德地使用网络爬虫。

在下一篇教程中,我们将讨论一些具体的避免被封禁的方法,帮助你更安全、更高效地进行数据爬取。

分享转发

17 反爬虫机制与应对之避免被封禁的方法

在上一篇中,我们探讨了常见的反爬虫技术,包括 IP 封禁、JavaScript 验证、验证码等。了解这些反爬虫技术之后,我们接下来要讨论的是如何避免在抓取网站数据时被封禁,以及一些具体的方法和策略。

1. 合理的抓取频率

一种常见的被封禁原因是抓取请求过于频繁。网站为了保护其服务器的稳定性,通常会对同一 IP 地址的请求次数设置限制。为了避免被封禁,我们需要合理安排抓取的频率。

示例

你可以使用 time.sleep() 函数来设定每次请求之间的间隔,例如:

1
2
3
4
5
6
7
8
9
import time
import requests

url = 'http://example.com'

for i in range(10):
response = requests.get(url)
print(response.status_code)
time.sleep(5) # 每次请求之间间隔5秒

在这个示例中,我们每次请求之间都暂停了 5 秒,这样可以降低被网站检测到的风险。

2. 指定合理的请求头部

使用合适的请求头部可以帮助你模拟真实的用户行为,降低被封的风险。特别是 User-AgentReferer 这两个字段,常常被用作识别请求来源的标准。

示例

你可以通过设置请求头来伪装成一个普通浏览器请求:

1
2
3
4
5
6
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
'Referer': 'http://example.com'
}

response = requests.get(url, headers=headers)

在这个例子中,我们将 User-Agent 设置为 Chrome 浏览器,这样可以增加成功抓取的可能性。

3. 随机化请求策略

为了模拟更为真实的用户行为,我们可以随机化请求的顺序、时间间隔和请求头。这种方法可以使得抓取行为看起来更加自然,减少被监测和封禁的几率。

示例

你可以使用随机数生成器来随机化时间间隔:

1
2
3
4
5
6
7
import random

for i in range(10):
response = requests.get(url, headers=headers)
print(response.status_code)
sleep_time = random.uniform(1, 10) # 随机间隔时间1到10秒
time.sleep(sleep_time)

4. 避免连续大量请求

在抓取数据时,尽量避免对同一资源进行连续大量请求。这会引起网站管理员的注意,进而可能导致 IP 封禁。

策略

  • 每次抓取后,适时休息,避免在短时间内重复请求同一页面。
  • 考虑轮换目标网站,不要长期集中于一个网站。

示例

你可以事先定义一个列表,随机选择不同的网页进行抓取:

1
2
3
4
5
6
7
8
9
10
urls = [
'http://example.com/page1',
'http://example.com/page2',
'http://example.com/page3',
]

for url in random.sample(urls, len(urls)):
response = requests.get(url, headers=headers)
print(response.status_code)
time.sleep(random.uniform(1, 10))

5. 处理错误响应

在进行数据抓取时,确保能够处理可能出现的错误响应,比如 403 Forbidden 或 429 Too Many Requests。这些状态码通常意味着你需要减少请求频率或更改策略。

示例

你可以在代码中加入错误处理逻辑:

1
2
3
4
5
6
7
8
response = requests.get(url, headers=headers)

if response.status_code == 429: # 获取429状态码
print("请求过于频繁,休息一段时间")
time.sleep(60) # 等待60秒
elif response.status_code == 403:
print("访问被拒绝,换个User-Agent试试")
headers['User-Agent'] = '新User-Agent字符串'

总结

通过合理安排请求频率、设置请求头、随机化策略、避免频繁请求同一资源以及处理错误响应,我们可以有效降低被封禁的风险。在下一篇中,我们将讨论如何利用代理和 User-Agent 来进一步增强我们的抓取策略。希望这些方法能帮助你在爬虫的世界中走得更远!

分享转发

18 反爬虫机制与应对之使用代理与User-Agent

在上篇教程中,我们讨论了如何避免被封禁的方法,这对于初学者来说是理解网络爬虫的第一步。在本篇中,我们将深入探讨反爬虫机制的另一项关键技术:使用代理和修改 User-Agent。这对于绕过网络限制、减少被封禁的风险至关重要。

反爬虫机制概述

网站通常采用多种反爬虫机制来保护其内容不被自动抓取。这些机制可能包括:

  1. IP封禁:频繁请求同一网站的IP地址可能会被暂时或永久封禁。
  2. 限制访问频率:网站可能会对短时间内的访问请求设置上限。
  3. 验证码:在检测到爬虫时,网站可能会启用验证码,要求用户进行验证。
  4. User-Agent检查:一些网站会检查请求的 User-Agent 字段,如果它看起来像是来自爬虫,可能会拒绝服务。

为了有效应对这些反爬虫机制,使用代理和调整 User-Agent 是两种常用的方法。

使用代理

代理的定义

代理服务器是一个中介,位于客户端和目标服务器之间。使用代理可以帮助我们隐藏真实的IP地址,减少被封禁的风险。

代理的类型

  1. 共享代理:多个用户共享同一个代理IP,通常价格低廉,但容易被封。
  2. 私有代理:一个用户独占的代理IP,价格相对较高,但提供更好的隐私保护。
  3. 旋转代理:这种代理会自动切换IP,极大地降低被封禁的风险。

使用代理的案例

这里是一个使用 Python requests 库搭配代理的简单示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
import requests

# 代理地址:假设这是一个有效的代理IP
proxies = {
"http": "http://username:password@proxy_ip:port",
"https": "http://username:password@proxy_ip:port",
}

try:
response = requests.get("http://example.com", proxies=proxies)
print(response.text)
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")

在这个示例中,我们使用了一个HTTP代理来发送请求。如果代理配置正确,服务器只会看到代理的IP,而不是你的真实IP。

修改 User-Agent

User-Agent的定义

User-Agent 是浏览器向服务器标识自身类型的信息,包含浏览器名称、版本、操作系统等。许多网站根据 User-Agent 检测请求是否来自爬虫。

修改 User-Agent 的方法

修改 User-Agent 可以使请求看起来像是来自普通用户的浏览器。下面是一个简单的例子,示范如何在 requests 中设置 User-Agent

1
2
3
4
5
6
7
8
9
10
11
12
import requests

# 自定义 User-Agent
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
}

try:
response = requests.get("http://example.com", headers=headers)
print(response.text)
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")

在这个示例中,我们将 User-Agent 设置为常见的浏览器标识,通过这种方式,服务器会更可能接受我们的请求。

结合代理与 User-Agent

在实际应用中,将代理与 User-Agent 结合使用,可以有效提高爬虫的成功率。例如,可以动态选择不同的代理地址,并随机生成 User-Agent,从而进一步隐藏爬虫行为。

进阶案例

考虑以下代码,可以在请求中同时使用代理和不同的 User-Agent

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import requests
import random

# 代理列表
proxies_list = [
"http://username:password@proxy1_ip:port",
"http://username:password@proxy2_ip:port",
"http://username:password@proxy3_ip:port",
]

# User-Agent 列表
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
]

# 随机选择代理与 User-Agent
proxy = {"http": random.choice(proxies_list), "https": random.choice(proxies_list)}
headers = {"User-Agent": random.choice(user_agents)}

try:
response = requests.get("http://example.com", headers=headers, proxies=proxy)
print(response.text)
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")

总结

在本文中,我们探讨了使用代理和修改 User-Agent 的方法,来应对网站的反爬虫机制。这些方法需要灵活运用,结合实际情况来优化爬虫行为。此外,在下一篇教程中,我们将进行简单的爬虫实例实践,以巩固这些知识点的实际应用。希望本篇内容能够帮助你更好地理解爬虫的防护措施以及相应的应对策略。

分享转发

19 简单爬虫实例

在上一篇中,我们讨论了反爬虫机制及如何使用代理与 User-Agent 来绕过这些机制。在本篇教程中,我们将通过实际案例来实现一个简单的爬虫,提取网页中的数据。最后一部分将为数据清洗与处理做铺垫。

爬虫的基本概念

爬虫,或称为网络爬虫,是一种自动访问互联网并提取网页信息的程序。我们通常用 Python 的 requestsBeautifulSoup 库来构建简单的爬虫。

环境准备

在开始之前,确保安装了以下 Python 库。如果还未安装,可以通过 pip 命令进行安装:

1
pip install requests beautifulsoup4

实例:抓取豆瓣电影榜单

下面,我们将创建一个简单的爬虫,从豆瓣电影的榜单页面抓取电影的名称和评分。

步骤1:发送请求

首先,我们需要向我们想要抓取的网页发送请求,并获取网页的 HTML 内容。在这一步中,我们将使用 requests 库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import requests

url = 'https://movie.douban.com/chart'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}

response = requests.get(url, headers=headers)

if response.status_code == 200:
html_content = response.text
print("请求成功!")
else:
print("请求失败,状态码:", response.status_code)

在上面的代码中,我们向 豆瓣电影榜单 发送了一个 GET 请求,并使用了合适的 User-Agent 以模拟浏览器访问。

步骤2:解析 HTML 内容

接下来,我们需要提取我们关心的数据。在这里,我们将使用 BeautifulSoup 来解析网页内容,提取电影的名称与评分。

1
2
3
4
5
6
7
8
9
from bs4 import BeautifulSoup

soup = BeautifulSoup(html_content, 'html.parser')

movies = soup.select('td.title a')
ratings = soup.select('span.rating_nums')

for movie, rating in zip(movies, ratings):
print(f"电影名称:{movie.get_text()}, 评分:{rating.get_text()}")

在这段代码中,我们分别使用 soup.select 方法抓取电影名称和评分的元素,然后打印出来。

步骤3:整理输出

你可以把抓取到的数据存储到列表或其他数据结构中。以下是整理输出的代码示例:

1
2
3
4
5
6
7
8
9
10
movie_data = []

for movie, rating in zip(movies, ratings):
movie_info = {
'name': movie.get_text(),
'rating': rating.get_text()
}
movie_data.append(movie_info)

print(movie_data)

这样,所有电影的信息将被收集到一个列表中,便于后面的数据处理和清洗。

小结

在本篇教程中,我们完成了一个简单爬虫的实现,成功抓取了豆瓣电影榜单中的电影名称和评分。在实际爬虫开发中,可能会遇到更多的反爬虫机制。此外,爬取的数据常常需要进一步处理,这将在下一篇教程中详细介绍。

接下来,我们将讨论如何对爬取到的数据进行清洗与处理,以便于数据分析和使用。

分享转发

20 数据清洗与处理

在上一篇中,我们简单介绍了如何使用爬虫抓取网页数据。现在,随着我们获得了数据,接下来的重要步骤是进行数据清洗与处理。这一步骤对于保证我们分析和结果的有效性至关重要。在本节中,我们将通过一个具体的案例来讨论如何进行数据清洗与处理。

案例背景

假设我们已经使用爬虫抓取了某一电商网站上产品的信息,数据可能包含产品名称、价格、销量、评价等字段。然而,由于网页结构的复杂性和数据的多样性,我们抓取的数据往往并不完美,可能存在缺失值、重复值、格式不统一等问题。因此,数据清洗的过程是必不可少的。

我们将使用 pandas 库来进行数据清洗与处理。以下是我们抓取到的部分数据示例:

1
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd

# 创建一个示例数据集
data = {
'产品名称': ['苹果', '香蕉', '苹果', '', '橙子'],
'价格': ['3.5元', '2.0元', '3.5元', '1.0元', '4元'],
'销量': ['50', '80', '', '20', '30'],
'评价数': ['100', '200', None, '50', '0']
}

df = pd.DataFrame(data)
print(df)

初步检查数据

在进行清洗之前,首要步骤是检查数据的整体状况:

1
2
print(df.info())
print(df.describe())

数据清洗步骤

1. 去除重复项

首先,我们需要去除重复的数据行。使用 drop_duplicates 方法可以轻松实现。

1
df = df.drop_duplicates()

2. 处理缺失值

接着,我们需要处理缺失值。在本例中,如果数据框中含有空字符串或 None,我们可以选择删除这些行,或者用合适的填充值替换。

1
2
3
4
5
6
# 删除含缺失值的行
df = df.dropna()

# 或者用适当的值填充,例如,用平均值或中位数
df['销量'] = df['销量'].replace('', '0').astype(int)
df['评价数'] = df['评价数'].fillna('0').astype(int)

3. 格式统一

接下来,我们需要对各个字段的数据格式进行统一。例如,价格字段包含单位“元”,我们可以将其转化为浮点数,以便后续的数值计算。

1
df['价格'] = df['价格'].str.replace('元', '').astype(float)

4. 数据类型转换

确保每个字段的数据类型是合适的,避免在分析时发生错误。

1
2
df['销量'] = df['销量'].astype(int)
df['评价数'] = df['评价数'].astype(int)

5. 保存清洗后的数据

经过清洗后的数据可以保存为新的 CSV 文件,以便后续分析或展示。

1
df.to_csv('清洗后数据.csv', index=False)

小结

在本节中,我们展示了对爬取数据进行清洗与处理的基本步骤,包括去除重复项、处理缺失值、格式统一、数据类型转换等。这些步骤确保我们的数据在后续的分析和结果展示中具有良好的质量。

在下一篇中,我们将讨论如何将这些清洗后的数据进行展示,以便更好地理解和分析我们的爬虫结果。希望读者对于数据清洗与处理有更深入的理解,并能在实际项目中加以运用!

分享转发

21 结果展示

在前一篇中,我们已经完成了数据的清洗与处理部分。接下来,我们将聚焦于如何将处理后的数据进行结果展示,特别在爬虫工作流中,这一步骤至关重要,因为它直接影响到数据的可读性和后续决策的依据。

1. 数据概览

在开始结果展示之前,我们首先快速回顾一下我们处理后的数据结构。假设我们的数据集是从某在线商店的产品页面中爬取的,关键字段包括:

  • 产品名称
  • 价格
  • 评分
  • 评论数量

在数据清洗阶段,我们已经将数据整理成了如下格式:

产品名称 价格 评分 评论数量
产品A 299.9 4.5 120
产品B 199.9 4.0 75
产品C 399.0 4.8 200

2. 使用Python进行结果展示

我们将使用matplotlibpandas库来可视化这些数据。首先,确保已经安装了这两个库:

1
pip install matplotlib pandas

2.1 绘制柱状图显示产品价格

接下来,我们用柱状图展示各个产品的价格。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import pandas as pd
import matplotlib.pyplot as plt

# 假设我们的数据已经在处理阶段存储到了一个DataFrame中
data = {
'产品名称': ['产品A', '产品B', '产品C'],
'价格': [299.9, 199.9, 399.0],
'评分': [4.5, 4.0, 4.8],
'评论数量': [120, 75, 200]
}

df = pd.DataFrame(data)

# 绘制柱状图
plt.figure(figsize=(8, 6))
plt.bar(df['产品名称'], df['价格'], color='skyblue')
plt.title('产品价格展示')
plt.xlabel('产品名称')
plt.ylabel('价格 (元)')
plt.xticks(rotation=45)
plt.grid(axis='y')

# 展示图形
plt.tight_layout()
plt.show()

运行上述代码将生成如下柱状图,直观地展示出各个产品的价格。

2.2 绘制散点图展示评分与评论数量关系

接下来,我们可以使用散点图来展示产品的评分与评论数量之间的关系。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 绘制散点图
plt.figure(figsize=(8, 6))
plt.scatter(df['评论数量'], df['评分'], color='orange')
plt.title('评分与评论数量关系')
plt.xlabel('评论数量')
plt.ylabel('评分')
plt.grid(True)

# 添加标注
for i in range(len(df)):
plt.annotate(df['产品名称'][i], (df['评论数量'][i], df['评分'][i]),
textcoords="offset points", xytext=(0,10), ha='center')

# 展示图形
plt.tight_layout()
plt.show()

上述代码生成的散点图将清晰地显示出每个产品的评论数量与评分之间的关系。

3. 总结与展望

在本篇中,我们展示了如何生成基本的数据可视化,帮助我们更好地理解爬取的数据。通过视觉化的形式,我们可以迅速捕捉到数据中的模式和趋势,便于进行分析和决策。

接下来的一篇教程中,我们将进一步探讨如何将处理后的数据和结果展示结合应用于实际商业决策中。希望这些基础的可视化方法能够为你的项目提供帮助!

分享转发