Bootstrap

Python网络爬虫(一)——Request入门

1. 安装requests库

在电脑主界面Windows+R,然后输入“cmd”进入命令行窗口

输入 pip install requests

即可下载。

2. 测试

启动idle测试

#以百度为例
>>> import requests

>>> r = requests.get("http://www.baidu.com") 

#状态码为200,表示访问成功

>>> r.status_code   

200

>>> r.encoding = 'utf-8'

#打印网页内容

>>> r.text  

3. 爬取网页的通用代码框架

网络连接有风险,异常处理很重要

import requests
def getHTMLText(url):
    try:
        r = requests.get(url,timeout=30)
        r.raise_for_status()  #如果不是200,产生异常requests.HTTPError
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "产生异常"

if __name__ == "__main__":
    url = "http://www.baidu.com"
    print(getHTMLText(url))

 

4. requests库的7个主要的方法

requests.request()构造一个请求,支撑一下各方法的基本方法
requests.get()获取HTML网页的主要方法,对应于HTTP的GET
requests.head()获取HTML网页头信息的方法,对应于HTTP的HEAD
requests.post()向HTML网页提交POST请求的方法,对应于HTTP的POST
requests.put()向HTML网页提交PUT请求的方法,对应于HTTP的PUT
requests.patch()向HTML网页提交局部修改请求,对应于HTTP的PATCT
requests.delete()向HTML网页提交删除请求,对应于HTTP的DELETE

4.1 requests库的get()方法

r=requests.get(url)

包括两个重要的对象:

构造一个向服务器请求资源的Request对象;返回一个包含服务器资源的Response对象

属性

r.status_codeHTTP请求的返回状态,200表示连接成功,404表示失败
r.textHTTP响应内容的字符串形式,即,url对应的页面内容
r.encoding

从HTTP header中猜测的响应内容编码方式(如果header中不存在charset,则认为编码为ISO-8859-1)

r.apparent_encoding从内容中分析的响应内容编码方式(备选编码方式)
r.contentHTTP响应内容的二进制形式

Requests库的异常

requests.ConnectionError网络连接错误异常,如DNS查询失败、拒绝连接等
requests.HTTPErrorHTTP错误异常
requests.URLRequiredURL缺失异常
requests.TooManyRedirects超过最大重定向次数,产生重定向异常
requests.ConnectTimeout连接远程服务器超时异常
requests.Timeout请求URL超时,产生超时异常

Requests库的判别异常方法

r.raise_for_status()

如果不是200,产生异常requests.HTTPError异常

基本格式

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

url:拟获取页面的url链接

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

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

4.2 Requests库的head()方法

用很少的网络流量获取概要信息

>>> r = requests.head('http://www.baidu.com')

>>> r.headers

{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Thu, 04 Apr 2019 08:55:34 GMT', 'Last-Modified': 'Mon, 13 Jun 2016 02:50:26 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Connection': 'close'}

>>> r.text

' '

4.3 Requests库的post()方法

向URL POST一个字典自动编码为form(表单)

#键值对

>>> payload = {'key1': 'value1', 'key2': 'value2'}

>>> r = requests.post('http://www.baidu.com', data = payload)

>>>print( r.text)

{

...

''form'': {

''key2'': ''values2'',

''key1'': ''values1''

},

}

向URL POST一个字符串自动编码为data

>>> r = requests.post('http://www.baidu.com', data = 'ABC')

>>>print( r.text)

{

...

''data'': ''ABC'',

''form'': {},

}

4.4 Requests库的put()方法

与post()方法类似,只是将原有的方法覆盖掉

5. 7个方法的主要功能

5.1 requests.request(method, url, **kwargs)

5.1.1 method:请求方式,对应get/put/post等7种

r = requests.request(‘Get’, url, **kwargs)

r = requests.request(‘Head’, url, **kwargs)

r = requests.request(‘POST’, url, **kwargs)

r = requests.request(‘PUT’, url, **kwargs)

r = requests.request(‘PATCH’, url, **kwargs)

r = requests.request(‘delete’, url, **kwargs)

r = requests.request(‘OPTIONS’,  url, **kwargs)

5.1.2 url:拟获取页面的url链接

5.1.3 **kwargs:13个控制访问的参数,均为可选项

(1)params:字典或者字节序列,作为参数增加到url中

>>> kv = {'key1': 'value1', 'key2': 'value2'}

>>> r = requests.request('GET', 'http://python123.io/ws', params = kv)

>>> print(r.url)

https://python123.io/ws?key1=value1&key2=value2

(2)data:字典或者字节序列或者文件对象,作为Request的内容

>>> kv = {'key1': 'value1', 'key2': 'value2'}

>>> r = requests.request('POST', 'http://python123.io/ws', data = kv)

>>> body = '主体内容'

>>> r = requests.request('POST', 'http://python123.io/ws', data = body)

(3)json:JSON格式的数据,作为Request的内容

(4)headers:字典,HTTP定制头

>>> hd = {'user-agent': 'Chrome/10'}

>>> r = requests.request('POST', 'http://python123.io/ws', header = hd)

(5)cookies:字典或CookieJar,Request中的cookie

(6)auth:元祖,支持HTTP认证功能

(7)files:字典类型,传输文件

>>> fs = {'file': open('data.xls', 'rb')}

>>> r = requests.request('POST', 'http://python123.io/ws', files = fs)

(8)timeout:设定超时时间,秒为单位

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

访问百度时,所使用IP地址为代理服务器的IP地址,有效地防止爬取的逆追踪

>>> pxs = { 'http': 'http://user:[email protected]:1234',

... 'https':'https://10.10.10.1:4321' }

>>> r = requests.request('GET', 'http://www.baidu.com', proxies = pxs)

(10)allow_redirects:True/False,默认为True,重定向开关

(11)stream:True/False,默认为True,获取内容立即下载开关

(12)verify:True/False,默认为True,认证SSL证书开关

(13)cert:本地SSL证书路径

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

url:拟获取页面的url链接

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

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

5.3 requests.head(url, **kwargs)

url:拟获取页面的url链接

**kwargs:13个控制访问的参数

5.4 requests.post(url,data=None, json=None, **kwargs)

url:拟获取页面的url链接

data:字典、字节序列或者文件,Request的内容

**kwargs:11个控制访问的参数

5.5 requests.put(url, data=None, **kwargs)

url:拟获取页面的url链接

data:字典、字节序列或者文件,Request的内容

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

5.6 requests.patch(url, data=None, **kwargs)

url:拟获取页面的url链接

data:字典、字节序列或者文件,Request的内容

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

5.7 requests.delete(url, **kwargs)

url:拟删除页面的url链接

**kwargs:13个控制访问的参数

 

 

;