当前位置: 首页 > article >正文

【Python 教程15】-Python和Web

正则表达式快准狠的“文本手术刀”在 Python 的世界里正则表达式Regular Expression简称 Regex就像一把锋利的“手术刀”能让你在杂乱无章的文本中精准地切割、匹配、提取出你想要的部分。当网页内容还是一堆“乱码”时Regex 就是你的“火眼金睛”。专业解释正则表达式是一种用于匹配字符串模式的强大工具。它通过定义一系列特殊字符和语法规则来描述字符串的搜索模式从而实现对文本的查找、替换、提取等操作。在屏幕抓取中我们常用它来从原始 HTML 文本中匹配特定的数据。大白话解读比如你想从一堆电话号码里找出所有以“138”开头的或者从一篇文章里找出所有链接正则表达式就能帮你一秒搞定比你一个一个找快多了生活案例就像你在图书馆里找书不是一本一本翻而是直接看书架上的分类标签正则表达式就是那个帮你快速定位的“分类标签”。示例 Python 代码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, headersheaders) with urllib.request.urlopen(req) as response: html_content response.read().decode(utf-8) # 假设我们要抓取Python Job Board上的职位名称和链接 # 原始链接http://python.org/jobs # 注意实际网站结构可能变化此代码仅作示例 pattern re.compile(ra 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 fhttps://www.python.org{job_url_suffix} print(f- {job_name} ({full_job_url})) except Exception as e: print(f抓取失败{e}) ​ # 运行示例 simple_regex_scraper(https://www.python.org/jobs/)小提示正则表达式虽然强大但面对复杂的 HTML 结构比如嵌套很深的标签或者 HTML 本身就不规范时它可能会让你抓狂。这时候我们就需要更“温柔”的工具了2. HTML 解析优雅地“拆解”网页当网页内容不再是简单的文本而是结构复杂的 HTML 时我们就需要一个“结构工程师”来帮助我们理解和拆解它。HTML 解析就是把一堆 HTML 代码变成一个有层级、有关系的“积木模型”这样我们就能轻松找到想要的“积木”了。专业解释HTML 解析是将 HTML 文档通常是字符串形式转换为一个可操作的数据结构如 DOM 树以便程序能够方便地访问、修改和提取文档中的元素、属性和文本内容。这比直接使用正则表达式匹配原始字符串更健壮和灵活。大白话解读就像你拿到一份乐高说明书HTML 解析就是帮你把说明书上的零件标签和组装步骤结构理清楚让你知道哪个零件在哪怎么拼起来。生活案例你买了一个宜家家具HTML 解析就像是那个详细的组装说明书告诉你哪个板子是桌面哪个是桌腿以及它们是怎么连接的。示例 Python 代码使用html.parserfrom 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 fhttps://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 (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, headersheaders) with urllib.request.urlopen(req) as response: html_content response.read().decode(utf-8) ​ parser JobScraper() parser.feed(html_content) parser.close() ​ print(f\n使用 HTMLParser 从 {url} 抓取到的职位信息) for job in parser.job_listings: print(f- {job}) ​ except Exception as e: print(f抓取失败{e}) ​ # 运行示例 html_parser_scraper(https://www.python.org/jobs/)温馨提示HTMLParser是 Python 标准库自带的用起来比较底层需要自己处理各种标签事件。如果你觉得这有点像“手搓”螺丝那么接下来要介绍的“电动工具”一定会让你爱不释手3. Beautiful Soup应对“脏乱差”网页的“神器”互联网上的网页可不是都那么“规矩”的很多时候它们就像一堆被熊孩子玩过的乐高积木缺胳膊少腿乱七八糟。这时候Beautiful Soup就闪亮登场了它是一个专门用来“收拾烂摊子”的工具即使面对格式再糟糕的 HTML它也能帮你优雅地解析出来。专业解释Beautiful Soup 是一个 Python 库用于从 HTML 或 XML 文件中提取数据。它能够处理不规范的 HTML 标记并提供简单、Pythonic 的方式来导航、搜索和修改解析树。它构建了一个解析树使得开发者可以通过标签名、属性、CSS 选择器等多种方式轻松定位元素。大白话解读Beautiful Soup 就像一个“超级保姆”不管你的 HTML 代码有多“熊”它都能帮你整理得服服帖帖让你想找什么数据就像在自己家里找东西一样简单。生活案例你家孩子把玩具撒了一地Beautiful Soup 就像那个能自动分类整理玩具的“智能机器人”把小汽车放一堆积木放一堆让你一眼就能找到想要的。示例 Python 代码from urllib.request import urlopen from bs4 import BeautifulSoup ​ def beautiful_soup_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, headersheaders) with urllib.request.urlopen(req) as response: html_content response.read() # 使用Beautiful Soup解析HTML soup BeautifulSoup(html_content, html.parser) job_listings set() # 假设职位信息在body的第一个section下的h2标签中且h2中包含a标签 # 注意实际网站结构可能变化此代码仅作示例 # 寻找所有class为listing-row的div或者直接寻找h2标签内的a链接 # 示例soup.find_all(h2) 或者 soup.select(section.listing-section h2 a) # 针对Python官网jobs页面的结构我们可以尝试更直接的方式 # 查找所有class为listing-row的div然后从里面提取链接和文本 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(stripTrue) job_url_suffix link_tag.get(href) full_job_url fhttps://www.python.org{job_url_suffix} job_listings.add(f{job_name} ({full_job_url})) ​ print(f\n使用 Beautiful Soup 从 {url} 抓取到的职位信息) for job in sorted(list(job_listings), keystr.lower): print(f- {job}) except Exception as e: print(f抓取失败{e}) ​ # 运行示例 beautiful_soup_scraper(https://www.python.org/jobs/)总结一下屏幕抓取就像是互联网世界的“寻宝游戏”。正则表达式是你的“藏宝图碎片”帮你识别特定模式HTMLParser是你的“放大镜”帮你细致地查看 HTML 结构而Beautiful Soup则是你的“万能工具箱”不管遇到多复杂的“宝藏箱”它都能帮你打开二、CGI让你的网页“动”起来如果说屏幕抓取是把别人的网页“搬”回家那CGICommon Gateway Interface通用网关接口就是让你自己家的网页“活”起来的魔法静态网页就像一张张精美的海报虽然好看但不会对你的任何行为做出反应。而有了 CGI你的网页就变成了一个能和你互动的“智能机器人”1. CGI 基础Web 服务器的“传话筒”想象一下Web 服务器比如 Apache是个“餐厅老板”它只负责接待客人用户请求但不会做菜处理动态请求。CGI 脚本就是那个“大厨”当客人点了份“宫保鸡丁”提交了一个表单老板就会通过 CGI 这个“传话筒”把订单告诉大厨。大厨做好菜后再通过老板端给客人。专业解释CGI 是一种标准定义了 Web 服务器如何与外部脚本CGI 脚本进行通信以处理动态请求。当 Web 服务器收到一个指向 CGI 脚本的请求时它会执行该脚本并将请求的详细信息如表单数据、URL 参数等作为环境变量或标准输入传递给脚本。脚本处理完请求后将生成的 HTML 或其他内容作为标准输出返回给 Web 服务器最终由服务器发送给客户端浏览器。大白话解读你访问一个网站填了个登录表单点击“登录”按钮。这时候Web 服务器就把你的用户名和密码通过 CGI 交给了后台的 Python 脚本。Python 脚本验证了一下发现你是合法用户就生成一个“欢迎回来”的页面再通过 Web 服务器显示给你看。整个过程CGI 就是那个负责“沟通”的桥梁。生活案例你去银行 ATM 机取钱ATM 机就是 Web 服务器你插卡、输密码就是用户请求。ATM 机本身不处理你的账户信息它通过一个内部接口类似 CGI把你的请求发给银行的后台系统。后台系统验证通过后告诉 ATM 机吐多少钱ATM 机再把钱给你。这个内部接口就是 CGI 的角色。示例 Python 代码一个简单的 CGI 脚本#!/usr/bin/env python # -*- coding: UTF-8 -*- ​ # 引入cgi模块方便处理CGI请求 import cgi import cgitb ​ # 开启调试模式出错时会在浏览器显示详细信息 cgitb.enable() ​ # 创建FieldStorage实例用于获取表单数据 form cgi.FieldStorage() ​ # 获取表单中名为name的字段值 user_name form.getvalue(name, 路人甲) ​ # ---- CGI脚本的核心输出 ---- # 1. 首先必须输出一个Content-type头告诉浏览器我们发送的是HTML print(Content-type:text/html\n\n) ​ # 2. 接着输出HTML内容 print(html) print(head) print(titleCGI 脚本初体验/title) print(/head) print(body) print(fh2你好, {user_name}! 欢迎来到CGI的魔法世界/h2) print(/body) print(/html)注意要运行 CGI 脚本你需要一个配置好的 Web 服务器如 Apache 或 Nginx并将脚本放在指定的cgi-bin目录下同时赋予它可执行权限。对于现代 Web 开发来说直接手写 CGI 已经比较少见了因为它效率不高而且每次请求都要创建一个新进程开销很大。于是更高级的“烹饪工具”——Web 框架就应运而生了。2. Python Web 框架告别“刀耕火种”如果说手写 CGI 是“刀耕火种”那Web 框架就是现代化的“联合收割机”它们把 Web 开发的各种脏活累活比如路由、模板渲染、数据库连接、用户认证等都帮你封装好了让你能专注于业务逻辑的实现而不是天天跟 HTTP 协议和服务器配置打交道。专业解释Web 框架是一套提供了构建 Web 应用所需核心功能的库和工具。它们遵循一定的架构模式如 MVC 或 MVT通过提供路由系统、模板引擎、ORM对象关系映射、会话管理等组件极大地简化了 Web 应用的开发流程提高了开发效率和代码的可维护性。大白话解读你想盖个房子Web 框架就是那个已经帮你打好地基、建好承重墙、铺好水电管道的“半成品”。你只需要根据自己的喜好装修一下墙面、摆放家具编写业务代码就行了省时又省力。生活案例你想做一道复杂的佛跳墙自己从头准备鲍鱼、海参、鱼翅……那得累死。Web 框架就像是超市里卖的“佛跳墙半成品料理包”所有食材都帮你处理好了你只需要回家按照说明书简单加热一下就能享受美味。示例 Python 代码使用 Flask 框架# 安装Flask: pip install Flask from flask import Flask, request, render_template_string ​ # 创建一个Flask应用实例 app Flask(__name__) ​ # 定义一个HTML模板用于显示欢迎信息 HTML_TEMPLATE !DOCTYPE html html head titleFlask Web App/title /head body h1你好, {{ name }}!/h1 p欢迎来到Flask的奇妙世界/p form methodpost label forname输入你的名字:/label input typetext idname namename button typesubmit提交/button /form /body /html ​ # 定义路由当用户访问网站根目录时执行这个函数 app.route(/, methods[GET, POST]) def hello(): user_name 路人甲 if request.method POST: # 如果是POST请求就从表单里获取名字 user_name request.form.get(name, 路人甲) # 使用模板渲染页面并传入名字 return render_template_string(HTML_TEMPLATE, nameuser_name) ​ # 如果这个脚本是直接运行的就启动Web服务器 if __name__ __main__: # 开启调试模式这样修改代码后服务器会自动重启 app.run(debugTrue)小结一下CGI 是 Web 动态化的“老祖宗”它奠定了基础但现在我们有了更强大的 Web 框架。无论是轻巧灵活的Flask、FastAPI还是功能全面的“巨无霸”Django它们都能让你以前所未有的速度构建出功能强大的 Web 应用。所以别再纠结于 CGI 的细节了大胆拥抱 Web 框架吧三、Web 服务程序间的“秘密通道”想象一下你的程序是个“社交达人”它不仅能自己处理数据还想和别的程序“聊天”交换信息甚至让别的程序帮它干活。这时候Web 服务就登场了它就像程序之间约定好的“秘密通道”和“通用语言”让不同系统、不同语言开发的程序也能无障碍地沟通协作。专业解释Web 服务是一种基于 Web 的、可编程的应用程序组件它允许不同应用程序之间通过网络进行交互。它通常使用标准化的协议如 HTTP、XML、JSON来传输数据并提供一套接口供其他应用程序调用从而实现分布式计算和系统集成。大白话解读你的手机 App 想知道今天的天气它不会自己去测量气温、风速而是会去问“天气预报服务”这个专门提供天气信息的“程序”。这个“问”和“答”的过程就是 Web 服务在发挥作用。生活案例你用支付宝或者微信支付你的支付 App 并没有直接和银行的系统打交道而是通过调用银行提供的支付 Web 服务来完成交易。Web 服务就像一个“翻译官”让不同“国家”系统的程序能够互相理解。1. XML-RPC 与 SOAP远程调用的“双雄”在 Web 服务的早期XML-RPC和SOAP是两个非常流行的“老牌选手”。它们都致力于解决一个核心问题如何让一个程序调用另一个远程程序的功能就像调用本地函数一样简单。专业解释XML-RPCXML Remote Procedure Call是一种基于 XML 和 HTTP 的轻量级远程过程调用协议。它允许客户端程序调用远程服务器上的函数或方法并将请求和响应数据封装在 XML 格式中通过 HTTP 进行传输。它的特点是简单、易于实现。SOAPSimple Object Access Protocol也是一种基于 XML 的协议用于在分布式环境中交换结构化信息。与 XML-RPC 相比SOAP 更为复杂和强大它支持更丰富的数据类型、更复杂的传输机制如 HTTP、SMTP 等并提供了更严格的规范和安全性特性。SOAP 通常与 WSDLWeb Services Description Language结合使用WSDL 用于描述 Web 服务的接口和操作。大白话解读XML-RPC就像是两个朋友之间用“明信片”交流明信片上写着“请帮我做这件事”然后寄过去收到回信就知道结果了。简单直接。SOAP则像是一份严谨的“外交公文”里面不仅详细说明了“请帮我做这件事”还规定了公文的格式、加密方式、谁来签收等等。虽然有点繁琐但非常正式和安全。示例 Python 代码XML-RPC 客户端# 假设有一个XML-RPC服务器运行在 http://localhost:8000/RPC2 # 服务器端代码例如server.py可能如下 # from xmlrpc.server import SimpleXMLRPCServer # def add(x, y): return x y # server SimpleXMLRPCRPCServer((localhost, 8000)) # server.register_function(add, add) # server.serve_forever() ​ import xmlrpc.client ​ def xmlrpc_client_example(): try: # 连接到XML-RPC服务器 proxy xmlrpc.client.ServerProxy(http://localhost:8000/RPC2) # 调用远程服务器上的add方法 result proxy.add(5, 3) print(fXML-RPC 调用结果5 3 {result}) # 尝试调用一个不存在的方法 try: proxy.subtract(10, 2) except xmlrpc.client.Fault as e: print(fXML-RPC 错误示例{e}) ​ except ConnectionRefusedError: print(错误无法连接到XML-RPC服务器。请确保服务器已启动并运行在 http://localhost:8000/RPC2) except Exception as e: print(f发生错误{e}) ​ # 运行示例 # xmlrpc_client_example() # 运行时请确保有XML-RPC服务器在运行 print(XML-RPC 客户端示例代码已准备好请启动一个XML-RPC服务器后尝试运行。)小提示虽然 XML-RPC 和 SOAP 在历史上扮演了重要角色但它们在现代 Web 开发中已经逐渐被更轻量级、更灵活的技术所取代比如接下来要介绍的 RESTful API。2. RESTful API现代 Web 服务的“王者”如果说 XML-RPC 和 SOAP 是“传统武术”那RESTful API就是 Web 服务领域的“现代格斗术”它更简洁、更高效、更符合 Web 的本质已经成为构建现代 Web 服务的主流方式。专业解释RESTRepresentational State Transfer表述性状态转移是一种架构风格而不是协议。RESTful API 是遵循 REST 架构风格的 API 设计。它主要基于 HTTP 协议利用 HTTP 方法GET、POST、PUT、DELETE 等对资源进行操作并通过 URL 来标识资源。数据通常以 JSON 或 XML 格式传输具有无状态性、统一接口、分层系统等特点。大白话解读你把 Web 看作一个巨大的图书馆每本书资源都有一个唯一的编号URL。你想看书GET就告诉管理员书的编号你想借书POST就告诉管理员书的编号和你的信息你想更新书的信息PUT就告诉管理员书的编号和新的信息你想还书DELETE就告诉管理员书的编号。整个过程非常直观就像和图书馆管理员打交道一样。生活案例你用外卖 App 点餐App 会向外卖平台的 API 发送一个请求POST告诉它你要点什么菜、送到哪里。外卖平台收到请求后处理订单然后通过 API 返回一个订单成功的消息。这个过程就是典型的 RESTful API 交互。示例 Python 代码使用requests库调用 RESTful APIimport requests ​ def rest_api_example(): try: # 假设我们调用一个公共的API例如获取GitHub用户信息 username octocat # GitHub的默认测试用户 api_url fhttps://api.github.com/users/{username} print(f正在从 {api_url} 获取用户信息...) # 发送GET请求 response requests.get(api_url) # 检查请求是否成功 (状态码200) response.raise_for_status() # 解析JSON响应 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)}) print(f关注数: {user_data.get(following)}) print(f个人主页: {user_data.get(html_url)}) except requests.exceptions.RequestException as e: print(f请求GitHub API失败{e}) except Exception as e: print(f发生错误{e}) ​ # 运行示例 rest_api_example()总结一下Web 服务让程序之间能够“手拉手”一起干活XML-RPC 和 SOAP 是早期的“握手方式”而 RESTful API 则是现代程序之间最流行的“社交礼仪”。掌握了它们你的程序就能在互联网上“呼风唤雨”了四、拓展方案让你的技能包更“鼓”学完了基础知识是不是觉得意犹未尽别急Python 在 Web 领域的“十八般武艺”可不止这些接下来我们再来看看几个能让你在 Web 世界里“如虎添翼”的进阶技能让你的技能包瞬间“鼓”起来1. Scrapy 框架工业级爬虫利器如果说 Beautiful Soup 是“万能工具箱”那Scrapy就是“全自动生产线”当你需要大规模、高效率地从网站上抓取数据时Scrapy 就是你的不二之选。它是一个功能强大、高度可定制的 Python 爬虫框架专为数据抓取和处理而生。专业解释Scrapy 是一个用于抓取网站并从网页中提取结构化数据的应用框架。它提供了一整套组件包括调度器、下载器、爬虫、管道等支持异步请求处理能够高效地处理大量并发请求并提供了强大的数据处理和存储机制。大白话解读你不是想“搬运”数据吗Scrapy 就是那个能帮你搭建一个“自动化数据工厂”的框架。你告诉它去哪里“搬”搬什么怎么“搬”它就能自己吭哧吭哧地帮你把数据搬回来而且搬得又快又好还能帮你把数据整理得整整齐齐。生活案例你开了一家电商网站想知道竞争对手的商品价格和库存。如果手动去查那得查到猴年马月。Scrapy 就像你的“商业情报机器人”能自动帮你监控竞争对手的网站把所有商品信息都抓回来让你随时掌握市场动态。示例 Python 代码Scrapy 项目结构和核心代码片段# Scrapy项目通常通过命令行创建scrapy startproject myproject # 这是一个Scrapy爬虫的核心代码片段 (myproject/spiders/example_spider.py) ​ 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, callbackself.parse) ​ # 运行Scrapy爬虫在项目根目录执行 scrapy crawl exampleScrapy 小贴士Scrapy 的强大之处在于其高度的模块化和可扩展性。你可以自定义下载中间件、爬虫中间件、管道等实现各种复杂的抓取逻辑和数据处理需求。对于需要处理反爬、分布式抓取等高级场景Scrapy 绝对是你的得力助手2. FastAPI打造高性能 API 的“新贵”如果你觉得 Flask 已经很棒了那FastAPI会让你惊呼“还有这种操作”。它是一个现代、快速高性能、基于 Python 标准类型提示的 Web 框架用于构建 API。如果你想快速开发高性能的 API 服务FastAPI 绝对是你的“心头好”。专业解释FastAPI 是一个高性能的 Web 框架它基于 Starlette用于 Web 部分和 Pydantic用于数据验证和序列化。它利用 Python 3.6 的类型提示自动生成 OpenAPI以前称为 Swagger文档并提供数据验证、依赖注入等功能使得 API 开发变得极其高效和愉快。大白话解读你想开个“数据接口商店”让别人能方便地从你这里获取数据。FastAPI 就像一个“智能店长”你告诉它你的“商品”数据接口长什么样它就能自动帮你把“商品说明书”API 文档写好还能帮你检查顾客的“订单”请求参数是不是合规确保你的“商店”高效运转。生活案例你开发了一个 App需要从服务器获取用户数据、商品列表等。FastAPI 就是那个帮你搭建“数据中转站”的工具它能以闪电般的速度响应 App 的请求让你的 App 体验飞沙走石。示例 Python 代码# 安装FastAPI和Uvicorn: pip install fastapi uvicorn from fastapi import FastAPI from pydantic import BaseModel # 创建FastAPI应用实例 app FastAPI() # 定义请求体的数据模型 class Item(BaseModel): name: str price: float is_offer: bool | None None # 定义一个根路径的GET请求 app.get(/) async def read_root(): return {message: 欢迎来到FastAPI的世界} # 定义一个带路径参数的GET请求 app.get(/items/{item_id}) async def read_item(item_id: int, q: str | None None): return {item_id: item_id, q: q} # 定义一个POST请求接收JSON数据 app.post(/items/) async def create_item(item: Item): return {message: Item received, item: item} # 运行FastAPI应用uvicorn main:app --reloadFastAPI 的魅力FastAPI 的自动文档生成功能简直是开发者的福音你不需要额外编写 API 文档它会根据你的代码自动生成交互式的 Swagger UI 和 ReDoc 文档让你的 API 接口一目了然。同时其异步支持也让它在处理高并发场景时表现出色。3. Selenium驾驭“动态”网页的“终极武器”现在的网页越来越“聪明”很多内容都是通过 JavaScript 动态加载的或者需要你点击、滚动才能显示出来。这时候传统的屏幕抓取工具可能就“傻眼”了。别担心Selenium就是那个能让你“模拟真人”操作浏览器的“终极武器”专业解释Selenium 是一个用于 Web 应用程序测试的工具但它也可以被广泛应用于 Web 抓取。它允许开发者通过编程方式控制浏览器如 Chrome、Firefox模拟用户的各种行为如点击按钮、填写表单、执行 JavaScript、滚动页面等从而获取动态加载的内容。大白话解读有些网站很“狡猾”你直接用代码去访问它给你看的是“毛坯房”什么都没有。但你用浏览器打开它就给你装修得漂漂亮亮。Selenium 就是那个能帮你“开着浏览器”去访问网站的工具它能像真人一样点击、输入、等待直到所有内容都加载出来然后你再“截图”抓取数据。生活案例你想抢购某个限量商品但商品页面需要登录、点击多个按钮、等待加载才能看到抢购按钮。Selenium 就像你的“自动抢购机器人”它能自动帮你完成所有这些操作甚至比你手动操作还快示例 Python 代码# 安装Selenium和对应浏览器的WebDriverpip install selenium # 需要下载对应浏览器的WebDriver例如ChromeDriver并将其路径添加到系统PATH中 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time def selenium_example(): # 初始化Chrome浏览器驱动 # 确保你的ChromeDriver路径正确或者已添加到系统PATH driver webdriver.Chrome() driver.maximize_window() # 最大化窗口有时有助于避免元素不可见问题 try: # 访问一个需要动态加载内容的网站这里以一个简单的示例网站代替 # 实际应用中可以是需要登录、点击加载更多的网站 driver.get(https://www.python.org/) print(f成功访问{driver.current_url}) # 等待某个元素加载完成例如等待导航栏的某个链接出现 # WebDriverWait(driver, 10).until( # EC.presence_of_element_located((By.ID, id-of-an-element)) # ) # 模拟点击某个链接例如点击About菜单 about_link driver.find_element(By.LINK_TEXT, About) about_link.click() print(点击了About链接) # 等待页面跳转或内容加载 time.sleep(2) # 简单的等待实际应使用WebDriverWait # 获取当前页面的标题 print(f当前页面标题{driver.title}) # 获取页面内容包括JS渲染后的 # page_source driver.page_source # print(page_source[:500]) # 打印前500个字符 except Exception as e: print(fSelenium操作失败{e}) finally: # 关闭浏览器 driver.quit() # 运行示例 selenium_example()Selenium 的强大Selenium 不仅能抓取数据还能用于自动化测试、模拟用户行为等。当你需要处理验证码、登录、点击、滚动等复杂交互时Selenium 就是你的“瑞士军刀”。但它也有缺点就是运行速度相对较慢资源消耗较大因为它需要真正启动一个浏览器。五、总结与互动是时候展现真正的技术了好了各位编程小能手们今天的 Python Web 之旅就到这里啦我们一起探索了如何从 Web 世界“捞金”屏幕抓取如何让你的网页“活”起来CGI 与 Web 框架以及如何让程序之间“隔空对话”Web 服务。是不是感觉 Python 在 Web 领域简直是无所不能

