先整理一下HTTP基础知识:
HTTP 的工作方式是客户机与服务器之间的请求-应答协议。web 浏览器可能是客户端,而计算机上的网络应用程序也可能作为服务器端。
举例:客户端(浏览器)向服务器提交 HTTP 请求;服务器向客户端返回响应。响应包含关于请求的状态信息以及可能被请求的内容。
在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST:
GET - 从指定的资源请求数据。
POST - 向指定的资源提交要被处理的数据。
一般来说,GET被认为是安全的,该操作用于获取信息而非修改信息,类似数据库查询,不会修改数据,不会影响资源的状态;而POST可以改变资源状态。
GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。
- 如果数据是英文字母/数字,原样发送,
- 如果是空格,转换为+,
- 如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
注:Python 3中encode参数的函数: parse.urlencode()
Python中以GET方式抓取数据:
from urllib import request, parse
# Base URL being accessed
url = 'http://httpbin.org/get'
# Dictionary of query parameters (if any)
parms = {
'name' : 'wang',
'age' : '/'
}
# Encode the query string
querystring = parse.urlencode(parms)
# Make a GET request and read the response
u = request.urlopen(url+'?' + querystring)
resp = u.read()
POST把提交的数据则放置在是HTTP包的包体中。
Python中以POST方式抓取数据:
from urllib import request, parse
...
u = request.urlopen(url, querystring.encode('ascii'))
除了urllib
,也可以用request
达到相同目的,而且更强大,比如加上请求头:
import requests
...
# Extra headers
headers = { 'User-agent' : 'none/ofyourbusiness', 'Spam' : 'Eggs'}
resp = requests.post(url, data=parms, headers=headers)
# Decoded text returned by the request
text = resp.text
Extract请求头信息:
import requests
resp = requests.head('http://www.python.org/index.html')
status = resp.status_code
last_modified = resp.headers['last-modified']
content_type = resp.headers['content-type']
content_length = resp.headers['content-length']
实现登录:
import requests
resp = requests.get('http://pypi.python.org/pypi?:action=login',
auth=('user','password'))
Pass cookies
import requests
# First request
resp1 = requests.get(url)
# Second requests with cookies received on first requests
resp2 = requests.get(url, cookies=resp1.cookies)
用POST上传资源
import requests
url = 'http://httpbin.org/post'
files = { 'file': ('data.csv', open('data.csv', 'rb')) }
r = requests.post(url, files=files)
参考资料:《Python Cookbook》
网友评论