[爬虫] 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根据前面的几节内容做了个思维导图:
随机推荐
- 在java下面配置xml导致idea编译失败
1.今天遇到一个问题在java配置dao.xml的时候导致,idea编译失败 然后把pom.xml上面的 <build> <resources> <resource> ...
- 小程序开发之后台mybatis逆向工程(二)
上一节搭建好了SSM后台框架,这一节将根据表结构创建实体及映射文件以及mapper接口.如果表过多,会很麻烦,所以mybatis提供了逆向工程来解决这个问题. 上一节 SSM搭建后台管理系统 逆向工程 ...
- Word:高亮显示文档中的所有英文字符
造冰箱的大熊猫,本文适用于Microsoft Office 2007@cnblogs 2019/4/2 文中图片可通过点击鼠标右键查看大图 1.场景 某天在阅读一个中英文混编的Word文档时,希望将 ...
- HZOJ 20190722 visit (组合数学+数论)
考试T2,考试时打了个$O(n^3)$dp暴力,思路还是很好想的,但细节也不少,然后滚动数组没清空,而且题又看错了,只得了10pts,真是血的教训. 题解: 其实看数据范围,给出了模数是否为质数,其实 ...
- Linux之防火墙iptables
一.检查iptables服务状态 1.首先检查iptables服务的状态 [root@bogon ~]# service iptables status iptables: Firewall is n ...
- nvidia-smi 实时刷新 实时显示显存使用情况
watch -n 0.5 -d nvidia-smi #每隔0.5秒刷新一次
- Flutter文本框TextField
参数详解TextField同时也使用Text 的部分属性: 属性 作用controller 控制器,如同 Android View iddecoration 输入器装饰keyboardType 输入的 ...
- Linux查看和编辑文件
例如,要想test.txt文件添加内容"I am a boy",test.txt在当前目录中 方法一:vi编辑法 打开终端,输入vi test.txt 回车,按a或i进入编辑模式, ...
- LC 683. K Empty Slots 【lock,hard】
There is a garden with N slots. In each slot, there is a flower. The N flowers will bloom one by one ...
- PreparedStatement执行sql語句
import com.loaderman.util.JdbcUtil; import java.sql.Connection; import java.sql.PreparedStatement; i ...