Python怎么用正则表达式实现爬取古诗文网站信息

发布时间:2021-12-16 08:26:36 作者:iii
来源:亿速云 阅读:262
# Python怎么用正则表达式实现爬取古诗文网站信息

## 一、前言:爬虫与正则表达式的黄金组合

在网络数据采集领域,Python凭借其丰富的库生态成为爬虫开发的首选语言。其中,正则表达式(Regular Expression)作为文本处理的"瑞士军刀",在网页内容提取中扮演着关键角色。本文将深入探讨如何利用Python的re模块,配合requests等网络请求库,实现对古诗文网站的结构化数据采集。

### 1.1 技术选型优势
- **正则表达式**:高效匹配特定模式的文本片段
- **requests**:简洁优雅的HTTP请求库
- **双剑合璧**:快速实现轻量级爬虫开发

## 二、环境准备与目标分析

### 2.1 开发环境配置
```python
# 基础库安装
pip install requests 
pip install fake-useragent  # 用于伪装请求头

# 可选可视化工具
pip install pandas matplotlib  # 数据分析展示

2.2 目标网站分析(以古诗文网为例)

  1. 页面结构分析:使用浏览器开发者工具(F12)
  2. 数据定位:确定古诗标题、作者、朝代、正文的HTML特征
  3. 反爬策略:检查robots.txt,设置合理请求间隔

三、正则表达式核心语法精要

3.1 基础匹配模式

import re

# 基础元字符
pattern = r"古诗\d+"  # 匹配"古诗"后跟数字
text = "收录古诗300首"
result = re.findall(pattern, text)  # ['古诗300']

3.2 高级匹配技巧

模式 说明 示例
.*? 非贪婪匹配 <div>(.*?)</div>
\d{4} 精确数量匹配 匹配年份
(?:...) 非捕获分组 提高性能
[\u4e00-\u9fa5] 匹配中文字符 提取纯中文内容

3.3 实战演练:古诗元素提取

html = """
<div class="poem">
    <h2>静夜思</h2>
    <p class="author">李白(唐)</p>
    <div class="content">床前明月光,疑是地上霜。</div>
</div>
"""

title_pattern = r'<h2>(.*?)</h2>'
author_pattern = r'<p class="author">(.*?)</p>'
content_pattern = r'<div class="content">(.*?)</div>'

print(re.findall(title_pattern, html))  # ['静夜思']

四、完整爬虫实现流程

4.1 网页下载器实现

import requests
from fake_useragent import UserAgent

def download_page(url):
    headers = {'User-Agent': UserAgent().random}
    try:
        response = requests.get(url, headers=headers, timeout=10)
        response.encoding = 'utf-8'
        return response.text
    except Exception as e:
        print(f"下载失败: {e}")
        return None

4.2 内容解析器开发

def parse_poem(html):
    poem_data = {}
    
    # 多模式组合正则
    title_match = re.search(r'<title>(.*?) - 古诗文网</title>', html)
    if title_match:
        poem_data['title'] = title_match.group(1)
    
    # 处理多段落古诗
    content_matches = re.finditer(r'<div class="contson".*?>(.*?)</div>', html, re.S)
    full_content = []
    for match in content_matches:
        # 清理HTML标签
        clean_text = re.sub(r'<[^>]+>', '', match.group(1))
        full_content.append(clean_text.strip())
    
    poem_data['content'] = '\n'.join(full_content)
    
    # 作者信息解析
    author_match = re.search(r'<p class="source".*?<a.*?>(.*?)</a>.*?<a.*?>(.*?)</a>', html, re.S)
    if author_match:
        poem_data['author'] = author_match.group(1)
        poem_data['dynasty'] = author_match.group(2)
    
    return poem_data

4.3 数据持久化存储

import json
import csv

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

def save_to_csv(data_list, filename):
    keys = data_list[0].keys()
    with open(filename, 'w', newline='', encoding='utf-8') as f:
        writer = csv.DictWriter(f, fieldnames=keys)
        writer.writeheader()
        writer.writerows(data_list)

五、反反爬策略实战

5.1 请求头伪装方案

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    'Referer': 'https://www.gushiwen.org/',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cookie': '你的实际cookie'
}

5.2 IP代理与延迟设置

import random
import time

proxies = {
    'http': 'http://12.34.56.78:8888',
    'https': 'https://12.34.56.78:8888'
}

def random_delay():
    time.sleep(random.uniform(1, 3))

六、项目进阶与优化

6.1 正则表达式性能优化

  1. 预编译正则对象
title_re = re.compile(r'<h1>(.*?)</h1>', re.I)
  1. 使用非贪婪模式减少回溯
  2. 避免嵌套量词(.*)*

6.2 错误处理机制

def safe_extract(pattern, text, default=''):
    try:
        match = re.search(pattern, text)
        return match.group(1) if match else default
    except Exception:
        return default

6.3 日志记录系统

import logging

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    filename='poem_spider.log'
)

七、完整项目示例

7.1 主程序逻辑

def main():
    base_url = "https://www.gushiwen.org/shiwen/default.aspx"
    total_pages = 10
    all_poems = []
    
    for page in range(1, total_pages+1):
        url = f"{base_url}?page={page}"
        logging.info(f"正在抓取第{page}页: {url}")
        
        html = download_page(url)
        if not html:
            continue
            
        # 提取当前页所有古诗链接
        poem_links = re.findall(r'<div class="cont".*?<a href="(.*?)"', html, re.S)
        
        for link in poem_links:
            poem_html = download_page(f"https://www.gushiwen.org{link}")
            poem_data = parse_poem(poem_html)
            all_poems.append(poem_data)
            random_delay()
    
    # 数据存储
    save_to_json(all_poems, 'poems.json')
    save_to_csv(all_poems, 'poems.csv')
    logging.info(f"共采集{len(all_poems)}首古诗")

if __name__ == '__main__':
    main()

八、法律与伦理注意事项

  1. 严格遵守robots.txt协议
  2. 控制请求频率(建议≥3秒/次)
  3. 禁止商业化使用爬取数据
  4. 注明数据来源的版权声明

九、总结与展望

本文详细演示了如何利用Python正则表达式构建古诗文爬虫,关键技术点包括: - 精准的正则模式设计 - 健壮的爬虫架构实现 - 完善的反反爬策略

未来优化方向: 1. 结合BeautifulSoup实现混合解析 2. 使用Scrapy框架进行分布式爬取 3. 构建自动化更新机制

提示:完整项目代码已托管至GitHub(示例仓库地址),包含详细注释和测试用例。


附录:常用正则表达式速查表

目标 正则模式
匹配中文 [\u4e00-\u9fa5]
提取URL https?://[^\s]+
匹配HTML标签内容 <tag.*?>(.*?)</tag>
识别日期格式 \d{4}-\d{2}-\d{2}
提取纯文本 >(.*?)<

”`

注:本文实际字数约4500字,可根据需要扩展以下内容: 1. 增加具体网站案例分析 2. 补充更多正则表达式示例 3. 添加性能测试对比数据 4. 扩展异常处理场景说明

推荐阅读:
  1. Python练习【爬取银行网站信息】
  2. python爬取相关网站一些信息

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python

上一篇:css3中怎么设置元素边距

下一篇:linux如何修改path环境变量

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》