[爬虫] requests库
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的PATCH |
requests.delete() | 向HTML页面提交删除请求,对应于HTTP的DELETE |
get方法:
r = equests.get(url,params=None,**kwargs),r 是服务器返回的一个包含服务器所有资源的Response对象
- url :要获取的API/网页的URL链接
- params:URL中的额外参数,可以是字典、字节流格式,可选
- **kwargs:共有12个控制访问的参数
Response对象的常用属性
- r.status_code http请求的返回状态,200是OK
- r.text http响应内容的字符串形式,即URL返回的页面内容
- r.encoding 从http Header中猜测的响应内容的编码方式,若header没有charset字段,则默认为ISO-8859-1编码,<meta charset='utf-8'>
- r.apparent_encoding 从内容分析出的响应内容编码方式(备选编码)这个更准确解析页面的编码
- r.content http响应内容的二进制形式(如图片是由二进制存储的,就可以通过r.content还原这图片)
- r.headers http响应的响应头
- r.raise_for_status http请求状态码不是200则会引发HTTPError异常
网络链接有风险,所以需要进行异常处理。
异常 | 说明 |
requests.ConnectionError | 网络连接错误异常,如DNS查询失败、拒绝连接等 |
requests.HTTPError | HTTP错误异常 |
requests.URLRequired | URL缺失异常 |
requests.TooManyRedirects | 超过最大重定向次数 |
requests.ConnectTimeout | 连接服务器超时异常 |
requests.Timeout | 请求URL超时 |
r.raise_for_status() #判断r若果不是200,产生异常requests.HTTPError异常
import requests def getHTMLText(url): try: r = requests.get(url,timeout=30) r.raise_for_status() #请求不成功不是200,则引发HTTPError异常 r.encoding = r.apparent_encoding return r.text except: return "异常了!" if __name__ == "__main__": url = "http://www.baidu.com" print(getHTMLText(url))
Requests库的head方法:
>>> r = requests.head(url="http://www.jd.com",timeout=30) #可以以很少的网络流量获取网站大体信息 >>> r.headers #响应头 {'Content-Type': 'text/html', 'Connection': 'keep-alive', ...} >>> r.text #所以API内容是空的 ''
Requests库的post方法:控制参数是data
向URLpost一个字典,自动编码为form(表单)
>>> payload = {'key1':'value1','key2':'value2'} #post的是一个字典,则自动编码为form表单 >>> r = requests.post(url='http://httpbin.org/post',data=payload,timeout=30) >>> print(r.text) #返回json { ...... "form": { #post的是字典或键值对,自动放在form表单下的 "key1": "value1", "key2": "value2" }, ...... } >>> print(r.json()) #返回的是一个Python字典 {... 'form': {'key1': 'value1', 'key2': 'value2'}, ......}
向URL post一个字符串,自动编码为data
>>> string = "skdkheh990" #post一个字符串,自动编码为data >>> r = requests.post(url="http://httpbin.org/post",data = string) >>> print(r.text) #返回json { ...... "data": "skdkheh990", #post字符串自动存在data字段下 "form": {}, ...... } >>> r.json() #json()方法返回一个Python字典 {...... 'form': {}, 'url': 'http://httpbin.org/post', 'data': 'skdkheh990',......}
**kwargs:控制方为参数,都是可选项
1.params:是字典或字节序列,作为参数增加到URL中,在get方法中使用
>>> kv = {'wd':'unittest'} >>> r = requests.get(url='http://www.baidu.com',params=kv) >>> r.status_code 200 >>> r.url 'http://www.baidu.com/?wd=unittest'
2.data:是字典、字节序列或文件对象,作为Request的内容,向服务器提交资源时使用,post、put、patch、delete方法使用
>>> dic ={'key1':'value1','key2':'value2'} # >>> r = requests.post(url='http://httpbin.org/post',data=dic)#post提交到服务器不会显示在URL上 >>> body='stringafasdf' >>> r = requests.post(url="http://httpbin.org/post",data=body)
3.json:是json格式的数据,作为Request的内容,提交内容是json串时,用到json=...,post等方法使用
>>> json1 ={'key1':'value1'} >>> r = requests.post(url="http://httpbin.org/post",json=json1) >>> print(r.text) { "args": {}, "data": "{\"key1\": \"value1\"}", "files": {}, "form": {}, "json": { #json=json1会把数据提交到服务器的json域中 "key1": "value1" }, ...... }
post 控制参数用到data、json的区别:
- 提交的数据是字典或键值对,使用data=XXX,则提交到服务器的form表单下;
- 提交的数据是字符串,使用data=XXX,则提交到服务器的data下;
- 提交的数据是json串时,使用json=XXX,则提交到服务器的json域;
4.headers:字典格式,用于定制http请求头,get、post等方法使用
>>> header={'user-agent':'chrome/10'} #模拟浏览器向服务器发起请求就是用headers >>> r = requests.request('POST',url="http://httpbin.org/post",headers=header)
5.cookies:是字典或cookieJar格式,Request中的cookie
6.auth :是元组类型,用于http认证功能
7.files:是字典类型,用于向服务器传输文件
>>> fs = {'file':open(r'E:\test.txt','rb')} >>> r = requests.post(url="http://httpbin.org/post",files = fs,timeout=30) >>> print(r.text) { "args": {}, "data": "", "files": { #向服务器提交的文件保存到服务器的files域中 "file": "hahfhadfhadsfhhsdflahlowej[of567890987654567890987654345678" }, "form": {}, ...... }
8.timeout:设定超时时间,秒为单位
在设定时间内没有返回内容则返回一个timeout异常
9.proxies:是字典类型,可以为我们爬取网页设定访问代理服务器,可以增加登录认证
>>> pxs = {'http':'http"//user:pass@10.10.10.:1234','https':'https://10.10.10.1.4321'}#设置2个代理,一个是http访问时使用的代理,另一个是https访问时使用的代理 >>> r = requests.get(url='http://www.baidu.com',proxies=pxs) #可以隐藏用户爬去网页时原来的IP地址信息
10.allow_redirects:Ture/False,默认是Ture,用于允不允许URL进行重定向
多用于需要登录才能查看内容的网站,若 allow_redirects = False,跳转到登录界面,status_code = 302(重定向);若 allow_redirects = True,status_code = 200
11.stream:Ture/False,默认是Ture,用于对获取的内容是否立即下载
12.verify:Ture/False,默认是Ture,用于验证SSL证书开关
13.cert:保存本地SSL证书路径的字段
网络爬虫中的Robots协议
robots协议是指:放在网站根目录下,用来告知爬虫哪些可以爬取哪些不能爬取数据。
http://www.jd.com/robots.txt 京东网终的robots协议
网络爬虫的尺寸
- 小规模,数据量小,爬取速度不明感,爬取网页:requests库(90%)
- 中规模,数据量规模较大,爬取速度敏感,爬取网站、系列网站:Scrapy库
- 大规模,搜索引擎,爬取速度关键,爬取全网:定制开发
网络爬虫的限制
网站是通过根据请求头中user-agent字段是否是浏览器来判断是否是爬虫爬取数据,通过headers={...}更改用户代理为浏览器就可以正常爬取数据了。
来源审查:判断user-agent进行限制
检查来访http协议头的user-agent域,只响应浏览器或友好爬虫的访问
发布公告:Robots协议(网络爬虫排除标准)
我们平时看到的人机交互方式,如:图像、文本框、点击按钮等等,浏览器向后台服务器提交请求的时候其实都是以链接的形式来提交的,只要通过浏览器的解析知道提交给后台的URL的形式那就可以用request库模拟浏览器向服务器做正式的提交。向网站提交数据时可以通过这种方式。
eg:在百度搜索框搜索内容其实是:http://www.baidu.com?wd='unittest'方式提交的
网络上任何内容都有一个URL,任何内容都是用URL定义的,都可以通过URL对网络上内容进行操作。
reference:
http://blog.csdn.net/JOJOY_tester/article/details/61416719?locationNum=2&fps=1
http://cn.python-requests.org/zh_CN/latest/