Python制作简单的网页爬虫
本文演示如何使用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爬虫技术的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













