爬虫之request模块
-
介绍
可以模拟发送http请求,基于urlib2:内置库,不太好用,繁琐,封装出requests模块,应用非常广泛(公司,人)
-
安装
pip3 install requests
-
使用
# 1 request模块基本使用
import requests
# 发送http请求
# 请求方法get,delete,post。。本质都是调用request函数
ret=requests.get('https://www.cnblogs.com')
print(ret.status_code) # 响应状态码
print(ret.text) # 响应体,转成了字符串
print(ret.content) # 响应体,二进制
# ret=requests.post()
# requests.get()和requests.request("get",)是一样的
# ret=requests.request("get",)
# ret=requests.delete()
# 2 get 请求带参数
# 方式一(直接携带参数需要考虑转码的问题)
ret = requests.get('https://www.baidu.com/?name=wd=%E7%BE%8E%E5%A5%B3',
headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebK it/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'
})
print(ret.text)
# 方式2(建议用方式二)中文会自动转码
ret=requests.get('http://0.0.0.0:8001/',params={'name':"美女",'age':18})
print(ret.text)
# 3 带headers
ret = requests.get('http://0.0.0.0:8001/?name=%E7%BE%8E%E5%A5%B3',
headers={
# 标志,什么东西发出的请求以及浏览器信息,在django框架从meta中获取
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',
# 上一个页面的地址,图片防盗链
# 'Referer': 'xxx'
# })
# print(ret)
# 图片防盗链:如果图片的referer不是我自己的网站,就直接禁止掉
# <img src="https://www.lgstatic.com/lg-community-fed/community/modules/common/img/avatar_default_7225407.png">
# 4 带cookie,随机字符串(用户信息:也代表session),不管后台用的token认证,还是session认证
# 一旦登陆了,带着cookie发送请求,表示登陆了(下单,12306买票,评论)
# 第一种方式
# ret = requests.get('http://0.0.0.0:8001/?name=%E7%BE%8E%E5%A5%B3',
# headers={
# 'cookie': 'key3=value;key2=value',
# })
# 第二种方式
# ret = requests.get('http://0.0.0.0:8001/?name=%E7%BE%8E%E5%A5%B3',
# cookies={"islogin":"xxx"})
# print(ret)
# 5 发送post请求(注册,登陆),携带数据(body)
#两种数据格式data=None, json=None
# data:urlencoded编码
ret=requests.post('http://0.0.0.0:8001/',data={'name':"lqz",'age':18})
# json:json编码
import json
data=json.dumps({'name':"lqz",'age':18})
ret=requests.post('http://0.0.0.0:8001/',json=data)
print(ret)
# 注意:编码格式是请求头中带的,所有我可以手动修改,在headers中改
# 6 session对象
session=requests.session()
# 跟requests.get/post用起来完全一样,但是它处理了cookie
# # 假设是一个登陆功能,并且成功
session.post()
# # 再向该网站发请求,就是登陆状态,不需要手动携带cookie
session.get("地址")
# 7 响应对象
# print(respone.text) # 响应体转成str
# print(respone.content) # 响应体二进制(图片,视频)
#
# print(respone.status_code) # 响应状态码
# print(respone.headers) # 响应头
# print(respone.cookies) # 服务端返回的cookie
# print(respone.cookies.get_dict()) # 转成字典
# print(respone.cookies.items())
#
# print(respone.url) # 当次请求的地址
# print(respone.history) # 如果有重定向,放到一个列表中
# ret=requests.post('http://0.0.0.0:8001/')
# ret=requests.get('http://0.0.0.0:8001/admin')
# #不要误解,是当次访问对象里面的重定向地址
# ret=requests.get('http://0.0.0.0:8001/user')
# print(ret.history)
# print(respone.encoding) # 编码方式
# 乱码问题
# 加载回来的页面,打印出来,乱码(我们用的是utf8编码),如果网站用gbk,
# ret.encoding='gbk'
#response.iter_content() # 视频,图片太大不能一次性取完,可以循环迭代取值
# with open("a.mp4",'wb') as f:
# for line in response.iter_content():
# f.write(line)
# ret=requests.get('http://0.0.0.0:8001/user')
# # ret.apparent_encoding获取当前页面的编码
# ret.encoding=ret.apparent_encoding
# 8 解析json
# 返回数据,有可能是json格式,有可能是html格式
# ret=requests.get('http://0.0.0.0:8001/')
# print(type(ret.text))# text拿到的是字符串格式
# print(ret.text)
#ret.json()可以自动转为json格式
# a=ret.json()
# print(a['name'])
# print(type(a))
#9.超时设置
#两种超时:float or tuple
#timeout=0.1 #代表接收数据的超时时间
#timeout=(0.1,0.2)#0.1代表链接超时 0.2代表接收数据的超时时间
import requests
respone=requests.get('https://www.baidu.com',
timeout=0.0001)
# 10 异常处理
# 用try except捕获一下 就用它就可以了:Exception
# 12 上传文件(爬虫用的比较少,后台写服务,)
file={'myfile':open("1.txt",'rb')}
ret=requests.post('http://0.0.0.0:8001/',files=file)
print(ret.content)
四.代理
# proxies参数中可设置代理地址
ret=requests.get('http://0.0.0.0:8001/',proxies={'http':'地址'})
#django如何拿到客户端ip地址
META.get("REMOTE_ADDR")
# 如果设置了代理则get得到的就是我们设置的代理而不是真实ip地址
代理池:列表,其实就是代理池的一种