相关文章:

【Python 教程15】-Python和Web

正则表达式:快准狠的“文本手术刀” 在 Python 的世界里,正则表达式(Regular Expression,简称 Regex)就像一把锋利的“手术刀”,能让你在杂乱无章的文本中,精准地切割、匹配、提取出你想要的部分…...

Win11升级还是全新安装?保姆级决策指南与数据迁移全流程

Win11升级还是全新安装?保姆级决策指南与数据迁移全流程 每次Windows重大版本更新,用户都会面临一个经典难题:是选择保留数据的平滑升级,还是彻底格式化重装系统?这个问题在Win11时代尤为突出——新系统带来的界面革新…...

Zynq-7000 + RT-Thread + lwIP 实时网络性能调优实战

1. 为什么选择Zynq-7000 RT-Thread lwIP组合 在嵌入式网络应用中,实时性和确定性往往是首要考虑因素。我曾在多个工业控制项目中遇到这样的场景:系统需要同时处理高速UDP数据流和稳定的TCP控制指令,传统的嵌入式Linux方案虽然功能全面&…...

LibreCAD完全指南:零成本实现专业级2D设计的开源解决方案

LibreCAD完全指南:零成本实现专业级2D设计的开源解决方案 【免费下载链接】LibreCAD LibreCAD is a cross-platform 2D CAD program written in C17. It can read DXF/DWG files and can write DXF/PDF/SVG files. It supports point/line/circle/ellipse/parabola/…...

