第一章 网络爬虫之规则
一、Requests库入门
- request库:http://www.python-requests.org
- 安装方法:pip install requests
- 抓取百度
import requests
r=requests.get("http://www.baidu.com")
r.status_code
r.encoding='utf-8'
r.text
- requests库的7个主要方法
方法 |
说明 |
requests.request() |
构造一个请求,支撑以下各方法的基础方法 |
requests.get() |
获取HTML网页的主要方法,对应于HTTP的GET |
requests.head |
获取网页头信息的方法,对应于HTTP的HEAD |
requests.post() |
向HTML网页提交POST请求的方法,对应于HTTP的POST |
requests.put() |
向HTML网页提交PUT请求的方法,对应于HTTP的PUT |
requests.patch |
向HTML网页提交局部修改请求,对应于HTTP的PATCH |
requests.delete |
向HTML页面提交删除请求,对应于HTTP的DELETE |
requests库的get()方法
- 获取网页最简单的方法:r=requests.get(url)
- 构造一个向服务器请求资源的Request对象
- 返回一个包含服务器资源的Response对象
- 形式
requests.get(url,params=None,**kwargs)
- url:拟获取页面的url链接
- params:url中的额外参数,字典或字节流格式,可选
- kwargs:12个控制访问的参数
- Response对象:包含爬虫返回的内容
属性 |
说明 |
r.status_code |
HTTP请求的返回状态,200表示连接成功,404表示失败 |
r.text |
HTTP响应内容的字符串形式,即,url对应的页面内容 |
r.encoding |
从HTTP header中猜测的响应内容编码方式 |
r.apparent_encoding |
从内容中分析出的响应内容编码方式(备选编码方式) |
r.content |
HTTP响应内容的二进制形式 |
- 基本流程
graph TD
A(r.status_code)-->|200| B(r.text,r.encoding,r.apparent_encoding,r.content)
A-->|404或其他| C(某些原因出错将产生异常)
- 理解Response的编码
- r.encoding:如果header中不存在charset,则认为编码为ISO-8859-1
- r.apparent_encoding:根据网页内容分析出的编码方式
理解Requests库的异常
异常 |
说明 |
requests.ConnectionError |
网络连接错误异常,如DNS查询失败、拒绝连接等 |
requests.HTTPError |
HTTP错误异常 |
requests.URLRequired |
URL缺失异常 |
requests.TooManyRedirects |
超过最大重定向次数,产生重定向异常 |
requests.ConnectTimeout |
连接远程服务器超时异常 |
requests.Timeout |
请求URL超时,产生超时异常 |
r.raise_for_status() |
如果不是200,产生异常requests.HTTPError |
- 通用代码框架
import requests
def getHTMLText(url):
try:
r=requests.get(url,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return "Error"
if __name__=="__main__":
url=""
print(getHTMLText(url)
HTTP协议及Requests库方法
- HTTP:超文本传输协议,基于请求与响应模式的无状态的应用层协议,采用URL作为定位网络资源的标识。
- URL格式:http://host[:port][path]
- host:合法的Internet主机域名或IP地址
- port:端口号,缺省端口为80
- 请求资源的路径
- HTTP协议对资源的操作
方法 |
说明 |
GET |
请求获取URL位置的资源 |
HEAD |
请求获取URL位置资源的响应消息报告,即获得该资源的头部信息 |
POST |
请求向URL位置的资源后附加新的数据 |
PUT |
请求向URL位置存储一个资源,覆盖原URL位置的资源 |
PATCH |
请求局部更新URL位置的资源,即改变该资源的部分内容 |
DELETE |
请求删除URL位置存储的资源 |
- HTTP协议对资源的操作
graph LR
A(人)-->|PUT POST PATCH DELETE| B(URL)
B-->|GET HEAD| A
- 理解PATCH和PUT的区别
- 假设URL位置有一组数据UserInfo,包括UserID、UserName等20个字段,需求是用户修改了UserName,其他不变
- 采用Patch,仅向URL提交UserName的局部更新请求
- 采用PUT,必须将所有20个字段一并提交到URL,未提交字段被删除
- PATCH节省网络带宽
Requests库主要方法解析
- .request(method,url,**kwargs)
-
method:请求方式,对应get、put、post等7种
-
url:拟获取页面的url链接
-
**kwargs:控制访问的参数,共13个
- params:字典或字节序列,作为参数增加到url中
import requests
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
- data:字典、字节序列或文件对象,作为Request的内容
kv={'key1':'value1','key2':'value2'}#也可以字符串
r=requests.request('POST','http://python123.io/ws',data=kv)
- json:JSON格式的数据,作为Request的内容
kv={'key1':'value1'}
r=requests.request('POST','http://python123.io/ws',json=kv)
hd={'user-agent':'Chrome/10'}
r=requests.request('POST','http://python123.io/ws',headers=hd)
- cookies:字典或CookieJar,Request中的cookie
- auth:元组,支持HTTP认证功能
- files:字典类型,传输文件
fs={'file':open('data.xls','rb')}
r=requests.request('POST','http://python123.io/ws',files=fs)
pxs={'http':'http://user:pass@10.10.10.1:!234'
'https':'https://10.10.10.1:4321'}
r=requests.request('POST','http://python123.io/ws',pr