Python使用Socket发起HTTP请求并结合正则提取网页数据

认真发呆
认真发呆
发布时间:2026-10-12| 2人浏览过
原创

本文演示如何使用Python的socket模块手动构建HTTP GET请求获取网页源码,并通过正则表达式清洗HTML中的换行符与空格,精准定位并提取目标文本。

实现原理与准备工作

通过底层TCP协议直连目标站点,能够绕过部分高层网络限制或模拟轻量级访问。该方案分为三个核心阶段:建立套接字通道、组装修理HTTP报文、循环拉取响应数据。完成后需对原始HTML进行空白符过滤,再利用正则引擎匹配指定节点内容。准备环境只需标准Python解释器(内置socket与re模块),无需安装任何第三方库。

核心代码实现步骤

第1步:配置Socket对象并组装GET请求

目的:建立底层TCP通道并构造符合HTTP协议的请求报文。
入口:引入 socket 库。
动作:创建流式套接字(AF_INET/SOCK_STREAM)、通过域名解析获取远程IP、拼接查询参数与Host头部。将构造好的请求字符串编码为UTF-8字节流。
重要参数:服务地址 www.gdcrj.com,默认端口 80,URL模板包含占位符 {0}。
可观察的完成状态:控制台安全打印 【INFO】:socket连接成功,表明TCP三次握手已就绪。

import socket

def gethtmlbyidentityid(identityid):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = 'www.gdcrj.com'
    suburl = '/wsyw/tcustomer/tcustomer.do?&method=find&applyid={0}'
    port = 80

    remote_ip = socket.gethostbyname(host)
    s.connect((remote_ip, port))
    print('【INFO】:socket连接成功')

    message = f'GET {suburl.format(identityid)} HTTP/1.1\r\nHost: {host}\r\nConnection: close\r\n\r\n'
    m_bytes = message.encode('utf-8')
    return s, m_bytes

第2步:发送请求并持续读取响应体

目的:获取服务器返回的完整HTML源码。
动作:调用 sendall 将请求字节流推入管道。进入无限循环调用 s.recv(4096) 分批读取数据,累加至缓冲字符串中。当返回值为空字节串时,说明连接已断开或服务端结束传输,此时关闭套接字并跳出循环。
重要参数:分片读取大小 4096 字节,解码容错策略 errors='ignore'。
可观察的完成状态:控制台打印 【INFO】:远程下载网页完成,函数返回完整的HTML源码字符串。

def download_html(s, m_bytes):
    s.sendall(m_bytes)
    print('【INFO】:远程下载中...')
    recv_str = ''
    while True:
        recev = s.recv(4096)
        if not recev:
            s.close()
            print('【INFO】:远程下载网页完成')
            break
        recv_str += recev.decode(encoding='utf-8', errors='ignore')
    return recv_str

第3步:清洗HTML文本并执行正则匹配

目的:过滤无关排版字符并精准捕获业务结果节点。
入口:导入 re 模块。
动作:首先编译正则规则剔除连续换行符与多余空格,防止标签断裂导致匹配失败。随后定义匹配类名为 news_font 的TD元素内部内容的规则,使用 findall 批量抓取所有符合条件的片段,逐一去除首尾空格后输出。
重要参数:正则模式 r'(?s)(.*?)'(启用点号匹配换行模式)。
可观察的完成状态:控制台逐行打印清洗后的查询办理进度文本。

import re

def getresultfromhtml(htmlstr):
    # 去除换行符和连续空格,保证标签连续性
    html_clean = re.sub(r'\s+', ' ', htmlstr)
    
    # 精准匹配目标节点的内部文本
    result_reg = re.compile(r'(?s)(.*?)')
    result = result_reg.findall(html_clean)
    
    for res in result:
        print(res.strip())

关键注意事项

原生Socket直接发起HTTP请求缺乏对HTTPS/TLS加密、Cookie维持、分块传输编码(Chunked)及压缩响应的自动处理能力。上述代码仅适用于明确的HTTP明文内网接口或教学验证场景。在实际工程落地中,提取网页数据强烈建议使用 requests 发送请求,搭配 BeautifulSoup 或 lxml 进行DOM树解析,以提升稳定性并规避因前端动态渲染或标签嵌套微调导致的正则失效问题。

以上就是Python结合Socket与正则表达式提取网页数据的详细内容,更多关于Python网络请求与字符串处理的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。