Python制作简单的网页爬虫

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

本文演示如何使用Python的requests库与正则表达式编写一个简单的网页爬虫,用于批量抓取特定省份主要城市的历史天气信息。通过解析HTML结构、构造请求URL并遍历输出结果,仅需数十行核心代码即可完成基础数据采集。同时提供运行环境配置、编码处理优化及性能瓶颈说明,适合Web开发入门者参考学习。

目标与环境准备

本示例旨在通过程序自动访问指定天气网站,获取某省所有主要城市的天气历史数据(如白天到夜间的气温、风力等)。为顺利运行脚本,请确保已安装Python 3.x环境及requests第三方库。推荐使用VS Code或Sublime Text等现代编辑器,并在终端执行脚本前确认目录权限与网络连通性。

第1步:获取城市列表

首先定位包含城市名称的汇总页面。该页面的链接结构固定,我们可通过发送GET请求获取HTML源码,并利用正则表达式匹配城市超链接。原示例代码基于Python 2编写,此处已适配为Python 3标准语法,修正了print语句与编码声明:

import re
import requests

def get_city_list():
    url = "http://www.tianqihoubao.com/weather/province.aspx?id=420000" # 以湖北省为例
    resp = requests.get(url)
    resp.encoding = 'utf-8'
    # 匹配  中的相对路径
    cities = re.findall(r'href="(.*?)">', resp.text, re.S)
    return cities

执行该函数后,将返回类似以下的城市列表数据:

['top/anlu.html', 'top/badong.html', 'top/wuhan.html', ...]

第2步:解析对应城市的天气数据

获取城市相对路径后,拼接完整URL再次发起请求。目标天气页的数据集中在一个表格内,我们通过正则捕获整个表格区块,再逐行提取单元格文本:

def parse_weather(city_path):
    full_url = f"http://www.tianqihoubao.com/weather/{city_path}"
    resp = requests.get(full_url)
    resp.encoding = 'utf-8'
    
    # 匹配 weather 类表格的内容
    table_match = re.search(r'class="b"[^>]*>(.*?)', resp.text, re.S)
    if not table_match:
        return
        
    table_content = table_match.group(1)
    # 提取所有  标签
    rows = re.findall(r'(.*?)', table_content, re.S)
    
    print(f"\n{city_path.split('/')[-1].replace('.html', '')} 天气详情:")
    # 跳过前两行表头,从实际数据行开始解析
    for row in rows[2:]:
        cells = re.findall(r'>(.*?)<', row, re.S)
        # 过滤空值并打印有效字段
        valid_cells = [c.strip() for c in cells if c.strip()]
        if valid_cells:
            print(valid_cells)

完整可运行脚本与注意事项

将上述逻辑整合为完整脚本如下。原草稿中使用了Python 2的编码 hack(如reload(sys)),在Python 3中已不再需要且会引发兼容问题,此处直接采用标准utf-8响应编码设置:

import re
import requests

def scrape_weather_data():
    base_url = "http://www.tianqihoubao.com"
    prov_url = f"{base_url}/weather/province.aspx?id=420000"
    
    # 1. 获取城市列表
    html = requests.get(prov_url)
    html.encoding = 'utf-8'
    city_links = re.findall(r'href="(.*?)">', html.text, re.S)
    
    print(f"共找到 {len(city_links)} 个城市节点\n")
    
    # 2. 逐个解析天气
    for link in city_links:
        city_name = link.split('/')[-1].replace('.html', '')
        print(f"正在抓取: {city_name}")
        
        city_url = f"{base_url}/weather/{link}"
        resp = requests.get(city_url)
        resp.encoding = 'utf-8'
        
        table_data = re.search(r'class="b"[^>]*>(.*?)', resp.text, re.S)
        if table_data:
            rows = re.findall(r'(.*?)', table_data.group(1), re.S)
            for row in rows[2:]:
                cols = re.findall(r'>(.*?)<', row, re.S)
                cleaned_cols = [c.strip() for c in cols if c.strip()]
                if len(cleaned_cols) > 1:
                    print(f"  {cleaned_cols}")
            print("-" * 40)

if __name__ == '__main__':
    scrape_weather_data()

运行时间与性能说明

由于该Python爬虫采用同步串行请求模式,需依次下载多个独立网页并解析HTML,因此在普通硬件环境下总耗时通常在5至7分钟之间(约350秒以上)。若对时效性要求较高,建议后续引入concurrent.futures.ThreadPoolExecutor进行多线程并发请求,或将数据存储至数据库以便离线分析。此外,目标网站的DOM结构可能随运营策略调整而变化,抓取失败时需优先检查控制台输出的正则匹配是否失效。

简要总结

通过使用requests发起HTTP请求结合re模块进行非结构化文本抽取,我们能够快速搭建基础数据采集管道。掌握HTML标签规律、合理设置字符集以及理解同步阻塞特性,是初学者入门网页爬虫的核心要点。以上就是Python制作简单网页爬虫的详细内容,更多关于网页数据抓取与Python爬虫技术的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表