python爬虫基础(二)Request库

相关内容:requests文档Python 爬虫知识清单【更】

安装使用

  1. 安装
pip install requests
  1. 测试
import requests
r = requests.get('http://www.baidu.com')
r.status_code # 打印状态码,200
r.encoding # 编码 'utf-8' 
r.text # 打印网页内容

# 发出一个requests,返回一个response
  1. 使用逻辑:发出一个request对象,得到返回的response对象

  2. 适用规模:小规模,爬取速度不敏感的任务

  3. 主要方法:request、get、head、post、put、patch、delete

1. Response对象

包含爬虫返回的全部内容

import requests
r = requests.get('http://www.baidu.com')

# r是一个requests.models.Response的类

1.1 属性

  1. r.status_code:HTTP请求的返回状态,200表示成功,404表示失败,先确定访问成功再进行后续操作或者属性的获取

  2. r.text:HTTP相应内容的字符串形式

  3. r.encoding:从HTTP header中猜测出来的相应内容编码方式

  4. r.apparent_encoding:从内容中分析出的响应内容编码方式(备选编码方式)

  5. r.content:HTTP相应内容的二进制形式,如从url链接获得图片,资源用二进制存储,就可以用content还原图片

  6. r.headers:头部信息

1.2 response的编码

encoding属性是从header的charset中分析的,并不是所有服务器对资源编码形式都有要求,如果header中不存在charset,默认编码是ISO-8859-1,但是这个编码不能够解析中文,而apparent_encoding是根据内容分析判断可能的编码形式,比encoding相对来说更加准确

2. Request方法

2.1 requests.get(url, params=None, **kwargs):获取资源

2.1.1 函数原型

requests.get(url, params=None, **kwargs)

r = requests.get(url)

  1. url:拟获取页面的url链接

  2. params:url中的额外参数,字典或者字节流格式,可选的参数

  3. **kwargs:12个控制访问的参数

2.1.2 源码

def get(url, params=None, **kwargs):
    kwargs.setdefault('allow_redirects', True)
return request('get', url, params=params, **kwargs)

实际是封装了request方法

2.2 requests.request(method, url, **kwargs):提交请求

2.2.1 函数原型

requests.request(method, url, **kwargs)
  1. method:请求方式,对应get/head/put/post/patch/delete/options等7种

  2. url:拟获取页面的连接

  3. **kwargs:13个控制方文的参数

2.2.2 控制参数

  1. params:字典或字节序列,作为参数增加到url中
kv =  {'key1': 'value1', 'key2':'key2'}
r = requests.request('GET', 'http://python123.io/ws', params=kv)
print(r.url)
# http://python123.io/ws?key1=value1&key2=value2
  1. data:字典、字节序列、文件对象,作为request的内容,在提交资源的时候使用
kv =  {'key1': 'value1', 'key2':'key2'}
r = requests.request('POST', 'http://python123.io/ws', data=kv)

kv数据会被存放在URL连接对应的位置

  1. json:JSON格式的数据,作为Request的内容

  2. headers:字典、HTTP定制头
    可以通过重新设置user-agent将请求头模拟为浏览器请求,从而获取某些被来源审查拦截的请求

hd={'user-agent':'Chrome/10'}
r = requests.request('POST', 'http://python123.io/ws', headers=hd)
  1. cookies:字典或CookieJar,Request中额cookie

  2. Auth:元组,支持HTTP认证功能

  3. files:字典类型,传输文件

fs = {'file':open('data.xls', 'rb')}
r = requests.request('POST', 'http://python123.io/ws', files=fs)
  1. timeout:s为单位,如果timeout时间内没有返回,就获得timeout异常

  2. proxies:字典类型,设定访问代理服务器,可以增加登录认证

pxs = {'http':'http://user:pass@10.10.10.1:1234', 'https':'https://10.10.10.1.4321'}
r = requests.request('GET', 'http://www.baidu.com', proxies=pxs)
  1. allow_redirects:True/False,允许重定向

  2. stream:True/False,获取内容立即下载

  3. verify:True/False,认证SSL证书

  4. cert:本地SSL证书路径

2.3 其他方法

  1. head(url, **kwargs):获取头部数据
r = requests.head(url)
r.headers
  1. post(url, data=None, json=None, **kwargs):新增数据
payload = {'key1': 'value1', 'key2':'key2'}
r = requests.post(url, data=payload)
print(r.text)
# {..."form":{"key2":"value2", "key1":"value1"},...}

当向URL中POST字典或者键值对时,数据会被存储在表单的字段下
如果提交是字符串,那么会放在data字段下

  1. put(url, data=None, **kwargs):与post一样,只是会覆盖

  2. patch(url, data=None, **kwargs):与post一样

  3. delete(url, **kwargs):删除资源

3. 通用代码框架

def getHTMLText(url):
    try:
        r = requests.get(url)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "产生异常"

3.1 Request的常用异常

  1. requests.ConnectionError:网络连接错误异常,如果DNs查询失败、拒绝连接

  2. requests.HTTPError:HTTP错误异常

  3. requests.URLRequired:URL缺失异常

  4. requests.TooManyRedirects:超过最大重定向,复杂连接会出现这样的异常

  5. requests.ConnectTimeout:连接远程服务器超时异常,连接服务器的时间超出

  6. requests.Timeout:请求URL超时,产生超时异常,从发出URL开始算

  7. r.raise_for_status():判断返回的状态码是不是200,否则产生HTTPError异常

4. HTTP 超文本传输协议

4.1 基本信息

  1. 应用层协议,请求和响应

  2. 采用URL作为定位网络资源的标识

  3. url格式:http://host[:port=80][path]

4.2 HTTP协议对资源的操作

  1. GET:请求获取URL位置的资源

  2. HEAD:请求获取URL位置资源的响应报告,即或者资源的头部信息,当获得所有资源代价过大时可以只获取头部信息

  3. POST:请求向URL位置的资源后附加新的资源

  4. PUT:请求向URL位置存储一个资源,覆盖原URL位置的资源

  5. PATCH:请求局部更新URL位置的资源,即改变该处资源的部分内容

  6. DELETE:请求删除URL位置存储的资源

PATCH和PUT的区别:PATCH只需要上传需要修改的数据,PUT需要全部上传

方法和request库的方法一样

参考资料

中国大学MOOC - python网络爬虫与信息提取

posted @ 2020-04-28 18:24  陌良  阅读(502)  评论(0编辑  收藏  举报