Python urllib模块与urlopen()函数解析

来源:互联网 发布:人工智能处理器 编辑:程序博客网 时间:2024/05/19 04:04

Python urllib 库提供了一个从指定的 URL 地址获取网页数据,然后对其进行分析处理,获取想要的数据。

下面是在 Python Shell 里的 urllib 的使用情况:

Python 2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import urllib
>>> google = urllib.urlopen('http://www.google.com')
>>> print 'http header:\n',google.info()
http header:
Date: Wed, 30 Oct 2013 03:11:44 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=Big5
Set-Cookie: PREF=ID=7ee0cbd58be6fb74:FF=0:NW=1:TM=1383102704:LM=1383102704:S=w6DoLuUBc7KUOE69; expires=Fri, 30-Oct-2015 03:11:44 GMT; path=/; domain=.google.com.hk
Set-Cookie: NID=67=cNyh4vZeoDJFnSe12viwoMNh47Hjq98F72I6TTNZGBuJx78aRgQbAA-RtGNFFpARCaN3zJ6OYIpJASB3Q7cmfyRguFh6epcBOSL930KEfIxUa-85e946hE97WfP0lgk7; expires=Thu, 01-May-2014 03:11:44 GMT; path=/; domain=.google.com.hk; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Alternate-Protocol: 80:quic

>>> print 'http status:',google.getcode()
http status: 200
>>> print 'url:',google.geturl()
url: http://www.google.com.hk/
>>>

上面主要用到了 urllib 库里的 urlopen() 函数。我们可以了解一下这个函数。

继续使用 Python Shell:

>>> help(urllib.urlopen)
Help on function urlopen in module urllib:

urlopen(url, data=None, proxies=None)
    Create a file-like object for the specified URL to read from.

即创建一个类文件对象为指定的 url 来读取。

详细点就是,创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据。参数url表示远程数据的路径,一般是网址;参数data表示以post方式提交到url的数据(玩过web的人应该知道提交数据的两种方式:post与get。如果你不清楚,也不必太在意,一般情况下很少用到这个参数);参数proxies用于设置代理(这里不详细讲怎么使用代理,感兴趣的看客可以去翻阅Python手册urllib模块)。 urlopen返回 一个类文件对象,他提供了如下方法:

  • 参数 url 表示远程数据的路径,一般是 http 或者 ftp 路径。
  • 参数 data 表示以 get 或者 post 方式提交到 url 的数据。
  • 参数 proxies 表示用于代理的设置。
  • urlopen 返回一个类文件对象,它提供了如下方法:
  • read() , readline() , readlines(),fileno()和close(): 这些方法的使用与文件对象完全一样。
  • info():返回一个httplib.HTTPMessage 对象,表示远程服务器返回的头信息。
  • getcode():返回Http状态码,如果是http请求,200表示请求成功完成;404表示网址未找到。
  • geturl():返回请求的url地址。

再看一个例子,这个例子把Google首页的html抓取下来并显示在控制台上:

# 别惊讶,整个程序确实只用了两行代码 import urllib print urllib.urlopen('http://www.google.com').read()再运行一下这个例子,以加深对urllib的印象:google = urllib.urlopen('http://www.google.com')  print 'http header:/n', google.info()  print 'http status:', google.getcode()  print 'url:', google.geturl()  for line in google: # 就像在操作本地文件      print line,  google.close() 

F.read([size]) #size为读取的长度,以byte为单位 F.readline([size]) #读一行,如果定义了size,有可能返回的只是一行的一部分 F.readlines([size]) #把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。 F.write(str) #把str写到文件中,write()并不会在str后加上一个换行符 F.writelines(seq) #把seq的内容全部写到文件中。这个函数也只是忠实地写入,不会在每行后面加上任何东西。 file的其他方法:

f=open('/tmp/workfile', 'w')print f

读文件实例二

myfile = open('myfile', 'r')             # open for input

print myfile.readline()                        # read the line back

print myfile.readline()                        # empty string: end of file

myfile.close()

读文本文件input = open('data', 'r')#第二个参数默认为rinput = open('data')  

 

读固定字节file_object = open('abinfile', 'rb')try:    while True:         chunk = file_object.read(100)        if not chunk:            break         do_something_with(chunk)finally:     file_object.close( ) 

 

读每行list_of_all_the_lines = file_object.readlines( )如果文件是文本文件,还可以直接遍历文件对象获取每行:

for line in file_object:     process line

 

向文件中保存内容

myfile = open('myfile', 'w')             # open for output (creates)

myfile.write('hello text filen')        # write a line of text

myfile.close()

其它

写文本文件output = open('data', 'w') 写二进制文件output = open('data', 'wb') 

追加写文件

output = open('data', 'w+') 

 

写数据file_object = open('thefile.txt', 'w')file_object.write(all_the_text)file_object.close( ) 

写入多行file_object.writelines(list_of_text_strings)

F.close() #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。如果一个文件在关闭后还对其进行操作会产生ValueError F.flush() #把缓冲区的内容写入硬盘 F.fileno() #返回一个长整型的”文件标签“ F.isatty() #文件是否是一个终端设备文件(unix系统中的) F.tell() #返回文件操作标记的当前位置,以文件的开头为原点 F.next() #返回下一行,并将文件操作标记位移到下一行。把一个file用于for ... in file这样的语句时,就是调用next()函数来实现遍历的。 F.seek(offset[,whence]) #将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。 F.truncate([size])

 
0 0