断网才是数字时代真正的恐慌时刻——当Wi-Fi信号消失,我们才惊觉计算机上90%的操作都依赖互联网实现。 现代软件开发必须将网络连接视为核心功能,而非附加特性, 因为从数据同步到API调用,从软件更新到云存储,网络能力已成为程序不可或缺的"基础器官"。
“Web抓取”是一个术语,即利用程序下载并处理来自 Web的内容。 例如,Google运行了许多web抓取程序, 对网页进行索引,实现它的搜索引擎。 在本章将学习几个模块,让在Python中抓取网页变得很容易。
webbrowser
: 是Python自带的,打开浏览器获取指定页面。requests
: 从因特网上下载文件和网页。Beautiful Soup
: 解析HTML,即网页编写的格式。selenium
: 启动并控制一个Web浏览器。selenium
能够填写表单, 并模拟鼠标在这个浏览器中点击。
import webbrowser
webbrowser.open('http://inventwithpython.com/')
False
Web 浏览器的选项卡将打开 URLhttp://inventwithpython.com/。
这大概就是 webbrowser
模块能做的唯一的事情。
既使如此, open()
函数确实让一些有趣的事情成为可能。
例如,将一条街道的地址拷贝到剪贴板,
并在Google地图上打开它的地图,这是很繁琐的事。
可以让这个任务减少几步,写一个简单的脚本,
利用剪贴板中的内容在浏览器中自动加载地图。
这样只要将地址拷贝到剪贴板,运行该脚本,
地图就会加载。程序需要做到:
从命令行参数或剪贴板中取得街道地址。
打开Web浏览器,指向该地址的Google地图页面。
这意味着代码需要做下列事情:
从
sys.argv
读取命令行参数。读取剪贴板内容。
调用
webbrowser.open()
函数打开外部浏览器。
打开一个新的文件编辑器窗口,将它保存为 maplt.py
。
C:\> mapit 870 Valencia St, San Francisco, CA 94110
该脚本将自动完成以下操作:调用默认浏览器打开Google地图并定位至指定地址(示例中的"870 Valencia St, San Francisco, CA 94110")。
实现原理是通过拼接URL参数并调用webbrowser.open()
函数。
用户可扩展功能:1)添加命令行参数解析支持多地址输入;2)集成地理编码API实现模糊地址匹配;3)添加历史记录功能存储常用地址。 这种设计模式典型应用于需要快速启动Web服务的工具开发,如文档链接助手、即时翻译器等。
maplt.py
- 通过命令行参数或剪贴板地址在浏览器中打开地图。
#! python3
import webbrowser, sys
if len(sys.argv) > 1:
# Get address from command line.
address = ' '.join(sys.argv[1:])
# TODO: 从剪贴板获取地址。
在Python脚本开发中,规范的#!
行(shebang)后需要导入关键模块:webbrowser
模块用于控制浏览器操作,sys
模块用于处理命令行输入。
其中sys.argv
作为系统参数列表,其数据结构遵循UNIX惯例——索引0始终存储脚本文件名,后续索引依次存储命令行参数。
通过条件判断len(sys.argv) > 1
可精准检测用户是否输入了有效参数,这种检测机制比直接访问索引更安全,能避免IndexError
异常。
命令行参数通常用空格分隔,但在这个例子中,希望将所有参数解释为一个字符串。
因为 sys.argv
是字符串的列表,
所以可以将它传递给 join()
方法,
这将返回一个字符串。如不希望程序的名称出现在这个字符串中,
那么不使用 sys.argv
,而是使用 sys.argv[1:]
,
砍掉这个数组的第一个元素。表达式求值得到的字符串,可保存在 address
变量中。
如果运行程序时在命令行中输入以下内容:
mapit 870 Valencia St, San Francisco, CA 94110
... sys.argv
变量将包含这样的列表值:
['mapIt.py', '870','Valencia','St, ','San', 'Francisco, ', 'CA', '94110']
['mapIt.py', '870', 'Valencia', 'St, ', 'San', 'Francisco, ', 'CA', '94110']
sudo apt install python3-pyperclip
让代码看起来像这样:
maplt.py
- 通过命令行参数或剪贴板地址在浏览器中打开地图。
#! python3
# import webbrowser, sys, pyperclip
# if len(sys.argv) > 1:
# # Get address from command line.
# address = ' '.join(sys.argv[1:])
# else: # Get address from clipboard.
# address = pyperclip.paste()
# webbrowser.open('https://www.google.com/maps/place/'+ address)
如果没有命令行参数,程序将假定地址保存在剪贴板中。
可以用 pyperclip.paste()
取得剪贴板的内容,
并将它保存在名为 address
的变量中。最后,
启动外部浏览器访问 Google 地图的URL,调用 webbrowser.open()
。
自动化工具的价值不仅体现在处理复杂任务时节省大量时间,更在于优化日常高频操作的体验效率。
以地图定位工具maplt.py
为例,其核心价值在于将原本需要多步骤完成的常规操作压缩为单命令执行。
操作步骤对比分析如下:
手工取得地图 | 利用 maplt.py |
---|---|
高亮标记地址 | 高亮标记地址 |
拷贝地址 | 拷贝地址 |
打开Web浏览器 | 运行 maplt.py |
打开 http://maps.google.com/ | |
点击地址文本字段 | |
拷贝地址 | |
按回车 |