前言

这里简单分享一个获取网页上文字的python小脚本


实现思路

1
2
3
4
5
6
graph TD
A[启动程序] --> B[发送HTTP请求获取网页]
B --> C[解析HTML提取文本]
C --> D[清洗处理文本数据]
D --> E[存储到SQLite数据库]
E --> F[输出执行结果]

分块实现

1. 导入依赖库

1
2
3
4
import requests  # 发送HTTP请求获取网页内容
from bs4 import BeautifulSoup # 解析HTML文档
import sqlite3 # 轻量级数据库操作
import re # 正则表达式用于文本清洗

2. 网页请求模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def fetch_webpage(url):
"""
获取网页HTML内容
:param url: 目标网页URL
:return: 网页HTML文本
"""
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
} # 模拟浏览器请求头,避免被网站屏蔽

try:
response = requests.get(url, headers=headers, timeout=10) # 设置10秒超时
response.raise_for_status() # 检查HTTP状态码,非200抛出异常
response.encoding = response.apparent_encoding # 自动识别网页编码
return response.text # 返回网页HTML内容
except requests.exceptions.RequestException as e:
print(f"网页请求失败: {e}")
return None # 请求失败返回空值

3. 内容解析模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def extract_text_content(html):
"""
从HTML中提取并清洗文本内容
:param html: 网页HTML文本
:return: 清洗后的纯文本字符串
"""
if not html:
return "" # 空HTML返回空文本

soup = BeautifulSoup(html, 'html.parser') # 创建BeautifulSoup解析对象

# 移除不需要的标签(脚本、样式等)
for element in soup(['script', 'style', 'header', 'footer', 'nav']):
element.decompose() # 彻底移除这些标签及其内容

# 获取所有段落文本
paragraphs = soup.find_all(['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'])
raw_text = ' '.join([p.get_text().strip() for p in paragraphs]) # 拼接所有文本

# 文本清洗处理
cleaned_text = re.sub(r'\s+', ' ', raw_text) # 合并多余空格
cleaned_text = re.sub(r'[^\w\s.,;:!?\'"-]', '', cleaned_text) # 移除非文字字符

return cleaned_text[:5000] # 返回前5000个字符(避免过长)

4. 数据库存储模块

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
def setup_database():
"""
创建SQLite数据库和表结构
:return: 数据库连接对象
"""
conn = sqlite3.connect('web_content.db') # 创建或连接数据库文件
cursor = conn.cursor() # 获取数据库游标

# 创建数据表(如果不存在)
cursor.execute('''
CREATE TABLE IF NOT EXISTS scraped_data (
id INTEGER PRIMARY KEY AUTOINCREMENT,
url TEXT NOT NULL UNIQUE, -- 网页URL(唯一)
content TEXT, -- 网页文本内容
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
)
''') # 包含ID、URL、内容和时间戳的表结构

conn.commit() # 提交表结构变更
return conn # 返回数据库连接

def save_to_database(conn, url, content):
"""
将数据存储到数据库
:param conn: 数据库连接对象
:param url: 网页URL
:param content: 文本内容
"""
cursor = conn.cursor()
try:
# 插入或替换已有URL的数据
cursor.execute('''
INSERT OR REPLACE INTO scraped_data (url, content)
VALUES (?, ?)
''', (url, content)) # 使用参数化查询防止SQL注入
conn.commit() # 提交事务
print(f"数据存储成功: {url}")
except sqlite3.Error as e:
print(f"数据库操作失败: {e}")

5. 主流程控制

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
26
27
28
29
30
31
32
33
34
35
36
37
38
def main():
"""主执行函数"""
target_url = "https://example.com/article" # 替换为目标网站URL

print("="*50)
print("网页爬虫程序启动")
print("="*50)

# 1. 初始化数据库
db_connection = setup_database()
print("数据库初始化完成")

# 2. 获取网页内容
print(f"正在抓取: {target_url}")
html_content = fetch_webpage(target_url)

if html_content:
# 3. 解析文本内容
print("解析网页内容...")
text_content = extract_text_content(html_content)

if text_content:
# 4. 存储到数据库
print(f"获取到{len(text_content)}字符的文本")
save_to_database(db_connection, target_url, text_content)
else:
print("未提取到有效文本内容")
else:
print("网页获取失败,请检查URL或网络连接")

# 5. 关闭数据库连接
db_connection.close()
print("数据库连接已关闭")
print("="*50)
print("程序执行完毕")

if __name__ == "__main__":
main() # 程序入口

使用说明

执行流程

  1. 安装依赖库:
    1
    pip install requests beautifulsoup4
  2. 将脚本中的target_url替换为实际目标网址
  3. 运行脚本:
    1
    python web_scraper.py
  4. 查看生成的web_content.db数据库文件

示例输出

1
2
3
4
5
6
7
8
9
10
11
==================================================
网页爬虫程序启动
==================================================
数据库初始化完成
正在抓取: https://example.com/article
解析网页内容...
获取到2487字符的文本
数据存储成功: https://example.com/article
数据库连接已关闭
==================================================
程序执行完毕

数据库查询

使用SQLite客户端执行:

1
2
SELECT url, LENGTH(content) AS char_count, timestamp 
FROM scraped_data;

总结

技术要点总结

模块 关键技术 注意事项
网页请求 Requests库 需设置User-Agent和超时
内容解析 BeautifulSoup 注意标签清理和编码处理
文本清洗 正则表达式 保留关键标点符号
数据存储 SQLite3 使用参数化查询防注入

扩展建议

  1. 增加异常处理:添加重试机制应对网络波动
  2. 遵守robots.txt:检查目标网站的爬虫协议
  3. 添加延时:在循环爬取时使用time.sleep()避免被封
  4. 数据去重:使用MD5校验内容哈希值
  5. 扩展功能
    • 添加命令行参数支持
    • 实现多页爬取
    • 导出CSV/Excel格式

法律声明:实际使用前请确保遵守目标网站的robots.txt协议和相关法律法规,本示例仅用于技术学习目的。大规模商业爬取需获得网站授权。