requests和BeautifulSoup组合爬虫技术

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值