本章讨论Python Web编程的一些方面 了其中三个重要的主题:屏幕抓取、CGI和mod_python。 另外还给出了一些指南。
下面讨论两种抓取网站信息可能的解决方案。一是结合使用 程序Tidy(一个Python库)和XHTML解析;二是使用专为屏幕抓取而设计的Beautiful Soup库。
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的支持,暂时略去)
Beautiful Soup是一个小巧而出色的模块,用于解析你在Web上可能遇到的不严谨且格式糟糕 的HTML。Beautiful Soup网站(http://crummy.com/software/BeautifulSoup)称: 那个糟糕的网页并非出自你的手笔。你只是想从中提取一些数据。Beautiful Soup 将向你伸出援手。
安装:
pip install beautifulsoup4
使用Beautiful Soup的屏幕抓取程序 :
from urllib.request import urlopen
from bs4 import BeautifulSoup
text = 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.py
Backend 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
本节讨论基本的Web编程 技术:通用网关接口(CGI)。CGI是一种标准机制,Web服务器可通过它将(通常是通过Web表 达提供的)查询交给专用程序(如你编写的Python程序),并以网页的方式显示查询结果。这是 一种创建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打开时所处的目录。
将脚本放到正确的位置(还可能给它指定特定的文件扩展名)后,必须在其开头添加一个!# 行。
#!/usr/bin/env python
如果这样做不管用,就得确定Python可执行文 件的准确位置,并在!#行中使用完整的目录。
#!C:\Python37\python.exe
通常,CGI脚本不能修改计算机上的任何文件。要让它能够修改文件,必须显式地赋予它权 限。
使用CGI程序存在一些安全风险。如果你允许CGI脚本对服务器中的文件执行写入操作,那 么这可能被人利用来破坏数据——除非编写脚本时非常小心。同样,如果直接将用户提供的数据 作为Python代码(如使用exec或eval)或shell命令(如使用os.system或模块subprocess)执行, 就可能执行恶意的命令,进而面临极大的风险。即便在SQL查询中使用用户提供的字符串也很危 险,除非你预先仔细审查这些字符串。SQL注入是一种常见的攻击系统的方式。
最简单的CGI脚本类似于以下代码:
#!/usr/bin/env python
print('Content-type: text/html')
print()# 打印一个空行,以结束首部
print('Hello, world!')
如果将这些代码保存为文件simple1.cgi并通过Web服务器打开它,将看到一个网页,其中只 包含纯文本Hello, world!。
(由于CGI我没有能够在windows下实现故略去)
对于重要的Web应用,大多数人都不会直接为其编写CGI脚本,而是选择使用Web框架,因 为它会替你完成很多繁重的工作。这样的框架有很多,后面将提及其中的几个,但现在要将注意 力放在既简单又有用的Flask(http://flask.pocoo.org)上。使用pip很容易安装这个框架。
pip install flask
一个简单的程序:
#!/usr/bin/env python 3
# -*-coding utf-8 -*-
from flask import Flask
app=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: production
WARNING: 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
RSS指的是富网站摘要(Rich Site Summary)、RDF网站摘要(RDF Site Summary)或简易信 息聚合(Really Simple Syndication),具体指哪个取决于版本。在最简单的情况下,RSS是一种以 XML方式列出新闻的格式。
除简单的RSS下载和解析机制外,还有远程过程调用。远程过程调用是对基本网络交互的抽 象:客户端程序请求服务器程序执行计算并返回结果,但这个过程被伪装成简单的过程(函数或 方法)调用。在客户端代码中,远程过程调用看起来就像普通方法调用,但用来调用方法的对象 实际上位于另一台计算机中。XML-RPC可能是最简单的远程过程调用机制,它使用HTTP和XML 来实现网络通信。鉴于这种协议是独立于语言的,使用一种语言编写的客户端程序可轻松地调用 使用另一种语言编写的服务器程序中的函数。 Python标准库提供了对客户端和服务器端XML-RPC编程的支持。
SOAP①也是一种将XML和HTTP用作底层技术的消息交换协议。与XML-RPC一样,SOAP也 支持远程过程调用,但SOAP规范比XML-RPC规范复杂得多。SOAP是异步的,支持有关路由的 元请求,而且类型系统非常复杂(而XML-RPC使用简单而固定的类型集) 。SOAP 是微软 .net 架构的关键元素,用于未来的因特网应用程序开发 。
(待续)