最近又来学习python了,可惜没有怎么将其用于工作中,只能利用空余时间来玩玩。
1、抓取简单网页
# coding=utf-8
import urllib2
response = urllib2.urlopen('http://www.pythonclub.org/python-network-application/observer-spider')
html = response.read()
print html
简写为:
# coding=utf-8
import urllib2
content = urllib2.urlopen('http://www.pythonclub.org/python-network-application/observer-spider').read()
print content
或:urllib
# coding=utf-8
import urllib
url = 'http://www.pythonclub.org/python-network-application/observer-spider'
req = urllib.urlretrieve(url,'julius.html')#保存为julius.html
运行后得到:
>>> ================================ RESTART ================================
>>>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh"
lang="zh" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="verify-v1" content="b8lZkhAZ0gBeWqZkVdAxNe+LWoK1QM1OYztpvC7Sqic=" />
<title>
用python爬虫抓站的一些技巧总结 zz [Python俱乐部]
</title>
<meta name="generator" content="DokuWiki" />
<meta name="robots" content="index,follow" />
<meta name="date" content="2011-02-11T15:31:55+0800" />
<meta name="keywords" content="python-network-application,observer-spider" />
<link rel="search" type="application/opensearchdescription+xml" href="/lib/exe/opensearch.php" title="Python俱乐部" />
。。。。。。
如果遇到
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
HTTPError: HTTP Error 403: Forbidden
则是对方网页禁止被抓取了,需要模拟浏览器抓取
import urllib2
headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
#出现urllib2.HTTPError: HTTP Error 403: Forbidden错误是由于网站禁止爬虫,在请求加上头信息,伪装成浏览器访问解决
url = 'http://blog.csdn.net/julius_lee/article/details/7682909'
req = urllib2.Request(url,headers = headers)
content = urllib2.urlopen(req).read()
print content.decode('u8')
运行后得到:
>>> ================================ RESTART ================================
>>>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>python 学习记录(2)—re 正则表达式模块的使用 - julius_lee的成长记录 - 博客频道 - CSDN.NET</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="description" content="1.1 创建与使用In [87]: import reIn [88]: re_string = {{(.*?)}}In [89]: test_string = this {{is}} a test {{string}} and {{may be}} [wrong], ok?In [90]: for match in re.findall(re_string" />
2、进行文件下载
方法一:urllib
import urllib
url = 'http://music.baidu.com/data/music/file?link=http://zhangmenshiting.baidu.com/data2/music/44799414/447992771372651261320.mp3?xcode=760fd59b6ae51718c0bb6b6933610b20a4f508beeec48fde'
urllib.urlretrieve(url,'E:\\study\\python\\tmp\\123.mp3')
抓取了百度MP3 的歌曲并保存在
E:\\study\\python\\tmp\\
命名为123.MP3
方法二:requests
# coding=utf-8
import requests
url = 'http://music.baidu.com/data/music/file?link=http://zhangmenshiting.baidu.com/data2/music/44799414/447992771372651261320.mp3?xcode=760fd59b6ae51718c0bb6b6933610b20a4f508beeec48fde'
print "downloading with requests"
r = requests.get(url)
with open("1234_requests.mp3", "wb") as code:
code.write(r.content)
方法三:urllib2
# coding=utf-8
import urllib2
url = 'http://music.baidu.com/data/music/file?link=http://zhangmenshiting.baidu.com/data2/music/44799414/447992771372651261320.mp3?xcode=760fd59b6ae51718c0bb6b6933610b20a4f508beeec48fde'
print "downloading with urllib2"
r = urllib2.urlopen(url)
data = r.read()
with open("1234_urllib2.mp3", "wb") as code:
code.write(data)
缺点是没有进度提示,需要确定程序运行完成,解决办法:
def abc(a,b,c):
'''
a: num
b: size
c: total
'''
process = 100.0*a*b/c
if process > 100:
process = 100
print '%.2f%%' %process
保存文本的方法:
content=r.read()
print "字符串长度:",len(content)
#找开一个文本文件
fp=open("163.txt","w")
#写入数据
fp.write(content)
fp.close();
或者:
with open('python.html','w') as code:
code.write(data)
问题:如何进行选择?有何区别?
可以把urllib2当作urllib的扩增,比较明显的优势是urllib2.urlopen可以接受Request对象作为参数,从而可以控制HTTP Request的header;
做HTTP Request时应当尽量使用urllib2库,但是urllib.urlretrieve函数以及urllib.quote等一系列quote和unquote功能没有被加入urllib2中,因此有时也需要urllib的辅助
1、urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL:这意味着你不可以伪装你的User Agent字符串等。
2、urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。Data同样可以通过在Get请求的URL本身上面编码来传送,urllib.urlencode(data)
urllib:比较简单,功能相对也比较弱,可以从指定的URL下载文件,或是对一些字符串进行编码解码以使他们成为特定的 URL串。
urllib2:它有各种各样的Handler啊,Processor啊可以处理更复杂的问 题,比如网络认证,使用代理服务器,使用cookie等等。
HTTP是基于请求和应答机制的--客户端提出请求,服务端提供应答。urllib2用一个Request对象来映射你提出的HTTP请求,在它最简单的使用形式中你将用你要请求的地址创建一个Request对象,通过调用urlopen并传入Request对象,将返回一个相关请求response对象,这个应答对象如同一个文件对象,所以你可以在Response中调用.read()
3、urllib 基本使用
python urllib的使用介紹
一。该模块的用途:
1。从制定的URL获取数据
2。对URL字符串进行格式化处理
二。__version__='1.17'的urllib模块中的主要函数和类介绍:
1。函数:
(1)def urlopen(url, data=None, proxies=None)
参数说明:
url 符合URL规范的字符串(包括http,ftp,gopher,local-file标准)
data 向指定的URL发送的数据字符串,GET和POST都可,但必须符合标准格式
格式为key=value&key1=value1....
proxies 代理服务器地址字典,如果未指定,在WINDOWS平台上则依据IE的设置
不支持需要验证的代理服务器
例如:proxies = {'http': 'http://www.someproxy.com:3128'}
该例子表示一个http代理服务器http://www.someproxy.com:3128
函数实现说明:
该函数使用类FancyURLopener从URLopener继承来的open方法执行具体的操作。
返回值:
返回一个类似文件对象的对象(file_like) object
该对象拥有的方法为
read()
readline()
readlines()
fileno()
close()
以上方法同file object的类似方法的使用方法基本一致
info()返回从服务器传回的MIME标签头
geturl()返回真实的URL,之所以称为真实,是因为对于某些重定向的URL,将返回被重定后的。
(2)def urlretrieve(url, filename=None, reporthook=None, data=None):
参数说明:
url 符合URL规范的字符串
filename 本地文件路径的字符串,从URL返回的数据将保存在该文件中,如果设置为None
则生成一个临时文件
reporthook 一个函数引用,自己可以任意定义该函数的行为,只需要保证函数有三个参数
urlretrieve为这个函数传递的三个参数的含义为:
第一个参数为目前为止传递的数据块数量
第二个参数为每个数据块的大小,单位为byte
第三个参数文件总的大小(某些时候可能为-1)
data 向指定的URL发送的数据字符串,GET和POST都可,但必须符合标准格式
格式为key=value&key1=value1....
函数实现说明:
该函数使用类FancyURLopener从URLopener继承来的retrieve方法执行具体的操作。
返回值:
返回一个元组 (filename, headers)
filename为参数中的 filename
headers 为从服务器传回的MIME标签头
(3)def urlcleanup():
参数说明: 无参数
函数实现说明:该函数使用类FancyURLopener从URLopener继承来的cleanup方法执行具体的操作。
清除使用urlopen或urlretrieve后产生的缓存文件
返回值: 无返回值
(4)def quote(s, safe = '/'):
参数说明:
s 需要转化的字符串
safe 需要保留不转化的字符序列
函数实现说明:
根据rfc 2396规定,URL保留字符为
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |"$" | ","
但是这些字符并不是在所有类型的URL中都保留不转化,
所以要求使用该函数的时候在转化不同的URL时设置不同的保留字符
其中在任意部分都不转化的字符为:大小写字母,数字,'_','.','-'
对于汉字,也可以使用,但要加上相应的编码,比如quote(u'蟒蛇'.encode('gb2312'))
该函数会将所有非保留的字符转化成%xx这样的形式,其中xx为两位的十六进制数
返回值:
转化后的字符串
(5)def quote_plus(s, safe = ''):
参数说明:
s 需要转化的字符串
safe 需要保留不转化的字符序列
函数实现说明:
与quote函数基本一致,只是把参数s中的空格转化成'+',而不是%20
返回值:
转化后的字符串
(6)def unquote(s):
参数说明:
s 需要反向转化的字符串
函数实现说明:
与quote作用相反的解析函数
返回值:
转化后的字符串
(7)def unquote_plus(s):
s 需要反向转化的字符串
函数实现说明:
与quote_plus作用相反的解析函数
返回值:
转化后的字符串
(8)def urlencode(query,doseq=0):
参数说明:
query 可以是一个由二元元组做元素的元组,也可以是一个字典
doseq 如何对参数字符串化
函数实现说明:
将成对的数据按照URL中的要求组成一个参数字符串
例如:
query = (('name','cs'),('age','1'),('height','2'))
re = urllib.urlencode(query)
print re
query1 = {'name':'cs','age':'1','height':'2'}
print urllib.urlencode(query1)
这两个的效果基本一样,但字典类型会自动排序,
输出结果为:
name=cs&age=1&height=2
age=1&name=cs&height=2
doseq参数的意义,文档太简短,尝试了一下,发现在如何字符串化上不同
query1 = {'name':'cs','age':('a','b'),'height':'1'}
print urllib.urlencode(query1,1)
print urllib.urlencode(query1,0)
输出结果为:
age=a&age=b&name=cs&height=1
age=%28%27a%27%2C+%27b%27%29&name=cs&height=1
返回值:
经过拚接的参数字符串
(9)def url2pathname(pathname):
参数说明:
pathname URL字符串
函数实现说明:
该函数将根据操作系统确定如何转化URL中的'/'为'\' ,
然后其他的就和quote行为一样了(就是将字符串传递给quote来处理的)
返回值:
符合本地文件路径格式的字符串
(10)def pathname2url(pathname):
参数说明:
pathname 符合本地文件路径命名的格式的字符串
函数实现说明:
该函数将根据操作系统确定如何转化URL中的'/'为'\' ,
然后其他的就和unquote行为一样了(就是将字符串传递给unquote来处理的)
返回值:
符合URL标准的字符串
(注:9,10这两个函数一般不直接用,而是在提供的以统一的方法定位网络和本地资源的接口函数中使用)
举例:
#代理服务器
# coding=utf-8
import urllib
url = 'http://www.python.org'
proxies = {'http':'http://127.0.0.1:8086/'}
r = urllib.urlopen(url, proxies=None) #选择不使用代理服务器打开
print r.info()
print r.getcode()
print r.geturl()
输出:
Date: Sun, 07 Jul 2013 02:15:06 GMT
Server: Apache/2.2.16 (Debian)
Last-Modified: Sat, 06 Jul 2013 21:01:42 GMT
ETag: "105800d-5245-4e0de1e445980"
Accept-Ranges: bytes
Content-Length: 21061
Vary: Accept-Encoding
Connection: close
Content-Type: text/html
200
http://www.python.org
# coding=utf-8
import urllib
proxies = {'http':'http://127.0.0.1:8087'}
url = 'http://www.python.org'
r = urllib.urlopen(url, proxies=proxies) #选择使用代理服务器打开
print r.info()
print r.getcode()
print r.geturl()
Content-Length: 21061
Via: HTTP/1.1 GWA #通过代理
Accept-Ranges: bytes
Vary: Accept-Encoding
Server: Apache/2.2.16 (Debian)
Last-Modified: Sat, 06 Jul 2013 21:01:42 GMT
Etag: "105800d-5245-4e0de1e445980"
Date: Sun, 07 Jul 2013 06:35:57 GMT
Content-Type: text/html
200
http://www.python.org
#打开本地文件
# coding=utf-8
import urllib
url = 'file:C:\mywork\workspace\Greetings.java'
r = urllib.urlopen(url, proxies=None)
print r.info()
print r.getcode()
print r.geturl()
print r.read()
输出:
Content-Type: text/plain
Content-Length: 258
Last-modified: Thu, 07 Jun 2012 14:50:19 GMT
None
C:%5Cmywork%5Cworkspace%5CGreetings.java
import javax.swing.*;
class Greetings{
public static void main(String[] args){
String fullName;
fullName=JOptionPane.showInputDialog(null,"What is your name?");
JOptionPane.showMessageDialog(null,"Nice to meet you,"+fullName+".");
System.exit(0);
}
}
#显示文件下载进度
import urllib
def abc(a,b,c):
'''
a: num
b: size
c: total
'''
process = 100.0*a*b/c
if process > 100:
process = 100
print '%.2f%%' %process
url = 'http://music.baidu.com/data/music/file?link=http://zhangmenshiting.baidu.com/data2/music/44054399/34182398136800320.mp3?xcode=80e3a05147cde7b2674fb0bc532f5d1a19ca7b175bf8482d'
urllib.urlretrieve(url,'E:\\study\\python\\tmp\\风吹麦浪.mp3',abc)
输出并下载文件完成:
0.00%
0.10%
0.21%
0.31%
0.41%
。。。。
100.00%
#get方法
params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
f = urllib.urlopen("http://www.musi-cal.com/cgi-bin/query?%s" % params)
print f.read()
#post方法
params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
f = urllib.urlopen("http://www.musi-cal.com/cgi-bin/query", params)
print f.read()
#uses an explicitly specified HTTP proxy
>>> import urllib
>>> proxies = {'http': 'http://proxy.example.com:8080/'}
>>> opener = urllib.FancyURLopener(proxies)
>>> f = opener.open("http://www.python.org")
>>> f.read()
#uses no proxies at all
>>> import urllib
>>> opener = urllib.FancyURLopener({})
>>> f = opener.open("http://www.python.org/")
>>> f.read()
4、urllib2 基本使用
urllib2是python的一个获取url(Uniform ResourceLocators,统一资源定址器)的模块。它用urlopen函数的形式提供了一个非常简洁的接口。这使得用各种各样的协议获取url成为可能。它同时也提供了一个稍微复杂的接口来处理常见的状况-如基本的认证,cookies,代理,等等。这些都是由叫做opener和handler的对象来处理的。
# coding=utf-8
import urllib2
url = 'http://www.python.org'
req = urllib2.Request(url)
r = urllib2.urlopen(req)
data = r.read()
print data
1、 urllib2.Request()的功能是构造一个请求信息,返回的req就是一个构造好的请求。
通过Request()还可构造一些额外的请求信息(metadata)。
2、urllib2.urlopen()的功能是发送刚刚构造好的请求req,并返回一个file类型的对象,r包括了所有的返回信息。
3、通过r.read()可以读取到r里面的代码,就是返回的页面的源代码。
# coding=utf-8
import urllib2,urllib
headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
url = 'http://blog.csdn.net/julius_lee/article/details/7682909'
values = {'name': 'Michael Froord','location':'Northampton','language':'python'}
data = urllib.urlencode(values)
req = urllib2.Request(url,data,headers = headers)
content = urllib2.urlopen(req).read()
print content.decode('u8')
通过urllib2.Request()构造一个有额外数据的请求信息。包括“http header”和想要发送的数据,这些数据需要被以标准的方式encode,然后作为一个数据参数传送给Request对象。Encoding是在urllib中完成的,而不是在urllib2中完成的
urllib2中的核心类:
Request :一个具体的url请求,包含了请求的所有信息,不仅仅试用于http协议
OpenerDirector:与BaseHandler组合,通过组合不同得handler处理不同的请求
BaseHandler :参与完成请求处理的类,不同的请求处理都继承这个类
在urllib2中,一次请求被分为三个过程,分别是request,open,response
request:目的在于构造本次请求Request对象所需得所有信息,如http协议中的header信息
open:处理具体请求的过程,封装Request对象,调用更底层的类完成请求并返回response
response:对返回的Response对象做处理
当然后有一个error处理的过程,但这个不是主动触发的。
OpenerDirector
因为每次请求的具体实现是不同的handler,而且一次请求可能由很多handler组成。所以实现这一耦合机制的类就是OpenerDirector,这个类可以注册(添加)各种不同的handler用来帮助处理一次请求。通常来说handler中的命名规则为 protocol_request|open|response,这分别对应不同协议的三个过程。
Handler
urllib2提供很多handler来处理不同的请求,常用的HTTPHandler,FTPHandler都比较好理解。这里提一下HTTPCookieProcessor和HTTPRedirectHandler
HTTPCookieProcessor是处理cookie的,在很多需要身份验证的请求中cookie是必不可少的,python中对cookie的操作是有cookielib模块来完成的,而这个handler只是调用了其方法,在request和response过程中将cookie加到请求中和把cookie从响应中解析出来。
HTTPRedirectHandler是处理30x状态的handler
Error handler
错误处理需要单独讲就是因为其特殊性,在urllib2中,处理错误的hanlder是HTTPErrorProcessor完成的
urlopen,install_opener,build_opener
这是urllib2模块的方法,在urllib2模块中存在一个全局变量保存OpenerDirector实例。
urlopen方法则是调用了OpenerDirector实例的open方法
install_opener方法把一个OpenerDirector实例做为当前的opener
最关键的是build_opener,它决定了OpenerDirector中存在哪些handler
本文来自博客园,作者:{Julius},转载请注明原文链接:https://www.cnblogs.com/bestechshare/p/16447788.html
可微信加我,了解更多,WeChat:{KingisOK}