web应用也遵循客户服务器架构

浏览器就是一个基本的web客户端,她实现两个基本功能,一个是从web服务器下载文件,另一个是渲染文件

同浏览器具有类似功能以实现简单的web客户端的模块式urllib以及urllib2(可以打开需要登录的网页)等模块

另外还有一些负载的web客户端,它不仅下载web文件,还执行其它复杂的任务,一个典型的例子就是爬虫

python实现爬虫也有一些框架模块:如Scrapy

使用python创建一个简单web客户端
你要弄清楚浏览器只是web客户端的一种,而且功能有限,任何通过web的请求的应用程序都是web客户端
比如curl以及python的urllib
为什么是urllib呢而不是httplib呢?往下阅读
什么是URL???构成很重要
URL用来在Web 上定位一个文档,或者调用一个CGI 程序来为你的客户端产生一个文档。
CGI产生文档就是像一些web框架吧,特别是python的
web客户端其实也算是文件传输,最为直接方式就是直接使用url来定位和获得文件了,其实大部分客户端都是靠这个
所以应该首先了解一下url的构成
 
python的URL模块介绍:urllib及urlparse
Python 支持两种不同的模块,分别以不同的功能和兼容性来处理URL。一种是urlparse,一种
是urllib。
其中urlparse就是用来进行url解析与合成的。利用它你也可以学习url的构成哦,关于它的用法你可以help一下
urllib是一个高层次的模块,urllib 模块提供了所有你需要的功能,除非你计划写一个更加低层的网络客户端。urllib 提供
了了一个高级的Web 交流库,支持Web 协议,HTTP, FTP 和Gopher 协议,同时也支持对本地文件的
访问。urllib 模块的特殊功能是利用上述协议下载数据(从因特网、局域网、主机上下载)。使用这
个模块可以避免使用httplib, ftplib 和gopherlib 这些模块,除非你想用更低层的功能
urllib的主要功能就是从url来下载文件,想要了解这个模块的功能可以从下面几个函数入手
urlopen()
urllib.urlretrieve()
urllib.quote() and urllib.quote_plus()
urllib.unquote() 和 urllib.unquote_plus()
urllib.urlencode()
 
urllib2
如果你打算访问更加复杂的URL 或者想要处理更复杂的情况如基于数字的权限验证,重定位,
coockie 等问题,我们建议你使用urllib2 模块
这对于登陆来抓取数据是特别有用的
urllib3 
urllib2的升级版

该模块建立在urllib3上面的,提供了比较友好的借口,尽量使用它,以减少代码量

参考:http://blog.csdn.net/iloveyin/article/details/21444613

wget和python绑定

wget是一个linux命令行工具,专注下载功能,有关下载任务合适使用它的python绑定

curl和pycurl

curl是一个基础的,先进的命令行工具(提供的功能类似于Request),也提供了各种语言的绑定

参考:http://www.ruanyifeng.com/blog/2011/09/curl.html
http://man.linuxde.net/curl
 
高级web客户端
 
浏览器实现的其实是一个简单的web客户端,基本的web客户端从服务器下载文件,urllib以及urllib2以及上面介绍的这些模块就是实现类似的功能
那么高级的web客户端就不只是下载那么简单
高级Web 客户端的一个例子就是网络爬虫(aka 蜘蛛和机器人)。这些程序可以基于不同目的在
因特网上探索和下载页面,其中包括:
  1. 为 Google 和Yahoo 这类大型的搜索引擎建索引
  2. 脱机浏览—将文档下载到本地,重新设定超链接,为本地浏览器创建镜像。(这个需求就是通常所说的下载整个在线的帮助文档)
  3. 下载并保存历史记录或框架
  4. Web 页的缓存,节省再次访问Web 站点的下载时间。
这里给出一个爬虫的实现
 #!/usr/bin/env python

 from sys import argv
