[爬虫] 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/
[爬虫] requests库的更多相关文章
- Python爬虫—requests库get和post方法使用
目录 Python爬虫-requests库get和post方法使用 1. 安装requests库 2.requests.get()方法使用 3.requests.post()方法使用-构造formda ...
- Python爬虫--Requests库
Requests Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库,requests是python实现的最简单易用的HTTP库, ...
- 【Python成长之路】Python爬虫 --requests库爬取网站乱码(\xe4\xb8\xb0\xe5\xa)的解决方法【华为云分享】
[写在前面] 在用requests库对自己的CSDN个人博客(https://blog.csdn.net/yuzipeng)进行爬取时,发现乱码报错(\xe4\xb8\xb0\xe5\xaf\x8c\ ...
- Python爬虫 requests库基础
requests库简介 requests是使用Apache2 licensed 许可证的HTTP库. 用python编写. 比urllib2模块更简洁. Request支持HTTP连接保持和连接池,支 ...
- python爬虫---requests库的用法
requests是python实现的简单易用的HTTP库,使用起来比urllib简洁很多 因为是第三方库,所以使用前需要cmd安装 pip install requests 安装完成后import一下 ...
- Python 爬虫-Requests库入门
2017-07-25 10:38:30 response = requests.get(url, params=None, **kwargs) url : 拟获取页面的url链接∙ params : ...
- Python爬虫---requests库快速上手
一.requests库简介 requests是Python的一个HTTP相关的库 requests安装: pip install requests 二.GET请求 import requests # ...
- 4.爬虫 requests库讲解 GET请求 POST请求 响应
requests库相比于urllib库更好用!!! 0.各种请求方式 import requests requests.post('http://httpbin.org/post') requests ...
- 6.爬虫 requests库讲解 总结
requests库的总结: 用ProcessOn根据前面的几节内容做了个思维导图:
随机推荐
- sql 同一行中,不同结果在不同列显示
对不同条件查询到的结果在同一行中展示 尝试写过使用","和inner join两种方式,感觉使用","的更加直观 select table1.guid, tab ...
- Nowcoder的JS计时器题分析
题目描述 实现一个打点计时器,要求1.从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 12.返回的对象中需要包含一个 ...
- MessagePack Java Jackson Dataformat - 列表(List)的序列化和反序列化
在本测试代码中,我们定义了一个 POJO 类,名字为 MessageData,你可以访问下面的链接找到有关这个类的定义. https://github.com/cwiki-us-demo/serial ...
- codeforces402B
Trees in a Row CodeForces - 402B The Queen of England has n trees growing in a row in her garden. At ...
- SpringMVC——MVC执行流程底层剖析
SpringMVC流程图如上面所示,根据上图,串联一下底层源码: 1.在DispatcherServlet中找到doDisPatch 2.观察方法体,然后找到getHandler方法 3.点进方法,发 ...
- 微信小程序_(校园视)开发视频的展示页_上
微信小程序_(校园视) 开发用户注册登陆 传送门 微信小程序_(校园视) 开发上传视频业务 传送门 微信小程序_(校园视) 开发视频的展示页-上 传送门 微信小程序_(校园视) 开发视频的展示页-下 ...
- Spring Cloud Feign声明式服务调用(转载)+遇到的问题
转载:原文 总结: 1.pom添加依赖 2.application中填写正确的eureka配置 3.启动项中增加注解 @EnableFeignClients 4.填写正确的调用接口 通过原文使用Fei ...
- okHttp3 源码分析
一, 前言 在上一篇博客OkHttp3 使用详解里,我们已经介绍了 OkHttp 发送同步请求和异步请求的基本使用方法. OkHttp 提交网络请求需要经过这样四个步骤: 初始化 OkHttpClie ...
- compare across commits online
https://gist.github.com/nevik/5689882 Examples: https://github.com/octocat/Spoon-Knife/compare/ed122 ...
- anroid学习笔记(1)
大概是2个月前,报名了慕课的android就业班课程. 算是补全了当初博客分类的最初设计. 安卓和前端比较: 1,java在安卓开发中的作用,现在我的认识是和JavaScript在前端web开发中有很 ...