爬虫之Reuqests模块使用

一、GET请求

'''
GET请求:
      没有请求体
      数据不能超过1k
      请求的数据会暴露在浏览器的地址栏中
'''

1、基本的get请求:

import requests
# 1、基本请求
res=requests.get('http://127.0.0.1:8000/index')
print(res.text)

2、带参数的GET请求:

(1) params

# 请求地址中携带数据(两种方式)
# 第一种,用urlencode进行编码
from urllib.parse import urlencode,unquote  #urlencode是进行url编码,unquote是解码
res=requests.get('https://www.baidu.com/s?wd=斗罗大陆')
print(res.url)
# 第二种: 用params(推荐用这种,因为它会自动对请求参数进行url编码
res=requests.get('https://www.baidu.com/s',params={'wd':'斗罗大陆'})
print(res.url)

(2)headers

'''
header请求头中,通常放有Host,Referer,User-Agent,Cookie等
Host:主机
Referer:主要用来解决防盗链问题(一些网站会根据这个参数来判断请求源是不是来自自身网站)
User_Agent: 浏览器标识,主要用来解决检测是否是浏览器发起的问题
Cookie:用来存放用户记录,比如账号登陆后产生cookie,这样浏览器其他页面就可以根据cookie来判断该用户是否登陆了。request模块有单独的参数来处理该字段。
'''
header = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36',
    'referer':'https://www.baidu.com'
}
res=requests.get('https://www.baidu.com/s',headers=header)

(3) cookies

# 请求代cookie的两种方式
# 1、放在headers中
header = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36',
    'cookie':'cookie值'
}
res=requests.get('https://www.baidu.com/s',headers=header)
# 2、用request模块中的cookies参数
# cookies可以是一个字典或者cookiesjar对象
from http.cookiejar import CookieJar
# 创建一个cookie对象
cookiejar = CookieJar()
res=requests.get('https://www.baidu.com/s',cookies={'key':'value'})
res=requests.get('https://www.baidu.com/s',cookies=cookiejar)

二、POST请求

'''
POST请求:
      数据不会出现在地址栏中
      数据大小没有限制
      有请求体
      请求体如果有中文或者特殊符号,要使用url编码

'''
#自动携带cookie
session=requests.session()
res =session.post('https://kao.acmcoder.com/enterprise/loginc',data={'phone': '13927037099','pwd': '12345678'},headers=headers)
#这时,再请求该网站的其他页面,不需要带cookies
res1=session.get('https://kao.acmcoder.com/index')
# 发送post请求,携带数据(urlencoded和json)
# res=requests.post('http://127.0.0.1:8000/index/',data={'name':'hello'})
# print(res.text)

# res=requests.post('http://127.0.0.1:8000/index/',json={'age':1,},)
# print(res.text)

注意:post请求 默认请求头是:application/x-www-form-urlencoed,如果请求头设置成application/json,则可以用json传值给后台,不能用data传值(因为data是urlencode)

 

三、Response响应

1、response响应对象属性

res=requests.get('https://www.baidu.com/')
res.text    #响应的文本
res.content #响应体的二进制数据,一般是用来获取响应对象中的文件、图片,视频二进制数据
res.status_code #响应状态码
res.headers  #响应头
res.cookies  # 获取cookie
res.cookies.get_dict()  #将cookie转成字店
res.cookies.items()   #将cookie数据转化成key,value形式
res.url  #获取请求的url
res.history  #放重定向之前的地址
res.encoding  #响应的编码方式
res.iter_content()  # 获取图片,视频,大文件数据,循环取出
for line in res.iter_content():
    f.write(line)
'''
注意:如果遇到打印出来出现乱码,可以用一下两个方法解决:
方法1:
res.encoding='gb2312'
方法2:
res.encoding=res.apparent_encoding
'''

json数据解析

import json
res.json()
#等价于
json.loads(res.text)

 

四、requests的高级用法

1、证书验证问题

# SLL证书的验证问题
# 方法1:verify设置为false,忽略对SLL证书的验证
respone=requests.get('https://www.12306.cn',verify=False) #不验证证书,但是会有警告
#方法2:
from requests.packages import urllib3
urllib3.disable_warnings() #关闭警告
respone=requests.get('https://www.12306.cn',verify=False) #不验证证书,也没有警告
# 方法3:添加证书
respone=requests.get('https://www.12306.cn',
                     cert=('/path/server.crt',
                           '/path/key'))

2、设置代理

response=requests.get('http://127.0.0.1:8000/index',proxies={'http':'代理ip:port','https':})
'''
 高匿和透明代理::高匿代理,后端无论如何拿不到你的ip,透明代理,后端能够拿到你的ip
 还可以用代理池,每次请求都随机从代理池中取一个
 后端拿到透明代理的ip方法,  后端取参数:X-Forwarded-For
'''

3、超时设置:

timeout=0.1  #代表接收数据超时时间 ,float类型超时
timeout=(0.1,0.2) # 第一个参数0.1代表连接超时,第二个参数代表数据接收超时,tuple类型超时
res=requests.get('http://www.baidu.com',timeout=timeout)

4、上传文件

res=requests.post('http:127.0.0.1:8000/index',files={'myfile':open('xx.jpg','rb')})

5、其他设置

#  认证设置(你见不到了)
import requests
r=requests.get('xxx',auth=('user','password'))
print(r.status_code)


# 异常处理
import requests
from requests.exceptions import * #可以查看requests.exceptions获取异常类型

try:
     r=requests.get('http://www.baidu.com',timeout=0.00001)
except ReadTimeout:
     print('===:')
except Exception as e:
     print(e)

 

posted @ 2020-12-16 22:48  NQ31  阅读(177)  评论(0编辑  收藏  举报