http://hankjin.blog.163.com/blog/static/3373193720105140583594/
http://blog.csdn.net/wklken/article/details/7364328
http://blog.csdn.net/pleasecallmewhy/article/details/8923067
使用Python访问网页主要有三种方式: urllib, urllib2, httplib:
urllib比较简单,功能相对也比较弱,httplib简单强大,但好像不支持session
urllib http://docs.python.org/library/urllib.html
urllib2 http://docs.python.org/library/urllib2.html
httplib http://docs.python.org/library/httplib.html
1. 最简单的页面访问
1 import urllib2
2 url='http://www.baidu.com/'
3 res=urllib2.urlopen(url)
4 page=res.read()
5 print page
这个半天显示不了结果~~
urllib2,urlopen()函数
urllib2.urlopen(url[, data[, proxies]]) :
url: 表示远程数据的路径
data: 以post方式提交到url的数据
proxies:用于设置代理
urlopen返回对象提供方法:
- read() , readline() ,readlines() , fileno() , close() :这些方法的使用方式与文件对象完全一样
- info():返回一个httplib.HTTPMessage对象,表示远程服务器返回的头信息
- getcode():返回Http状态码。如果是http请求,200请求成功完成;404网址未找到
- geturl():返回请求的url
2. 加上要get或post的数据
http://www.w3school.com.cn/tags/html_ref_httpmethods.asp
两种 HTTP 请求方法:GET 和 POST
在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。
- GET - 从指定的资源请求数据。
- POST - 向指定的资源提交要被处理的数据
-
GET 方法
请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:
/test/demo_form.asp?name1=value1&name2=value2
-
POST 方法
请注意,查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:
POST /test/demo_form.asp HTTP/1.1 Host: w3schools.com name1=value1&name2=value2
post是以Requst对象的形式发出的,get是以字符串的形式发出的
1. get是从服务器上获取数据,post是向服务器传送数据。
2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
建议:
1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;
POST方式:
1 import urllib2
2 import urllib
3 url='http://www.baidu.com/'
4 data=urllib.urlencode({'name':'jon',
5 'location':'www',
6 'language':'py'})#data-HTML编码标准形式
7 req=urllib2.Request (url,data)
8 print req #<urllib2.Request instance at 0x02B85170>(url,data)的Request对象
9 res=urllib2.urlopen(req)#也可以直接res=urllib2.urlopen(url,data)
10 print res.read()
GET方式:
如果没有传送data参数,urllib2使用GET方式的请求。
1 import urllib2
2 import urllib
3 url='http://www.baidu.com/'
4 url_values=urllib.urlencode({'name':'jon',
5 'location':'www',
6 'language':'py'})#data-HTML编码标准形式
7 print url_values
8 #name=jon&language=py&location=www
9 full_url=url+'?'+url_values
10 res=urllib2.urlopen(full_url)
11 print res.read()
结果也和1一样
3. 加上http头
有一些站点不喜欢被程序(非人为访问)访问,或者发送不同版本的内容到不同的浏览器。
默认的urllib2把自己作为“Python-urllib/x.y”(x和y是Python主版本和次版本号,例如Python-urllib/2.7),
这个身份可能会让站点迷惑,或者干脆不工作。
浏览器确认自己身份是通过User-Agent头,当你创建了一个请求对象,你可以给他一个包含头数据的字典。
headers={"User-Agent": 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'#模拟电脑访问,比如糗百网页就必须有这个头
'Referer': url}
data={...}#这个一般是需要登录访问的页面,用httpfox抓取发送的POST内容
req = urllib2.Request(url, urllib.urlencode(data), headers=headers)
#hearder也可以这样添加: req.add_header('User-Agent')
response = urllib2.urlopen(req)
最好是转化为Request对象
4 异常检查
得到 HTTP 的返回码
对于 200 OK 来说,只要使用 urlopen 返回的 response 对象的 getcode() 方法就可以得到 HTTP 的返回码。但对其它返回码来说,urlopen 会抛出异常。这时候,就要检查异常对象的 code 属性了。HTTP ,返回200正常,404错误
不过通常的Python APIs异常如ValueError,TypeError等也会同时产生。
HTTPError是urlError的子类,通常在特定HTTP URLs中产生。
except urllib2.HTTPError,e:print e.code
except urllib2.URLError,e:print e.reason
5