千里科技“AI+车”加速度:2025年营收增长42%、净利翻倍、新业务突破

A股上市公司重庆千里科技股份有限公司(以下简称“千里科技”)今日发布2025年年度报告,公司收入、利润双增长,“AI车”商业化实现突破。报告期内,全年实现营业收入99.99亿元,同比增长42.13%;归母…...

氢燃料电池模型详解:基于MATLAB Simulink的全方位建模系统,涵盖输出电压模型、流道...

氢燃料电池模型 1.基于MATLAB/simulink开发的,包含输出电压模型,阳极流道模型,阴极流道模型,水传递模型,空压机模型,空压机模型,进气歧管,排气歧管等 2.PEMFC燃电模型为密歇根大学研…...

FLAME PyTorch高效构建参数化3D人脸模型实战指南

FLAME PyTorch高效构建参数化3D人脸模型实战指南 【免费下载链接】FLAME_PyTorch 项目地址: https://gitcode.com/gh_mirrors/fl/FLAME_PyTorch 在数字内容创作、虚拟现实和影视制作等领域,3D建模技术正发挥着越来越重要的作用。其中,参数化人脸…...

OpenClaw资源优化:Phi-3-mini-128k-instruct模型量化与推理加速实践

OpenClaw资源优化:Phi-3-mini-128k-instruct模型量化与推理加速实践 1. 为什么需要优化Phi-3-mini-128k-instruct的性能 当我第一次在OpenClaw中接入Phi-3-mini-128k-instruct模型时,就遇到了一个典型问题:虽然这个128k超长上下文模型在处理…...