from os import makedirs, unlink, sep
from os.path import isdir, exists, dirname, splitext
from string import replace, find, lower
from htmllib import HTMLParser
from urllib import urlretrieve
from urlparse import urlparse, urljoin
from formatter import DumbWriter, AbstractFormatter
from cStringIO import StringIO class Retriever(object): # download Web pages def __init__(self, url):
self.url = url
self.file = self.filename(url) def filename(self, url, deffile='index.htm'):
parsedurl = urlparse(url, 'http:', 0) # parse path
path = parsedurl[1] + parsedurl[2]
ext = splitext(path)
if ext[1] == '':
if path[-1] == '/':
path += deffile
else:
path += '/' + deffile
ldir = dirname(path) # local directory
if sep != '/': # os-indep. path separator
ldir = replace(ldir, ',', sep)
if not isdir(ldir): # create archive dir if nec.
if exists(ldir): unlink(ldir)
makedirs(ldir)
return path def download(self): # download Web page
try:
retval = urllib.urlretrieve(self.url, self.file)
except IOError:
retval = ('*** ERROR: invalid URL "%s"' % \
self.url, )
return retval def parseAndGetLinks(self): # pars HTML, save links
self.parser = HTMLParser(AbstractFormatter( \
DumbWriter(StringIO())))
self.parser.feed(open(self.file).read())
self.parser.close()
return self.parse.anchorlist class Crawler(object): # manage entire crawling process count = 0 # static downloaded page counter def __init__(self, url):
self.q = [url]
self.seen = []
self.dom = urlparse(url)[1] def getPage(self, url):
r = Retriever(url)
retval = r.download()
if retval[0] == '*': # error situation, do not parse
print retval, '... skipping parse'
return
Crawler.count = Crawler.count + 1
print '\n(', Crawler.count, ')'
print 'URL:', url
print 'FILE:', retval[0]
self.seen.append(url) links = r.parseAndGetLinks() # get and process links
for eachLink in links:
if eachLink[:4] != 'http' and \
find(eachLink, '://') == -1:
eachLink = urljoin(url, eachLink)
print '* ', eachLink, if find(lower(eachLink), 'mailto:') != -1:
print '... discarded, mailto link'
continue if eachLink not in self.seen:
if find(eachLink, self.dom) == -1:
print '... discarded, not in domain'
else:
if eachLink not in self.q:
self.q.append(eachLink)
print '... new, added to Q'
else:
print '... discarded, already in Q'
else:
print '... discarded, already processed' def go(self): # process links in queue
while self.q:
url = self.q.pop()
self.getPage(url) def main():
if len(argv) > 1:
url = argv[1]
else:
try:
url = raw_input('Enter starting URL: ')
except (KeyboardInterrupt, EOFError):
url = '' if not url: return
robot = Crawler(url)
robot.go() if __name__ == '__main__':
main()
实际上这里也有一些爬虫的库,不多介绍

