跳到主要内容Python Web 开发实战:爬虫、框架与服务接口详解 | 极客日志PythonAI大前端算法
Python Web 开发实战:爬虫、框架与服务接口详解
本文深入讲解 Python 在 Web 开发中的关键技术应用。内容涵盖数据抓取策略,对比了正则表达式、HTML 解析器与 Beautiful Soup 的优劣;阐述 CGI 原理并过渡到现代 Web 框架如 Flask 与 FastAPI;解析 Web 服务通信机制,重点介绍 RESTful API 实践;最后探讨 Scrapy 分布式爬虫、Selenium 自动化测试等进阶工具。通过实战代码示例,提供从静态数据提取到动态服务构建的完整技术路径。
屏幕抓取:Web 数据的'搬运工'
想象一下,你的程序需要从互联网海洋里把散落在网页上的数据捞出来整理好。这就是屏幕抓取(Web Scraping),也叫网络爬虫,核心任务是程序化地下载网页内容并提取信息。
1. 正则表达式:快准狠的'文本手术刀'
在 Python 的世界里,**正则表达式(Regex)**就像一把锋利的'手术刀',能让你在杂乱无章的文本中精准匹配和提取想要的部分。它通过定义特殊字符和语法规则来描述字符串的搜索模式,实现对文本的查找、替换和提取。
比如你想从一堆电话号码里找出所有以'138'开头的,或者从一篇文章里找出所有链接,正则表达式就能帮你一秒搞定。不过,面对复杂的 HTML 结构,比如嵌套很深的标签,或者 HTML 本身不规范时,它可能会让你抓狂。
import re
import urllib.request
def simple_regex_scraper(url):
try:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
req = urllib.request.Request(url, headers=headers)
with urllib.request.urlopen(req) as response:
html_content = response.read().decode('utf-8')
pattern = re.compile(r'<a href="(/jobs/\d+)/?">(.*?)</a>')
job_listings = pattern.findall(html_content)
print(f"从 {url} 抓取到的职位信息:")
for job_url_suffix, job_name in job_listings:
full_job_url = f"https://www.python.org{job_url_suffix}"
print(f"- {job_name} ({full_job_url})")
except Exception as e:
print(f"抓取失败:{e}")
2. HTML 解析:优雅地'拆解'网页
当网页内容不再是简单的文本,而是结构复杂的 HTML 时,我们就需要一个'结构工程师'。HTML 解析就是把一堆 HTML 代码变成一个有层级、有关系的'积木模型',这样我们就能轻松找到想要的元素了。
HTMLParser 是 Python 标准库自带的,用起来比较底层,需要自己处理各种标签事件。如果你觉得这有点像'手搓'螺丝,那么接下来要介绍的 Beautiful Soup 一定会让你爱不释手。
from urllib.request import urlopen
from html.parser import HTMLParser
class JobScraper(HTMLParser):
def __init__(self):
super().__init__()
self.in_job_link = False
self.current_job_name = []
self.job_listings = []
def handle_starttag(self, tag, attrs):
if tag == 'a':
attrs_dict = dict(attrs)
href = attrs_dict.get('href')
if href and '/jobs/' in href and href.split('/')[-1].isdigit():
self.in_job_link = True
self.current_job_url = f"https://www.python.org{href}"
self.current_job_name = []
def handle_data(self, data):
if self.in_job_link:
self.current_job_name.append(data.strip())
def handle_endtag(self, tag):
if tag == 'a' and self.in_job_link:
job_name = ''.join(self.current_job_name).strip()
if job_name:
self.job_listings.append(f"{job_name} ({self.current_job_url})")
self.in_job_link = False
def html_parser_scraper(url):
try:
headers = {'User-Agent': 'Mozilla/5.0'}
req = urllib.request.Request(url, headers=headers)
with urllib.request.urlopen(req) as response:
html_content = response.read().decode('utf-8')
parser = JobScraper()
parser.feed(html_content)
parser.close()
print(f"使用 HTMLParser 从 {url} 抓取到的职位信息:")
for job in parser.job_listings:
print(f"- {job}")
except Exception as e:
print(f"抓取失败:{e}")
3. Beautiful Soup:应对'脏乱差'网页的'神器'
互联网上的网页可不是都那么'规矩'的,很多时候它们就像一堆被熊孩子玩过的乐高积木。Beautiful Soup 是一个专门用来'收拾烂摊子'的工具,即使面对格式再糟糕的 HTML,它也能帮你优雅地解析出来。它构建了一个解析树,使得开发者可以通过标签名、属性、CSS 选择器等多种方式轻松定位元素。
from urllib.request import urlopen
from bs4 import BeautifulSoup
def beautiful_soup_scraper(url):
try:
headers = {'User-Agent': 'Mozilla/5.0'}
req = urllib.request.Request(url, headers=headers)
with urllib.request.urlopen(req) as response:
html_content = response.read()
soup = BeautifulSoup(html_content, 'html.parser')
job_listings = set()
for listing in soup.find_all('div', class_='listing-row'):
link_tag = listing.find('h2').find('a')
if link_tag:
job_name = link_tag.get_text(strip=True)
job_url_suffix = link_tag.get('href')
full_job_url = f"https://www.python.org{job_url_suffix}"
job_listings.add(f"{job_name} ({full_job_url})")
print(f"使用 Beautiful Soup 从 {url} 抓取到的职位信息:")
for job in sorted(list(job_listings), key=str.lower):
print(f"- {job}")
except Exception as e:
print(f"抓取失败:{e}")
CGI:让你的网页'动'起来
如果说屏幕抓取是把别人的网页'搬'回家,那 CGI(Common Gateway Interface) 就是让你自己家的网页'活'起来的魔法!静态网页就像一张张精美的海报,虽然好看,但不会对你的任何行为做出反应。而有了 CGI,你的网页就变成了一个能和你互动的'智能机器人'。
1. CGI 基础:Web 服务器的'传话筒'
CGI 是一种标准,定义了 Web 服务器如何与外部脚本进行通信。当 Web 服务器收到一个指向 CGI 脚本的请求时,它会执行该脚本,并将请求的详细信息传递给脚本。脚本处理完请求后,将生成的 HTML 或其他内容作为标准输出返回给 Web 服务器。
注意:要运行 CGI 脚本,你需要一个配置好的 Web 服务器(如 Apache 或 Nginx),并将脚本放在指定的 cgi-bin 目录下。对于现代 Web 开发来说,直接手写 CGI 已经比较少见了,因为它效率不高,而且每次请求都要创建一个新进程,开销很大。
import cgi
import cgitb
cgitb.enable()
form = cgi.FieldStorage()
user_name = form.getvalue('name', '路人甲')
print("Content-type:text/html\n\n")
print("<html>")
print("<head><title>CGI 脚本初体验</title></head>")
print("<body>")
print(f"<h2>你好,{user_name}! 欢迎来到 CGI 的魔法世界!</h2>")
print("</body>")
print("</html>")
2. Python Web 框架:告别'刀耕火种'
如果说手写 CGI 是'刀耕火种',那 Web 框架就是现代化的'联合收割机'!它们把 Web 开发的各种脏活累活(比如路由、模板渲染、数据库连接等)都帮你封装好了,让你能专注于业务逻辑的实现。
无论是轻巧灵活的 Flask、FastAPI,还是功能全面的'巨无霸'Django,它们都能让你以前所未有的速度构建出功能强大的 Web 应用。
from flask import Flask, request, render_template_string
app = Flask(__name__)
HTML_TEMPLATE = """
<!DOCTYPE html>
<html>
<head><title>Flask Web App</title></head>
<body>
<h1>你好,{{ name }}!</h1>
<p>欢迎来到 Flask 的奇妙世界!</p>
<form method="post">
<label for="name">输入你的名字:</label>
<input type="text" name="name">
<button type="submit">提交</button>
</form>
</body>
</html>
"""
@app.route('/', methods=['GET', 'POST'])
def hello():
user_name = '路人甲'
if request.method == 'POST':
user_name = request.form.get('name', '路人甲')
return render_template_string(HTML_TEMPLATE, name=user_name)
if __name__ == '__main__':
app.run(debug=True)
Web 服务:程序间的'秘密通道'
想象一下,你的程序是个'社交达人',它不仅能自己处理数据,还想和别的程序'聊天',交换信息。Web 服务就登场了!它就像程序之间约定好的'秘密通道'和'通用语言',让不同系统、不同语言开发的程序也能无障碍地沟通协作。
1. XML-RPC 与 SOAP:远程调用的'双雄'
在 Web 服务的早期,XML-RPC 和 SOAP 是两个非常流行的'老牌选手'。它们都致力于解决一个核心问题:如何让一个程序调用另一个远程程序的功能。
- XML-RPC 简单直接,像用'明信片'交流。
- SOAP 更为复杂和强大,像一份严谨的'外交公文',支持更丰富的数据类型和安全性特性。
import xmlrpc.client
def xmlrpc_client_example():
try:
proxy = xmlrpc.client.ServerProxy("http://localhost:8000/RPC2")
result = proxy.add(5, 3)
print(f"XML-RPC 调用结果:5 + 3 = {result}")
except ConnectionRefusedError:
print("错误:无法连接到 XML-RPC 服务器。请确保服务器已启动")
except Exception as e:
print(f"发生错误:{e}")
2. RESTful API:现代 Web 服务的'王者'
如果说 XML-RPC 和 SOAP 是'传统武术',那 RESTful API 就是 Web 服务领域的'现代格斗术'!它更简洁、更高效、更符合 Web 的本质,已经成为构建现代 Web 服务的主流方式。
你把 Web 看作一个巨大的图书馆,每本书(资源)都有一个唯一的编号(URL)。你想看书(GET),就告诉管理员书的编号;你想借书(POST),就告诉管理员书的编号和你的信息。整个过程非常直观。
import requests
def rest_api_example():
try:
username = "octocat"
api_url = f"https://api.github.com/users/{username}"
print(f"正在从 {api_url} 获取用户信息...")
response = requests.get(api_url)
response.raise_for_status()
user_data = response.json()
print("\n获取到的用户信息:")
print(f"用户名:{user_data.get('login')}")
print(f"姓名:{user_data.get('name', 'N/A')}")
print(f"公司:{user_data.get('company', 'N/A')}")
print(f"粉丝数:{user_data.get('followers')}")
except requests.exceptions.RequestException as e:
print(f"请求 GitHub API 失败:{e}")
except Exception as e:
print(f"发生错误:{e}")
拓展方案:让你的技能包更'鼓'
学完了基础知识,我们再来看看几个能让你在 Web 世界里'如虎添翼'的进阶技能。
1. Scrapy 框架:工业级爬虫利器
如果说 Beautiful Soup 是'万能工具箱',那 Scrapy 就是'全自动生产线'!当你需要大规模、高效率地从网站上抓取数据时,Scrapy 就是你的不二之选。它是一个功能强大、高度可定制的 Python 爬虫框架,专为数据抓取和处理而生。
import scrapy
class ExampleSpider(scrapy.Spider):
name = "example"
allowed_domains = ["quotes.toscrape.com"]
start_urls = ["http://quotes.toscrape.com/"]
def parse(self, response):
for quote in response.css("div.quote"):
yield {
"text": quote.css("span.text::text").get(),
"author": quote.css("small.author::text").get(),
"tags": quote.css("div.tags a.tag::text").getall(),
}
next_page = response.css("li.next a::attr(href)").get()
if next_page is not None:
yield response.follow(next_page, callback=self.parse)
2. FastAPI:打造高性能 API 的'新贵'
如果你觉得 Flask 已经很棒了,那 FastAPI 会让你惊呼'还有这种操作?!'。它是一个现代、快速(高性能)、基于 Python 标准类型提示的 Web 框架,用于构建 API。
from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: Optional[bool] = None
@app.get("/")
async def read_root():
return {"message": "欢迎来到 FastAPI 的世界!"}
@app.post("/items/")
async def create_item(item: Item):
return {"message": "Item received", "item": item}
3. Selenium:驾驭'动态'网页的'终极武器'
现在的网页越来越'聪明',很多内容都是通过 JavaScript 动态加载的。Selenium 就是那个能让你'模拟真人'操作浏览器的'终极武器'!它允许开发者通过编程方式控制浏览器,模拟用户的各种行为,从而获取动态加载的内容。
from selenium import webdriver
from selenium.webdriver.common.by import By
def selenium_example():
driver = webdriver.Chrome()
driver.maximize_window()
try:
driver.get("https://www.python.org/")
about_link = driver.find_element(By.LINK_TEXT, "About")
about_link.click()
print(f"当前页面标题:{driver.title}")
except Exception as e:
print(f"Selenium 操作失败:{e}")
finally:
driver.quit()
掌握了这些工具,你的程序就能在互联网上'呼风唤雨'了!无论是想成为一个数据侦探,还是一个 Web 应用架构师,亦或是一个 API 设计师,Python 都能助你一臂之力!
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online