1.requests和beautifulsoup简介:
1》requests
requests和python的标准urllib,urllib2库类似,但是python的标准库API太过繁琐,而requests则提供了更加简便和直白的API,运用感受最佳。
2》beautifulsoup
beautifulsoup具有通过html语法标签进行抓取数据的功能,他可以和第三方lxml解释器结合工作。官方解释如下:
*
Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
*
2.requests和beautifulsoup下载安装:
1》requests:
(1) Mac系统下pip或者easy_install安装
pip install requests
easy_install requests
(2) 也可以去下载源码,解压后
python setup.py install
2》beautifulsoup:
(1)Linux系统用apt-get包管理来下载
apt-get install Python-bs4
(2)Mac系统可用pip软件包管理软件来下载
pip install beautifulsoup4
(3) 也可以去这里下载源码,下载解压后
python setup.py install
接着安装lxml,根据不同的系统安装如下:
ape-get install Python-lxml
easy_install lxml
pip install lxml
3.requests用法介绍
1》requests最基本当然是发送url请求的功能,这里只介绍常用的get和post接口:
(1)get
get(url, params=None, **kwargs)
Sends a GET request.
:param url: URL for the new :class:`Request` object.
:param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
:param **kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
如上信息显示,get是requests的一个接口,**kwargs代表它的参数个数不确定(**kwargs是python语法中的特定用法,当一个函数的参数不确定时使用,**kwargs的参数类型是dictionary它和**args的作用一样,但是用法不同,具体不同看这里);url是你要访问的链接,是必要的;params是个默认参数,如果不需要重构url可不管,params经过重构后直接跟在url的后面一块发送到服务器。
实例1:尝试获取某个网页
import requests
import types #类型检查
r=requests.get('https://github.com/timeline.json')
print type(r)
请求的结果返回一个Response类型:
Out[7]: requests.models.Response
实例2:传递url参数,请求某个网页:
import requests
payload={'key1':'value1','key2':['value2','value3']}
url='http://httpbin.org/get'
r=requests.get(url,payload)
print r.url
#输出结果
http://httpbin.org/get?key2=value2&key2=value3&key1=value1
实例3:定制请求头
import requests
url = 'https://api.github.com/some/endpoint'
headers = {"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0"}
r = requests.get(url, headers=headers)
(2)post
post(url, data=None, json=None, **kwargs)
Sends a POST request.
:param url: URL for the new :class:`Request` object.
:param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
:param json: (optional) json data to send in the body of the :class:`Request`.
:param **kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
post和get的区别,看这里。
实例1:简单请求某个网页
import requests
r = requests.post("http://httpbin.org/post")
实例2:如果要发送一些表单形式的数据到服务器,就要传递data参数, data 参数是一个dictionary类型。你的数据字典在发出请求时会自动编码为表单形式
import requests
url='http://httpbin.org/post'
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post(url, data=payload)
print r.text
结果:
{
...
"form": {
"key2": "value2",
"key1": "value1"
},
...
}
实例3:post一个json
import json
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
r = requests.post(url, data=json.dumps(payload))
或者
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
r = requests.post(url, json=payload)
实例4:post一个file文件
import requests
url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
r.text
{
...
"files": {
"file": "<censored...binary...data>"
},
...
}
(3)Response
通过help(requests.Response)查出,Response是requests模块的一个类,继承于__builtin__.object
Help on class Response in module requests.models:
class Response(__builtin__.object)
| The :class:`Response <Response>` object, which contains a
| server's response to an HTTP request.
...
...
...
__builtin__是python自带的内建模块,内有许多常用的函数,详细介绍看这里
后续也可能在做详细讨论。
(1)Response的方法属性,r是requests.get返回的变量
r.ok
#判断请求是否成功,返回类型为bool类型
r.request
#返回你请求的方式,get或post
r.url
#返回你请求的最终链接
r.apparent_encoding
#返回页面的实际编码格式,它会调用chardet.detect方法自检出文本的编码
r.encoding
#通过查看源码,发现默认的编码识别比较简单,直接从响应头文件的Content-Type里获取,如果存在charset,则可以正确识别,如果不存在charset但是存在text就认为是ISO-8859-1
也可以直接指定编码格式:
r.encoding='utf-8'
#解决乱码问题
print r.text
r.cookies
#显示cookies信息
r.history
#显示r的历史信息,例如状态码
r.status_code
#响应状态码,200表示请求成功
其他状态码信息看这里
r.raise_for_status()
#失败请求(非200响应)抛出异常
r.raw
#返回原始响应体,也就是urllib的response对象,使用r.raw.read()读取
r.content
#字节方式的响应体,会自动为你解码gzip和deflate压缩,会显示文本的正确编码格式,不会出现乱码
r.text
#字符串方式的响应体,会自动根据响应头部的字符编码进行解码,和encoding方式一样
r.headers
#以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
r.json()
#Requests中内置的JSON解码器
r.iter_lines
#不清楚具体用法,从源码翻译得出当stream=true时,可避免把体积大的Response存入内容。如果有了解这个的朋友,可以联系我,求赐教。
######################未完待续###################
备注
1、官方文档
requests的中文指南文档:http://cn.python-requests.org/zh_CN/latest/user/quickstart.html#id2
2、本文内容部分翻译自官方文档,部分自己归纳。
3、有问题留言或email。本人邮件:wangchao1038@msn.com