作者:patrick0129_645 | 来源:互联网 | 2023-09-12 10:53
第十五章python和web本章讨论PythonWeb编程的一些方面了其中三个重要的主题:屏幕抓取、CGI和mod_python。另外还给出了一些指南。15.1屏
第十五章 python和web
本章讨论Python Web编程的一些方面 了其中三个重要的主题:屏幕抓取、CGI和mod_python。 另外还给出了一些指南。
15.1 屏幕抓取
下面讨论两种抓取网站信息可能的解决方案。一是结合使用 程序Tidy(一个Python库)和XHTML解析;二是使用专为屏幕抓取而设计的Beautiful Soup库。
15.1.1 Tidy 和 XHTML 解析
1、Tidy是什么
Tidy是用于对格式不正确且不严谨的HTML进行修复的工具。
2、. 获取Tidy
有多个用于Python的Tidy库包装器,至于哪个最新并非固定不变的。可像下面这样使用pip 来找出可供使用的包装器:
pip search tidy
一个不错的选择是PyTidyLib,可像下面这样安装它:
pip install pytidylib
不管你使用的是哪种操作系统,都可从Tidy网站(http://html-tidy.org)获 取可执行的二进制版本。有了二进制版本后,就可使用模块subprocess(或其他包含popen函数的 模块)来运行Tidy程序了。
(由于windows上没有实现对tidy的支持,暂时略去)
15.1.2 Beautiful Soup
Beautiful Soup是一个小巧而出色的模块,用于解析你在Web上可能遇到的不严谨且格式糟糕 的HTML。Beautiful Soup网站(http://crummy.com/software/BeautifulSoup)称: 那个糟糕的网页并非出自你的手笔。你只是想从中提取一些数据。Beautiful Soup 将向你伸出援手。
安装:
pip install beautifulsoup4
使用Beautiful Soup的屏幕抓取程序 :
from urllib.request import urlopenfrom bs4 import BeautifulSouptext = urlopen('http://python.org/jobs').read()soup = BeautifulSoup(text, 'html.parser')jobs = set()for job in soup.body.section('h2'):jobs.add('{} ({})'.format(job.a.string, job.a['href']))print('\n'.join(sorted(jobs, key=str.lower)))
运行结果:
C:\Users\xx\AppData\Local\Programs\Python\Python37\python.exe E:/pythonProjects/zhao/tidy_01.pyBackend Developer (m/w) (/jobs/3572/)Backend Developper Django @sketchfab (/jobs/3589/)Backend Engineer (m/w) (/jobs/3579/)CAD Engineer - CAD Infrastructure (/jobs/3586/)Craftsmanship Focused / Test Loving Full Stack Web Dev - Python, React, SQL (/jobs/3580/)Data Engineer (/jobs/3565/)Database Administrator (/jobs/3568/)Django Developer (/jobs/3573/)Python Backend Developer (/jobs/3584/)Python Developer (/jobs/3574/)Python Developer (/jobs/3583/)Python Developer - AI & Deep Learning Start-up (/jobs/3571/)Senior Developer - Django (/jobs/3592/)Senior Rendering Developer (/jobs/3569/)Senior Software Developer (/jobs/3577/)Senior Software Engineeer - Python Full Stack Web Service (/jobs/3591/)Senior Software Engineer (lead Python developer) (/jobs/3585/)Software Developer (/jobs/3566/)Software Engineer (/jobs/3567/)Software Engineer (/jobs/3562/)Software Engineer (/jobs/3590/)Software Engineer (m/f) - Data Platform (/jobs/3564/)Software Engineer (m/f) - Performance Marketing (/jobs/3563/)Software Engineer -- Integrations (/jobs/3581/)UI Developer (/jobs/3570/)Process finished with exit code 0
15.2 使用 CGI 创建动态网页
本节讨论基本的Web编程 技术:通用网关接口(CGI)。CGI是一种标准机制,Web服务器可通过它将(通常是通过Web表 达提供的)查询交给专用程序(如你编写的Python程序),并以网页的方式显示查询结果。这是 一种创建Web应用的简单方式,让你无需编写专用的应用程序服务器。
15.2.1 第一步:准备 Web 服务器
如果你只是想尝试使用CGI,可在Python中使用模块http.server直接运行一个临时Web服务 器。与其他模块一样,可通过向Python可执行文件提供开关-m来导入并运行这个模块。如果同时 指定了--cgi,启动的服务器将支持CGI。
在cmd中运行命令:
python -m http.server --cgi#将会出现以下语句,说明服务器运行正常。Serving HTTP on 0.0.0.0 port 8000 ...
此服务器的根目录是cmd打开时所处的目录。
15.2.2 第二步:添加!#行
将脚本放到正确的位置(还可能给它指定特定的文件扩展名)后,必须在其开头添加一个!# 行。
#!/usr/bin/env python
如果这样做不管用,就得确定Python可执行文 件的准确位置,并在!#行中使用完整的目录。
#!C:\Python37\python.exe
15.2.3 第三步:设置文件权限
通常,CGI脚本不能修改计算机上的任何文件。要让它能够修改文件,必须显式地赋予它权 限。
15.2.4 CGI 安全风险
使用CGI程序存在一些安全风险。如果你允许CGI脚本对服务器中的文件执行写入操作,那 么这可能被人利用来破坏数据——除非编写脚本时非常小心。同样,如果直接将用户提供的数据 作为Python代码(如使用exec或eval)或shell命令(如使用os.system或模块subprocess)执行, 就可能执行恶意的命令,进而面临极大的风险。即便在SQL查询中使用用户提供的字符串也很危 险,除非你预先仔细审查这些字符串。SQL注入是一种常见的攻击系统的方式。
15.2.5 简单的 CGI 脚本
最简单的CGI脚本类似于以下代码:
#!/usr/bin/env pythonprint('Content-type: text/html') print()# 打印一个空行,以结束首部print('Hello, world!')
如果将这些代码保存为文件simple1.cgi并通过Web服务器打开它,将看到一个网页,其中只 包含纯文本Hello, world!。
15.2.6 使用 cgitb 进行调试
(由于CGI我没有能够在windows下实现故略去)
15.3 使用 Web 框架
对于重要的Web应用,大多数人都不会直接为其编写CGI脚本,而是选择使用Web框架,因 为它会替你完成很多繁重的工作。这样的框架有很多,后面将提及其中的几个,但现在要将注意 力放在既简单又有用的Flask(http://flask.pocoo.org)上。使用pip很容易安装这个框架。
pip install flask
一个简单的程序:
#!/usr/bin/env python 3# -*-coding utf-8 -*-from flask import Flaskapp=Flask(__name__)@app.route('/')def hello_world():return "hello World!"if __name__== '__main__':app.run()
运行结果:
C:\Users\xx\AppData\Local\Programs\Python\Python37\python.exe E:/pythonProjects/twisted/finger.py* Serving Flask app "finger" (lazy loading)* Environment: productionWARNING: Do not use the development server in a production environment.Use a production WSGI server instead.* Debug mode: off* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)127.0.0.1 - - [17/Nov/2018 16:17:00] "GET /get-log/trace?_=1542435675262 HTTP/1.1"
要详细了解Flask框架可参阅如下网址:http://docs.jinkan.org/docs/flask/quickstart.html
其他 Web 应用框架
Django https://djangoproject.com
TurboGears http://turbogears.org
web2py http://web2py.com
Grok https://pypi.python.org/pypi/grok
Zope2 https://pypi.python.org/pypi/Zope2
Pyramid https://trypyramid.com
15.4 Web 服务:更高级的抓取
15.4.1 RSS 和相关内容
RSS指的是富网站摘要(Rich Site Summary)、RDF网站摘要(RDF Site Summary)或简易信 息聚合(Really Simple Syndication),具体指哪个取决于版本。在最简单的情况下,RSS是一种以 XML方式列出新闻的格式。
15.4.2 使用 XML-RPC 进行远程过程调用
除简单的RSS下载和解析机制外,还有远程过程调用。远程过程调用是对基本网络交互的抽 象:客户端程序请求服务器程序执行计算并返回结果,但这个过程被伪装成简单的过程(函数或 方法)调用。在客户端代码中,远程过程调用看起来就像普通方法调用,但用来调用方法的对象 实际上位于另一台计算机中。XML-RPC可能是最简单的远程过程调用机制,它使用HTTP和XML 来实现网络通信。鉴于这种协议是独立于语言的,使用一种语言编写的客户端程序可轻松地调用 使用另一种语言编写的服务器程序中的函数。 Python标准库提供了对客户端和服务器端XML-RPC编程的支持。
15.4.3 SOAP
SOAP①也是一种将XML和HTTP用作底层技术的消息交换协议。与XML-RPC一样,SOAP也 支持远程过程调用,但SOAP规范比XML-RPC规范复杂得多。SOAP是异步的,支持有关路由的 元请求,而且类型系统非常复杂(而XML-RPC使用简单而固定的类型集) 。SOAP 是微软 .net 架构的关键元素,用于未来的因特网应用程序开发 。
(待续)