python web编程-web客户端编程的更多相关文章

  1. python web编程-CGI帮助web服务器处理客户端编程

    这几篇博客均来自python核心编程 如果你有任何疑问,欢迎联系我或者仔细查看这本书的地20章 另外推荐下这本书,希望对学习python的同学有所帮助 概念预热 eb客户端通过url请求web服务器里 ...

  2. day03-hdfs的客户端操作\hdfs的java客户端编程

    5.hdfs的客户端操作 客户端的理解 hdfs的客户端有多种形式: 1.网页形式 2.命令行形式 3.客户端在哪里运行,没有约束,只要运行客户端的机器能够跟hdfs集群联网 文件的切块大小和存储的副 ...

  3. Unity3D 客户端编程

    Photon Server 和 Unity3D 数据交互: Photon Server 服务端编程 Unity3D 客户端编程. VS2017 之 MYSQL实体数据模 1:打开unity新建新项目, ...

  4. Python 四大主流 Web 编程框架

    Python 四大主流 Web 编程框架 目前Python的网络编程框架已经多达几十个,逐个学习它们显然不现实.但这些框架在系统架构和运行环境中有很多共通之处,本文带领读者学习基于Python网络框架 ...

  5. [Real World Haskell翻译]第22章 扩展示例:Web客户端编程

    第22章 扩展示例:Web客户端编程 至此,您已经看到了如何与数据库交互,解析一些数据,以及处理错误.现在让我们更进了一步,引入Web客户端库的组合. 在本章,我们将开发一个真正的应用程序:一个播客下 ...

  6. Web Worker javascript多线程编程(一)

    什么是Web Worker? web worker 是运行在后台的 JavaScript,不占用浏览器自身线程,独立于其他脚本,可以提高应用的总体性能,并且提升用户体验. 一般来说Javascript ...

  7. Web Worker javascript多线程编程(二)

    Web Worker javascript多线程编程(一)中提到有两种Web Worker:专用线程dedicated web worker,以及共享线程shared web worker.不过主要讲 ...

  8. Atitit.web三大编程模型 Web Page Web Forms 和 MVC

    Atitit.web三大编程模型 Web Page    Web Forms 和 MVC 1. 编程模型是 Web Forms 和 MVC (Model, View, Controller). 2.  ...

  9. WEB前端研发工程师编程能力成长之路(1)(转)

    WEB前端研发工程师编程能力成长之路(1)   [背景] 如果你是刚进入WEB前端研发领域,想试试这潭水有多深,看这篇文章吧: 如果你是做了两三年WEB产品前端研发,迷茫找不着提高之路,看这篇文章吧: ...

  10. Atitit.web三编程模型 Web Page Web Forms 和 MVC

    Atitit.web三编程模型 Web Page    Web Forms 和 MVC 1. 编程模型是 Web Forms 和 MVC (Model, View, Controller). 2. W ...

随机推荐

  1. Javascript之setTimeout

    参考:http://codethoughts.info/javascript/2015/07/06/javascript-callbacks/

  2. nginx server中的server_name配置的域名在客户机上无法访问

    nginx配置如下: nginx.conf: #user nobody; worker_processes 2; #error_log logs/error.log; #error_log logs/ ...

  3. UESTC 250

    windy数 基本的数位DP,需要判断当前位是否为起始位. #include <cstdio> #include <cmath> #include <cstring> ...

  4. locustio压力测试

    2015年7月17日 22:19:17 星期五 这里记录下学习道路, 防止忘了 操作系统是centos: 首先是linux系统, 装有Python 和 Python-devel (否则安装软件会提示p ...

  5. Python自动化运维工具fabric的安装

    使用shell命令进行复杂的运维时,代码往往变得复杂难懂,而使用python脚本语言来编写运维程序,就相当于开发普通的应用一样,所以维护和扩展都比较简单,更重要的是python运维工具fabric能自 ...

  6. 20. javacript高级程序设计-JSON

    1. JSON JSON是一种数据格式,存在以下三种类型的值: l 简单值:使用与JavaScript相同的语法,可以在JSON中表示字符串.数值.布尔值和null,不支持 undefined,例如: ...

  7. SAP系统更改小数点显示问题

    在SAP系统中会出现小数点显示的问题,比如123.12,正常情况下是这样显示,但SAP系统是德国的出的系统,德国的书写数字的习惯是将小数点“.”写成“,”逗号,显示为:123,12 这个问题可以使用事 ...

  8. 加载ComboBox控件

    /// <summary> /// 加载公司 /// </summary> /// <param name="cbbCompany">Combo ...

  9. 【XLL API 函数】xlUDF

    调用用户定义函数,这个函数允许DLL 调用 VBA 中的用户定义函数,XLM 宏语言函数,以及在其它 add-ins 中注册的函数. 原型 Excel12(xlUDF, LPXLOPER12 pxRe ...

  10. 第三章 C#循环与方法

    第一节1-For循环入门 语法: for(条件表达式) { 执行语句 } 练习: 第三章作业1.写一个程序打印100到200的值;2.写一个程序从10打印到1:3.写一个程序打印10到30之间的所有偶 ...