import requests
”’requests库含七大方法,主要是requests.request()构造一个请求,其余六大方法均是基于requests.requests()的,并封装在该方法下
requests.get()为获取HTML网页的主要方法,通常所需的参数为一个url,对应于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”’
url='http://www.baidu.com'
r=requests.get(url)'''构造一个requests对象返回一个response对象'''
print(r.status_code)'''查看状态属性,状态为200,若不为200,则均为异常'''
print(type(r))
# <class 'requests.models.Response'>requests.get()返回的是一个response对象'''
print(r.text)
”’因为requests.get()返回response对象,而作为response对象又有五大属性
r.status_code HTTP请求的返回状态,200表示连接成功,404表示连接失败
r.text HTTP响应的字符串形式(url对应的页面内容)
r.encoding 从HTTP HEADER中猜测的编码方式
r.apparent_encoding从内容中分析出的内容编码方式
r.appent_encoding从内容中分析出来的编码方式(也是一种备用编码方式)
r.content HTTP响应内容的二进制形式”’
”’后通过r.apparent_encoding查看HTTP返回状态,若为200即为正常
若为404或者其他则抛出异常,用except接收异常”’
print(r.encoding)
print(r.apparent_encoding)
r.encoding=’utf/8’
print(r.text)
'''异常处理很重要'''
**'''r.raise_for_status()在内部检测r.status_code,若不为200,则抛出requests.HTTPErro
requests对response对象创建流程:
先利用requests.get()创建一个response对象
后用r.raise_for_status()判断r.status_code
用try,except接收异常
输出r.text
注text为属性'''**
def erro(url):
try:
r=requests.get(url,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return '输出异常'
if __name__=='__main__':
url='http://www.baidu.com'
print(erro(url))
**''Requests库会引起的六大异常:**
--------------------
**requests.ConnectionErro网络连接错误异常,如DNS查询(域名解析)失败,拒绝连接等
requests.HTTPError HTTP错误异常
Requests.URLRequired URL缺失
requests.TooManyRedirects 超过最大重定向次数,产生重定向异常
Requests.ConnectTimeout连接远程服务器超时
Requests.Timeout请求URL超时,产生超时异常**
**'''安全问题:**
----------
***遵循HTTP协议
Robots协议'''
'''HTTP协议:
HTTP是基于请求与响应模式,无状态(第一次请求与第二次请求无关)的应用层协议
HTTP用URL作为定位网络资源标识
URL的格式为:
http://host[:port][path]
host:合法的Internet主机域名或IP地址
port:端口号,缺省端口为80
path为请求资源路径'''
'''PATCH和PUT的区别:
URL位置有一组UserIfo信息,若用户只需修改UserName,而PATCH为局部修改,PUT为全局修改'''
**'''requests库详细用法
requests.request(method(HTTP方法),url,**kwargs)
**kwargs(控制访问的参数,为可选项)详解:
params:字典或字节序列,作为参数添加到url中
data:字典或字节序列或文件对象,作为Requests内容
json:json格式的数据,作为Requests的内容
headers:字典,HTTP定制头
cookies:字典或CookieJar,做为Requests对象的cookie(Cookie是由HTTP服务器设置的,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。)
auth:元组,支持HTTP认证
files:字典类型,传输文件
timeout:设置超时访问时间
proxies:字典类型,设置访问代理服务器,可以增加登录认证
allow_redirects:TRUE/FALSE,默认为TRUE,重定向开关
stream:TRUE/FALSE,默认为TRUE,获取内容立即下载开关
verify:TRUE/FALSE,默认为TRUE,认证SSL(激活SSL协议,实现数据信息在客户端和服务器之间的加密传输,可以防止数据信息的泄露,保证了双方传递信息的安全性,而且用户可以通过服务器证书验证他所访问的网站是否是真实可靠。)证书
cert:本地SSL证书路径'''
'''代码实现'''*****
==========
url='http://www.baidu.com'
kw={'key1':'value1',
'key2':'value2'}
r=requests.request('GET',url,params=kw)
print(r.url)
http://www.baidu.com/?key1=value1&key2=value2
url1='http://www.baidu.com'
r1=requests.request('POST',url1,json=kw)
print(r.url)
http://www.baidu.com/
**'''post递交表单,不改变url'''**
url2='http://www.baidu.com'
hd={'user-agent':'Chrome/10'}
r2=requests.request('POST',url2,headers=hd)
print(r2.url)
r4=requests.request('GET',url2,timeout=30)
print(r4.url)
# pxs={'http':'http://user:[email protected]:1234',
# 'https': 'https://10.10.10.1:4321'}
# r5=requests.request('GET',url,proxies=pxs)
# print(r5.url)
用session进行会话维持
--------------
假设你想通过在同一个页面进行不同的两次操作,而第一次你通过post发出了请求,第二次你想用get再一次发出请求的时候,发现需要再一次传与第一次相同的cookie,这样显得有些繁琐,这个时候用Session对象是一个很好维持会话的选择
对比一下同一个会话和不同会话的区别
#不同会话
url='http://httpbin.org/cookies/set/number/123456789'#该网址可以测试你的http,本操作cookies中加入了{‘number’:‘123456789’}
requests.get(url)
r=requests.get('http://httpbin.org/cookies')
print(r.text)
#同一对话
s=requests.session()
s.get(url)
r=s.get('http://httpbin.org/cookies')
print(r.text)
#先创建一个session对象,后在该session对象上进行操作
**
代理设置
----
若进行大规模数据进行多次请求时,会出现频繁请求,此时需要设置代理,本代码中代理可能失效,仅作为演示
try:
proxies={
'http':'http://61.135.217.7:80'
}
url='https://www.taobao.com'
r=requests.get(url,proxies=proxies)
r.raise_for_status()
r.encoding=r.apparent_encoding
print(r.text[:1000])
except Exception as e:
print('%s'%e)
## 身份认证 ##
本教程提供一种简单的身份认证方法,当我们登陆某些网站时,需要输入用户名和密码,request库提供了一个简单写法,可以直接传元组,会默认使用httpbasicauth这个类来认证
r=requests.get('https://qzone.qq.com/',auth=('username','password'))
print(r.status_code)
r.encoding=r.apparent_encoding
print(r.text[:1000])
'''Requests库实战'''
-----------------
**
-----------------
'''京东商品爬取'''
------------
try:
url3='https://item.jd.com/2967929.html'
r=requests.request('GET',url3,timeout=30)`r.encoding=r.apparent_encoding`
r.raise_for_status()
print(r.text[:500])
except:
print(‘加载异常’)
**
'''亚马逊商品页面的爬取'''
----------------
**
try:
url4='https://www.amazon.cn/gp/product/B01M8L5Z3Y'
hd={'User-Agent': 'Mozilla/5.0'}
r=requests.get(url4,headers=hd)
r.raise_for_status()
r.encoding=r.apparent_encoding
print(r.text[:1000])
except Exception as err:
print(‘加载异常,错误类型为:%s’%err)
“`
try:
url=’http://www.baidu.com/s’
kw={‘wd’:’python爬虫’}
r=requests.get(url,params=kw)
r.raise_for_status()
r.encoding=r.apparent_encoding
print(len(r.text))
print(r.url)
except Exception as err:
print(‘加载错误%s’%err)
**网络图片链接的格式:
http://www.example.com/picture.jpg
若想保存图片的名字为原名,则进行切片
引入os(操作系统)库,判断目录是否存在
如果文件不存在,则进行文件下载
try,except接收异常”’**
import os
url5=’http://image.nationalgeographic.com.cn/2017/0211/20170211061910157.jpg’
path=url5.split(‘/’)[-1]
try:
# if not os.path .exists(root):
# os.mkdir(root)
if not os.path.exists(path):
r=requests.get(url5)
r.raise_for_status()
with open(path,’w’) as f:
f.write(r.content)
print(‘%s success’%path)
else:
print(‘the picture has been downloaded.’)
except Exception as err:
print(‘Failed download:%s’%err)