爬虫相关--requests库
requests的理想:HTTP for Humans
一、八个方法
相比较urllib模块,requests模块要简单很多,但是需要单独安装:
- 在windows系统下只需要在命令行输入命令 pip install requests 即可安装。
- 在 linux 系统下,只需要输入命令 sudo pip install requests ,即可安装。
requests库的八个主要方法
| 方法 | 描述 |
|---|---|
| requests.request() | 构造一个请求,支持以下各种方法 |
| requests.get() | 向html网页提交get请求的方法 |
| requests.post() | 向html网页提交post请求的方法 |
| requests.head() | 获取html头部信息的主要方法 |
| requests.put() | 向html网页提交put请求的方法 |
| requests.options() | 向html网页提交options请求的方法 |
| requests.patch() | 向html网页提交局部修改的请求 |
| requests.delete() | 向html网页提交删除的请求 |
请求之后,服务器通过response返回数据,response具体参数如下图:
| 属性 | 描述 |
|---|---|
| r.status_code | http请求的返回状态,若为200则表示请求成功 |
| r.text | http响应内容的字符串形式,即返回的页面内容 |
| r.encoding | 从http header 中猜测的相应内容编码方式 |
| r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) |
| r.content | http响应内容的二进制形式 |
| r.headers | 响应头 |
| r.cookies | cookie |
| r.url | url |
| r.history | 请求历史 |
requests.request(method, url, **kwargs)
- method:即 get、post、head、put、options、patch、delete
- url:即请求的网址
- **kwargs:控制访问的参数,具体参数如下:
params
字典或字节序列,作为参数增加到url中。使用这个参数可以把一些键值对以?key1=value1&key2=value2的模式增加到url中
## request(method, url, **kwargs),当 **kwargs 为 params
import requests payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.request('GET', 'http://httpbin.org/get', params=payload)
print(r.url)
# result: http://httpbin.org/get?key1=value1&key2=value2
print(r.text)
# result:
# {
# "args": {
# "key1": "value1",
# "key2": "value2"
# },
# "headers": {
# "Accept": "*/*",
# "Accept-Encoding": "gzip, deflate",
# "Connection": "close",
# "Host": "httpbin.org",
# "User-Agent": "python-requests/2.19.1"
# },
# "origin": "1.203.183.95",
# "url": "http://httpbin.org/get?key1=value1&key2=value2"
# }
data
字典,字节序或文件对象,重点作为向服务器提供或提交资源是提交,作为request的内容,与params不同的是,data提交的数据并不放在url链接里, 而是放在url链接对应位置的地方作为数据来存储。它也可以接受一个字符串对象。
## request(method, url, **kwargs),当 **kwargs 为 data
import requests payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.request('POST', 'http://httpbin.org/post', data=payload)
print(r.url)
# result: http://httpbin.org/post
print(r.text)
# result:
# {
# "args": {},
# "data": "",
# "files": {},
# "form": {
# "key1": "value1",
# "key2": "value2"
# },
# "headers": {
# "Accept": "*/*",
# "Accept-Encoding": "gzip, deflate",
# "Connection": "close",
# "Content-Length": "23",
# "Content-Type": "application/x-www-form-urlencoded",
# "Host": "httpbin.org",
# "User-Agent": "python-requests/2.19.1"
# },
# "json": null,
# "origin": "1.203.183.95",
# "url": "http://httpbin.org/post"
# }
json
json格式的数据, json合适在相关的html,http相关的web开发中非常常见, 也是http最经常使用的数据格式, 他是作为内容部分可以向服务器提交。
## request(method, url, **kwargs),当 **kwargs 为 json
import requests payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.request('POST', 'http://httpbin.org/post', json=payload)
print(r.url)
# result: http://httpbin.org/post
print(r.text)
# result:
# {
# "args": {},
# "data": "{\"key1\": \"value1\", \"key2\": \"value2\"}",
# "files": {},
# "form": {},
# "headers": {
# "Accept": "*/*",
# "Accept-Encoding": "gzip, deflate",
# "Connection": "close",
# "Content-Length": "36",
# "Content-Type": "application/json",
# "Host": "httpbin.org",
# "User-Agent": "python-requests/2.19.1"
# },
# "json": {
# "key1": "value1",
# "key2": "value2"
# },
# "origin": "1.203.183.95",
# "url": "http://httpbin.org/post"
# }
files
字典, 是用来向服务器传输文件时使用的字段。
## request(method, url, **kwargs),当 **kwargs 为 file
import requests
# filejiatao.txt 文件的内容是文本“www.baidu.com www.cctvjiatao.com”
files = {'file': open(r"D:\DataguruPyhton\PythonSpider\lesson2\filejiatao.txt", "rb")}
r = requests.request('POST', 'http://httpbin.org/post', files=files)
print(r.url)
# result: http://httpbin.org/post
print(r.text)
# result:
# {
# "args": {},
# "data": "",
# "files": {
# "file": "www.baidu.com www.cctvjiatao.com"
# },
# "form": {},
# "headers": {
# "Accept": "*/*",
# "Accept-Encoding": "gzip, deflate",
# "Connection": "close",
# "Content-Length": "182",
# "Content-Type": "multipart/form-data; boundary=ee12ea6a4fd2b8a3318566775f2b268f",
# "Host": "httpbin.org",
# "User-Agent": "python-requests/2.19.1"
# },
# "json": null,
# "origin": "1.203.183.95",
# "url": "http://httpbin.org/post"
# }
headers
字典是http的相关语,对应了向某个url访问时所发起的http的头字段, 可以用这个字段来定义http的访问的http头,可以用来模拟任何我们想模拟的浏览器来对url发起访问。
## request(method, url, **kwargs),当 **kwargs 为 headers
import requests payload = {'key1': 'value1', 'key2': 'value2'}
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36"}
r = requests.request('GET', 'http://httpbin.org/get', params=payload, headers=headers)
print(r.url)
# result: http://httpbin.org/get?key1=value1&key2=value2
print(r.text)
# result:
# {
# "args": {
# "key1": "value1",
# "key2": "value2"
# },
# "headers": {
# "Accept": "*/*",
# "Accept-Encoding": "gzip, deflate",
# "Connection": "close",
# "Host": "httpbin.org",
# "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36"
# },
# "origin": "1.203.183.95",
# "url": "http://httpbin.org/get?key1=value1&key2=value2"
# }
cookies
字典或CookieJar,指的是从http中解析cookie
## request(method, url, **kwargs),当 **kwargs 为 cookies
import requests cookies = dict(cookies_are='working')
r = requests.request('GET', 'http://httpbin.org/cookies', cookies=cookies)
print(r.url)
# result: http://httpbin.org/cookies
print(r.text)
# result:
# {
# "cookies": {
# "cookies_are": "working"
# }
# }
会话维持
在requests中,如果直接利用get()或post()等方法的确可以做到模拟网页的请求,但是这实际上是相当于不同的会话,也就是说相当于你用了两个浏览器打开了不同的页面。这时候就需要采用会话。
import requests s = requests.Session()
s.get("http://httpbin.org/cookies/set/number/123456789")
r = s.get('https://httpbin.org/cookies')
print(r.text)
auth
元组,用来支持http认证功能
## request(method, url, **kwargs),当 **kwargs 为 auth
import requests cs_user = '用户名'
cs_psw = '密码'
r = requests.request('GET', 'https://api.github.com', auth=(cs_user, cs_psw))
print(r.url)
# result: 待补充
print(r.text)
# result: 待补充
timeout
用于设定超时时间, 单位为秒,当发起一个get请求时可以设置一个timeout时间, 如果在timeout时间内请求内容没有返回, 将产生一个timeout的异常。
## request(method, url, **kwargs),当 **kwargs 为 timeout
import requests r = requests.request('GET', 'http://github.com', timeout=0.001)
print(r.url)
# result: 报错 socket.timeout: timed out
proxies
字典, 用来设置访问代理服务器。
## request(method, url, **kwargs),当 **kwargs 为 proxies
import requests proxies = {
'https': 'http://41.118.132.69:4433'
}
# 也可以通过环境变量设置代理
# export HTTP_PROXY='http://10.10.1.10:3128'
# export HTTPS_PROXY='http://10.10.1.10:1080'
r = requests.request('GET', 'http://httpbin.org/get', proxies=proxies)
print(r.url)
# result: http://httpbin.org/get
print(r.text)
# result:
# {
# "args": {},
# "headers": {
# "Accept": "*/*",
# "Accept-Encoding": "gzip, deflate",
# "Connection": "close",
# "Host": "httpbin.org",
# "User-Agent": "python-requests/2.19.1"
# },
# "origin": "1.203.183.95",
# "url": "http://httpbin.org/get"
# }
verify
当https网站,且此网站证书没有被官方CA机构信任,会出现证书验证错误的结果(您的链接不是私密链接)
开关, 用于认证SSL证书, 默认为True。(之前12306网站不是CA机构信任的。现在应该试了。)
## request(method, url, **kwargs),当 **kwargs 为 verify,SSL证书验证
import requests r = requests.request('GET', 'https://kyfw.12306.cn/otn/', verify=True)
print(r.text) r = requests.request('GET', 'https://kyfw.12306.cn/otn/', verify=False)
print(r.text) r = requests.request('GET', 'https://github.com', verify=True)
print(r.text)
cert
当然,我们也可以制定一个本地证书用作客户端证书,这可以是单个文件(包含秘钥和证书)或一个包含两个文件路径的元组:
import requests
response = requests.get("https://www.12306.cn",cert=("/path/server.crt","./path/key"))
print(response.status_code)
allow_redirects
开关, 表示是否允许对url进行重定向, 默认为True。
stream
开关, 指是否对获取内容进行立即下载, 默认为True。
requests.get(url, params=None, **kwargs)
# 官方文档
def get(url, params=None, **kwargs):
kwargs.setdefault('allow_redirects', True)
return request('get', url, params=params, **kwargs)
requests.post(url, data=None, json=None, **kwargs)
# 官方文档
def post(url, data=None, json=None, **kwargs):
return request('post', url, data=data, json=json, **kwargs)
requests.head(url, **kwargs)
# 官方文档
def head(url, **kwargs):
kwargs.setdefault('allow_redirects', False)
return request('head', url, **kwargs)
requests.options(url, **kwargs)
# 官方文档
def options(url, **kwargs):
kwargs.setdefault('allow_redirects', True)
return request('options', url, **kwargs)
requests.put(url, data=None, **kwargs)
# 官方文档
def put(url, data=None, **kwargs):
return request('put', url, data=data, **kwargs)
requests.patch(url, data=None, **kwargs)
# 官方文档
def patch(url, data=None, **kwargs):
return request('patch', url, data=data, **kwargs)
requests.patch和request.put类似。
两者不同的是: 当我们用patch时仅需要提交需要修改的字段。
而用put时,必须将所有字段一起提交到url,未提交字段将会被删除。
patch的好处是:节省网络带宽。
requests.delete(url, **kwargs)
# 官方文档
def delete(url, **kwargs):
return request('delete', url, **kwargs)
requests库的异常
注意requests库有时会产生异常,比如网络连接错误、http错误异常、重定向异常、请求url超时异常等等。所以我们需要判断r.status_codes是否是200,在这里我们怎么样去捕捉异常呢?
这里我们可以利用r.raise_for_status() 语句去捕捉异常,该语句在方法内部判断r.status_code是否等于200,如果不等于,则抛出异常。
于是在这里我们有一个爬取网页的通用代码框架
try:
r = requests.get(url, timeout=30) # 请求超时时间为30秒
r.raise_for_status() # 如果状态不是200,则引发异常
r.encoding = r.apparent_encoding # 配置编码
print(r.text)
except:
print("产生异常")
二、返回数据
2.1 内置状态码查询对象 requests.codes
具体状态码临时百度,比如200是ok,404是not_found等
import requests
r = requests.get("http://baidu.com")
exit() if not r.status_code == requests.codes.ok else print("Successfully")
2.2 content返回二进制抓取图片、文件
import requests
r = requests.get("https://github.com/favicon.ico")
with open("facivon.ico","wb") as f:
f.write(r.content)
三、requests的综合小实例
实例一:京东商品信息的爬取
## 京东商品信息的爬取
# 不需要对头部做任何修改,即可爬网页
import requests url = 'http://item.jd.com/2967929.html'
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[:1000]) # 部分信息
except:
print("失败")
实例二:亚马逊商品信息的爬取
## 亚马逊商品信息的爬取
# 该网页中对爬虫进行的爬取做了限制,因此我们需要伪装自己为浏览器发出的请求
import requests url = 'http://www.amazon.cn/gp/product/B01M8L5Z3Y'
try:
kv = {'user_agent': 'Mozilla/5.0'}
r = requests.get(url, headers=kv) # 改变自己的请求数据
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[1000:2000]) # 部分信息
except:
print("失败")
实例三:百度搜索关键字提交
## 百度搜索关键字提交
# 百度的关键字接口:https://www.baidu.com/s?wd=keyword
import requests keyword = 'python'
try:
kv = {'wd': keyword}
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36"}
r = requests.get('https://www.baidu.com/s', params=kv, headers=headers)
r.raise_for_status()
r.encoding = r.apparent_encoding
# print(len(r.text))
print(r.text)
except:
print("失败")
实例四:网络图片的爬取
## 网络图片的爬取
import requests
import os try:
url = "https://odonohz90.qnssl.com/library/145456/bb0b3faa7a872d012bb4c57256b47585.jpg?imageView2/2/w/1000/h/1000/q/75" # 图片地址
root = r"D:\DataguruPyhton\PythonSpider\lesson3\pic\\"
path = root + url.split("/")[-1]
if not path.endswith(".jpg"):
path += ".jpg"
if not os.path.exists(root): # 目录不存在创建目录
os.mkdir(root)
if not os.path.exists(path): # 文件不存在则下载
r = requests.get(url)
f = open(path, "wb")
f.write(r.content)
f.close()
print("文件下载成功")
else:
print("文件已经存在")
except:
print("获取失败")
爬虫相关--requests库的更多相关文章
- Python爬虫之requests库介绍(一)
一:Requests: 让 HTTP 服务人类 虽然Python的标准库中 urllib2 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 ...
- Mac os 下 python爬虫相关的库和软件的安装
由于最近正在放暑假,所以就自己开始学习python中有关爬虫的技术,因为发现其中需要安装许多库与软件所以就在这里记录一下以避免大家在安装时遇到一些不必要的坑. 一. 相关软件的安装: 1. h ...
- Python爬虫之requests库的使用
requests库 虽然Python的标准库中 urllib模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests宣传是 "HTTP for ...
- python爬虫之requests库
在python爬虫中,要想获取url的原网页,就要用到众所周知的强大好用的requests库,在2018年python文档年度总结中,requests库使用率排行第一,接下来就开始简单的使用reque ...
- Python爬虫:requests 库详解,cookie操作与实战
原文 第三方库 requests是基于urllib编写的.比urllib库强大,非常适合爬虫的编写. 安装: pip install requests 简单的爬百度首页的例子: response.te ...
- 【Python爬虫】爬虫利器 requests 库小结
requests库 Requests 是一个 Python 的 HTTP 客户端库. 支持许多 HTTP 特性,可以非常方便地进行网页请求.网页分析和处理网页资源,拥有许多强大的功能. 本文主要介绍 ...
- 爬虫值requests库
requests简介 简介 Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库 ,使用起来比urllib简洁很多 因为是第三方库, ...
- (爬虫)requests库
一.requests库简介 urllib库和request库的作用一样,都是服务器发起请求数据,但是requests库比urllib库用起来更方便,它的接口更简单,选用哪种库看自己. 如果没有安装过这 ...
- 【Python爬虫】Requests库的基本使用
Requests库的基本使用 阅读目录 基本的GET请求 带参数的GET请求 解析Json 获取二进制数据 添加headers 基本的POST请求 response属性 文件上传 获取cookie 会 ...
随机推荐
- [转]Windows系统下批量重命名文件(bat命令版本)
原文地址:https://jingyan.baidu.com/article/6dad507524bdcba122e36e44.html 我们有时候会遇到大量文件需要重命名,Windows系统下右键菜 ...
- PHP过狗webshell编写过程
0x1 先上图: 0x2 编写过程 这里必须强调一下我内心的感觉,小阔爱前两天也研究了过狗的一句话了,然后我突然觉得大家都在进步,我研究点啥呢?不如也试试以前因为觉得自己不懂代码,而不会研究的免杀sh ...
- 002-guava String 操作
一.概述 提供了字符串基本操作 二.使用 2.1.字符串拼接 字符串的拼接采用的是Guava中的Joiner类中的方法 @Test public void testJdkJoin() { List&l ...
- 如何把VMware Workstation使用的虚拟SCSI磁盘转换成虚拟IDE硬盘
如何把VMware Workstation使用的虚拟SCSI磁盘转换成虚拟IDE硬盘 摘自:http://blog.sina.com.cn/s/blog_7525b71f0101d0u8.html ...
- 利用postman生成各种编程语言的代码
原文来源:https://learning.getpostman.com/docs/postman/sending_api_requests/generate_code_snippets/ 在Post ...
- 123457123456#1#----com.MC.CarWashKidsGames234----前拼后广--洗车游戏mc-mc1111
com.MC.CarWashKidsGames234----前拼后广--洗车游戏mc-mc1111
- php调用webservice报错Class 'SoapClient' not found(转)
php在调用webservice时,报告如下类似错误: ( ! ) Fatal error: Class 'SoapClient' not found in E:/WebSrv/CI/system/l ...
- 使用jsPlumb插件实现动态连线功能
这周去看了两天的羽毛球亚锦赛,工作有提前晚上加班做一些,但是技术文章却拉下了. 这段时间一直在寻找可以实现前端元素动态连线的功能,找了好几个库,考虑过用d3或者原生svg和canvas来实现,最后和同 ...
- Ubuntu18安装虚拟机virtualbox
环境查看 安装虚拟机 apt install virtualbox 图形化界面启动 virtualbox 其余创建虚拟机和安装和在Windows安装配置一样,不详述.
- INTEL 7代CPU I5 7500 集显HD630 WIN7 64位
HD630 在WIN7 下的硬件ID (在设备管理器 - 显卡 - 属性 中查看): PCI\VEN_8086&DEV_5912&SUBSYS_D0001458&REV_04 ...