No.1085 ‘基于S7-200 PLC和组态王的邮件分拣控制系统设计

No.1085 基于S7-200 PLC和组态王的邮件分拣控制系统设计快递分拣中心里,传送带上的包裹像流水般划过,机械臂精准抓取分类——这种工业自动化场景的实现,离不开PLC和上位机的黄金组合。今天咱们就以西门子S7-200 PLC搭配组态王6.55&#xff0c…...

基于COMSOL的复能带与凋落波研究:大、小单元嵌套声学黑洞结构PDE建模与文献复现

comsol实能带、复能带(PDE)建模 文献复现-“周期嵌套声学黑洞结构的复能带和凋落波研究”-“Complex band structure and evanescent Bloch wave propagation of periodic nested acoustic black hole phononic structure” 包括(大单元、小单元、嵌套单元&#xff…...

OpenClaw配置优化:Qwen3-4B模型参数调优实战

OpenClaw配置优化:Qwen3-4B模型参数调优实战 1. 为什么需要调优Qwen3-4B模型参数 去年夏天,当我第一次在OpenClaw中接入Qwen3-4B模型时,发现同样的提示词在不同任务下表现差异巨大。有时它给出的回答过于保守,像在背诵教科书&am…...

Echarts异步数据加载场景下,如何设计优雅的Loading动画以优化用户感知

1. 为什么需要优雅的Loading动画 当我们在网页中使用Echarts展示数据图表时,经常会遇到数据需要从服务器异步加载的情况。想象一下这样的场景:用户打开页面后,看到一个空白的坐标轴在那里"发呆",既没有数据也没有任何提…...

OpenClaw模型对比测试:Phi-3-vision-128k与纯文本模型在图文任务表现

OpenClaw模型对比测试:Phi-3-vision-128k与纯文本模型在图文任务表现 1. 测试背景与动机 最近在搭建个人自动化工作流时,遇到了一个典型问题:当OpenClaw需要处理包含图片和表格的文档时,纯文本模型的表现总是不尽如人意。作为一…...

在Vivado里调通3/4删余卷积码Viterbi译码:从分支度量到回溯的完整避坑指南

Vivado平台实现3/4删余卷积码Viterbi译码的工程实践 在数字通信系统中,卷积码因其优异的纠错性能被广泛应用。802.11a等标准中采用的删余卷积码技术,通过有选择地删除部分编码比特来提高码率。本文将深入探讨如何在Vivado平台上实现3/4删余卷积码的Viter…...

OpenClaw+Kimi-VL-A3B-Thinking自动化办公:飞书机器人实现图文周报生成

OpenClawKimi-VL-A3B-Thinking自动化办公:飞书机器人实现图文周报生成 1. 为什么选择这个方案 每周五下午,我都会面临同样的困扰:需要从十几个工作群聊、邮件和本地文件中整理出本周工作内容,手动截图关键数据,再拼凑…...

从开发到安全:SpringBoot/Struts2/Laravel框架那些“第三方组件”挖出的坑,你的项目踩中了吗?

第三方组件安全黑洞:主流开发框架中那些被忽视的高危依赖 当我们在讨论框架安全时,往往聚焦于SpringBoot、Laravel等核心框架本身,却忽略了那些如影随形的第三方组件。这些"搭便车"的依赖项,正成为企业应用安全的阿喀琉…...

ESP-NOW低功耗传感网络框架:节点-主机架构与AES-GCM加密实现

1. EspNowNetwork 项目概述EspNowNetwork 是一套面向 ESP32 系列 SoC(包括 ESP32-S2、ESP32-C3、ESP32-C6)的模块化固件框架,专为构建低功耗、高可靠性的点对多点无线传感网络而设计。其核心目标并非替代 Wi-Fi 或 BLE 协议栈,而是…...

别再手动算不确定度了!用C++代码一键搞定科大奥锐虚拟仿真实验(附完整代码)

用C解放物理实验:不确定度计算的自动化实践 物理实验报告中最令人头疼的部分莫过于那些繁琐的不确定度计算。每次测量完数据,面对满纸的数字和公式,总有一种被数学淹没的窒息感。记得上学期做"长度与固体密度测量"实验时&#xff0…...

MTK6737平台LCD驱动移植保姆级教程:从供应商参数到开机Logo的完整避坑指南

MTK6737平台LCD驱动移植实战:从零构建显示系统的关键技术与避坑指南 在嵌入式设备开发中,显示系统作为人机交互的核心组件,其稳定性直接影响用户体验。MTK6737作为主流中端移动处理器平台,广泛应用于各类智能设备,而HX…...

车灯设计师必看:CATIA中FreeStyle模块的10个高效技巧

车灯设计师必看:CATIA中FreeStyle模块的10个高效技巧 在汽车照明系统的设计中,曲面造型的精度与美感直接决定了最终产品的市场竞争力。作为行业标准工具,CATIA的FreeStyle模块为车灯设计师提供了强大的自由曲面创建能力,但真正掌握…...

HarmonyOS6 半年磨一剑 - RcRadio 组件核心架构与类型系统设计

文章目录前言一、双组件架构设计1.1 两个组件的职责划分1.2 双文件架构二、ComponentV2 装饰器体系2.1 Param 与 Require 的配合2.2 Local 的内部状态隔离三、类型系统设计3.1 基础类型别名3.2 RcRadioValue 的宽松类型3.3 RcRadioOption 接口四、modelValue 双向绑定模型4.1 受…...

小程序支付实名认证跳转:从安卓兼容到iOS限制的实战处理方案

1. 小程序支付实名认证跳转的痛点解析 最近在开发一个保险行业的小程序时,遇到了一个让人头疼的问题:支付环节需要跳转到微支保小程序进行实名认证。最初的做法很简单粗暴,直接在页面加载时就调用wx.navigateToMiniProgram跳转。测试时发现&a…...

别再只调参了!用决策树可视化你的Fashion MNIST分类过程,看看模型到底在‘看’哪里

决策树可视化:用Fashion MNIST解码模型注意力机制 1. 当深度学习遇到可解释性困境 在图像分类任务中,我们常常陷入一个矛盾:CNN等复杂模型虽然准确率高,但其决策过程如同黑箱。当模型表现不佳时,我们往往只能盲目调整超…...

乐鑫联合 Bosch Sensortec(博世传感器)推出磁感应交互方案

在 AI 玩具与智能硬件的设计中,如何在有限的空间与成本条件下,实现稳定且顺畅的配件交互,正成为产品创新的重要课题。 乐鑫信息科技 (688018.SH) 携手 Bosch Sensortec(博世传感器)推出了一种更轻量、更可靠的解决思路…...

OpenClaw终极效率手册:gemma-3-12b-it驱动的50个日常自动化技巧

OpenClaw终极效率手册:gemma-3-12b-it驱动的50个日常自动化技巧 1. 为什么选择OpenClawgemma-3-12b-it组合 去年冬天,当我第一次在本地部署OpenClaw时,最头疼的问题就是模型选择。试过多个开源模型后,最终锁定gemma-3-12b-it——…...

AI赋能:借助快马平台轻松打造集成大语言模型的智能openclaw飞书助手

最近在尝试给团队开发一个智能化的飞书助手,发现结合大语言模型的AI能力确实能大幅提升工作效率。经过一番摸索,我总结出一套用InsCode(快马)平台快速实现这类需求的方法,整个过程比想象中简单很多。 明确核心需求场景 智能助手主要解决三个高…...

别再写重复代码了!微信小程序分页加载与下拉刷新,一个通用组件就搞定

微信小程序分页加载与下拉刷新的工程化实践 每次开发新页面时,你是否还在重复编写分页加载和下拉刷新的逻辑?作为一个有追求的小程序开发者,我们需要思考如何将这些通用功能抽象成可复用的组件或Mixin。本文将带你从工程化角度,设…...

OpenClaw+千问3.5-9B二次开发:修改开源技能适配个人工作流

OpenClaw千问3.5-9B二次开发:修改开源技能适配个人工作流 1. 为什么需要二次开发开源技能? 去年我开始使用OpenClaw管理日常工作流时,发现一个有趣的现象:官方技能市场里的工具虽然丰富,但总有些"差点意思"…...

飞书机器人集成实战:OpenClaw+Phi-3-vision-128k-instruct打造智能问答助手

飞书机器人集成实战:OpenClawPhi-3-vision-128k-instruct打造智能问答助手 1. 为什么选择这个技术组合? 上周我接到一个产品经理的需求——希望能通过飞书直接发送产品截图,自动获得功能分析报告。传统方案需要开发整套服务端逻辑&#xff…...

腾讯云DNS解析迁移到Cloudflare的完整避坑指南(附小黄云加速设置)

腾讯云DNS解析迁移到Cloudflare的完整避坑指南(附小黄云加速设置) 当网站遭遇流量攻击或需要全球加速时,许多站长会将DNS解析从国内服务商迁移至Cloudflare。这个决策背后不仅是免费防护的吸引力,更涉及解析稳定性、安全功能与性能…...