前言
这里简单分享一个获取网页上文字的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 from bs4 import BeautifulSoup 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) response.raise_for_status() response.encoding = response.apparent_encoding return response.text 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 "" soup = BeautifulSoup(html, 'html.parser') 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]
|
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 ) ''') conn.commit() return conn
def save_to_database(conn, url, content): """ 将数据存储到数据库 :param conn: 数据库连接对象 :param url: 网页URL :param content: 文本内容 """ cursor = conn.cursor() try: cursor.execute(''' INSERT OR REPLACE INTO scraped_data (url, content) VALUES (?, ?) ''', (url, content)) 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" print("="*50) print("网页爬虫程序启动") print("="*50) db_connection = setup_database() print("数据库初始化完成") print(f"正在抓取: {target_url}") html_content = fetch_webpage(target_url) if html_content: print("解析网页内容...") text_content = extract_text_content(html_content) if text_content: print(f"获取到{len(text_content)}字符的文本") save_to_database(db_connection, target_url, text_content) else: print("未提取到有效文本内容") else: print("网页获取失败,请检查URL或网络连接") db_connection.close() print("数据库连接已关闭") print("="*50) print("程序执行完毕")
if __name__ == "__main__": main()
|
使用说明
执行流程
- 安装依赖库:
1
| pip install requests beautifulsoup4
|
- 将脚本中的
target_url替换为实际目标网址
- 运行脚本:
- 查看生成的
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 |
使用参数化查询防注入 |
扩展建议
- 增加异常处理:添加重试机制应对网络波动
- 遵守robots.txt:检查目标网站的爬虫协议
- 添加延时:在循环爬取时使用
time.sleep()避免被封
- 数据去重:使用MD5校验内容哈希值
- 扩展功能:
- 添加命令行参数支持
- 实现多页爬取
- 导出CSV/Excel格式
法律声明:实际使用前请确保遵守目标网站的robots.txt协议和相关法律法规,本示例仅用于技术学习目的。大规模商业爬取需获得网站授权。
版权声明: 此文章版权归曦曦所有,如有转载,请注明来自原作者