模块安装
pip install requests
requests之request请求
request
常用于Django项目中
print(request.path) #获取request.path当前请求路径
print(request.method) #获取当前请求方式(get,post...)
print(request.GET) #获取所有get请求携带过来的数据
print(request.POST) #获取所有post请求携带过来的数据
print(request.body) #获取所有post请求携带过来的数据的原始格式
print(request.META) #请求头信息,将来用到哪个咱们再说哪个
print(request.get_full_path()) #获取请求页面的全部路径 #/customers/?page=5
print(request.is_ajax()) #判断是不是ajax发送的请求,True和False
请求方式
常用的就是requests.get()和requests.post()
看源码可知,requests.get及requests.post等方法都还是调用了request方法
方法 | 说明 |
---|---|
requests.request() | 构造一个请求,支撑以下各个方法的基础方法 |
requests.get() | 获取HTML页面的主要方法,对应的是HTTP的GET |
requests.post() | 向HTML页面提交POST请求的方法,对应的是HTTP的POST |
requests.head() | 获取HTML网页头信息的方法,对应于HTTP的HEAD |
requests.put() | 向HTML页面提交PUT请求的方法,对应于HTTP的PUT |
requests.patch() | 向HTML页面提交局部修改请求,对应于HTTP的PATCH |
requests.delete() | 向HTML页面提交删除的请求,对应于HTTP的DELETE |
请求URL
在数据采集前,确定页面的加载方式(是静态加载还是动态加载),确定需要获取资源的URL
请求头
如何向添加HTTP头部,只是简单的传递一个dict给headers参数就可以了
from fake_useragent import UserAgent
headers = {"User-Agent": UserAgent().random,"data_name":"LCH"}
response=requests.get('http://www.baidu.com',headers=headers)
有些网站对了拒绝通过代码实现的请求,会在接受请求时,对发送请求的载体进行校验,请求头中的‘User-Agent’参数就是请求载体的唯一标识,因此一般需要定制请求头加入载体标识,这也是一种反 反爬策略:UA伪造
方式一:
- 唯一指定请求载体身份
import requests
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}
response=requests.get('http://www.baidu.com',headers=headers)
print(response.encoding) #百度编码格式为ISO-8859-1
response.encoding='utf-8'
print(response.text)
唯一指定请求载体
方式二:
- 通过fake-useragent随机生成
import requests
from fake_useragent import UserAgent #fake-useragent 随机生成请求载体
headers={'User-Agent':UserAgent().random} #随机获取一个请求载体
response=requests.get('http://www.baidu.com',headers=headers)
print(response.encoding) #百度编码格式为ISO-8859-1
response.encoding='utf-8'
print(response.text)
请求参数
requests.request()
requests.request(method,url,kwargs)
-
method 请求方式,对应get/put/post等方法
-
url 获取页面的url链接
-
**kwargs 控制访问参数,共13个
-
参数 作用 params 字典或字节系列,作为参数增加到url中 data 字典、字节序列或者文件对象,作为Request对象 json JSON格式的数据,作为Request的内容 headers 字典:HTTP定制头 cookies 字典或CookieJar,Request中的auth;元祖支持HTTP认证功能 files 字典类型,传输文件 timeout 设定超时时间,秒为单位 proxies 字典类型,设定代理访问服务器,可以增加登录认证 allow_redirects TrueFalse,默认为True,重定向开关 stream TrueFalse,默认为True,获取内容立即下载开关 verify TrueFalse,默认为True,认证SSL证书开关 cert 本地SSL证书 auth 元祖,支持HTTP认证功能
-
import requests
requests.get('https://api.github.com/events')
requests.post('http://httpbin.org/post', data = {'key':'value'})
requests.put('http://httpbin.org/put', data = {'key':'value'})
requests.delete('http://httpbin.org/delete')
requests.head('http://httpbin.org/get')
requests.options('http://httpbin.org/get')
get请求参数
get请求通过URL的查询字符串(querystring)传递某种数据。如果你是手工构建URL,那么数据会以键值对的形式置于URL中,跟在一个问号的后面。例如, https://movie.douban.com/typerank?type_name=动作&type=5&interval_id=100:90&action=&qq-pf-to=pcqq.c2c(豆瓣动作片评分)。 Requests允许你使用params关键字参数,以一个字符串字典来提供这些参数。
import requests
from fake_useragent import UserAgent
headers={'User-Agent':UserAgent().random}
START=0
END=2000 #如果循环爬取,起始位置数据计数会有大量重复,因此设置起始值爬取
f=open('豆瓣动作片评分.txt','w',encoding='utf-8')
url=f'https://movie.douban.com/j/chart/top_list'
params={
'type':'5',
'interval_id':'100:90',
'action':'',
'start':START,
'limit':END,
}
response = requests.get(url=url, params=params, headers=headers) get请求参数params
data=response.json()
for movie in data:
f.write(f'{movie["rank"]} {movie["title"]} {movie["score"]}
')
f.close()
post请求参数
你想要发送一些编码为表单形式的数据——非常像一个 HTML 表单。要实现这个,只需简单地传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式。
# http://www.kfc.com.cn/kfccda/storelist/index.aspx #肯德基城市位置查询
import requests
from fake_useragent import UserAgent
headers={'UserAgent':UserAgent().random} #随机生成UA
url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
city=input('请输入查询城市>>>')
data={
'cname':'',
'pid':'',
'keyword':city,
'pageIndex':'1',
'pageSize':'100',
}
response=requests.post(url,data=data,headers=headers) #post请求参数data
for i in response.json()['Table1']:
print(i['addressDetail'])
timeout参数
requests 在经过以 timeout
参数设定的秒数时间之后停止等待响应。基本上所有的生产代码都应该使用这一参数。如果不使用,你的程序可能会永远失去响应。
# http://www.kfc.com.cn/kfccda/storelist/index.aspx #肯德基城市位置查询
import requests
from fake_useragent import UserAgent
headers={'UserAgent':UserAgent().random} #随机生成UA
url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
city=input('请输入查询城市>>>')
data={
'cname':'',
'pid':'',
'keyword':city,
'pageIndex':'1',
'pageSize':'100',
}
response=requests.post(url,data=data,headers=headers,timeout=0.1) #post请求参数data
for i in response.json()['Table1']:
print(i['addressDetail'])
注意
timeout 仅对连接过程有效,与响应体的下载无关。 timeout 并不是整个下载响应的时间限制,而是如果服务器在 timeout 秒内没有应答,将会引发一个异常(更精确地说,是在 timeout 秒内没有从基础套接字上接收到任何字节的数据时)If no timeout is specified explicitly, requests do not time out.
requests之response响应
任何时候进行了类似 requests.get() 的调用,都在做两件主要的事情。其一,你在构建一个 Request 对象, 该对象将被发送到某个服务器请求或查询一些资源。其二,一旦 requests
得到一个从服务器返回的响应就会产生一个 Response
对象。该响应对象包含服务器返回的所有信息,也包含你原来创建的 Request
对象。
import requests
response = requests.get('http://www.baidu.com')
print(response.status_code) # 打印状态码
print(response.url) # 打印请求url
print(response.headers) # 打印头信息
print(response.cookies) # 打印cookie信息
#response.encoding='utf-8'/'gbk'#解决编码问题,或者对需要提取的内容进行部分编解码操作(数据解析会讲)
print(response.text) #以文本形式打印网页源码---文本内容
print(response.content) #以字节流形式打印-----图片/音频/视频
print(response.json()) #以json形式打印----数据接口API
print(response.encoding) #输出页面内容编码格式(如ISO-8859-1)可以指定编码确保输出不乱码