python基础教程(第三版)学习笔记(十五)

第十五章 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 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

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 python
  print('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 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

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 架构的关键元素,用于未来的因特网应用程序开发 。

 

(待续)

猜你喜欢

转载自blog.csdn.net/micorjun/article/details/84196521
0条评论
添加一条新回复