Python-requests 模块
requests 模块
Python中原生的基于网络请求的模块, 主要用来发送 HTTP 请求, 简单便捷, 效率极高.
工作流程:
- 指定url
- 发起请求
- 获取响应数据
- 持久化存储
requests 请求
requests 方法如下:
方法 | 描述 |
---|---|
delete(url, args) | 发送 DELETE 请求到指定 url |
get(url, params, args) | 发送 GET 请求到指定 url |
head(url, args) | 发送 HEAD 请求到指定 url |
patch(url, data, args) | 发送 PATCH 请求到指定 url |
post(url, data, json, args) | 发送 POST 请求到指定 url |
put(url, data, args) | 发送 PUT 请求到指定 url |
request(method, url, args) | 向指定的 url 发送指定的请求方法 |
response 对象
每次调用 requests 请求之后, 会返回一个 response 对象, 该对象包含了具体的响应信息.
响应信息如下:
属性或方法 | 说明 |
---|---|
apparent_encoding | 编码方式 |
close() | 关闭与服务器的连接 |
content | 返回响应的内容, 以字节为单位 |
cookies | 返回一个 CookieJar 对象, 包含了从服务器发回的 cookie |
elapsed | 返回一个 timedelta 对象, 包含了从发送请求到响应到达之间经过的时间量, 可以用于测试响应速度. 比如 r.elapsed.microseconds 表示响应到达需要多少微秒. |
encoding | 解码 r.text 的编码方式 |
headers | 返回响应头, 字典格式 |
history | 返回包含请求历史的响应对象列表(url) |
is_permanent_redirect | 如果响应是永久重定向的 url, 则返回 True, 否则返回 False |
is_redirect | 如果响应被重定向, 则返回 True, 否则返回 False |
iter_content() | 迭代响应 |
iter_lines() | 迭代响应的行 |
json() | 返回结果的 JSON 对象对应的python格式 (结果需要以 JSON 格式编写的, 否则会引发错误) |
links | 返回响应的解析头链接 |
next | 返回重定向链中下一个请求的 PreparedRequest 对象 |
ok | 检查 "status_code" 的值, 如果小于400, 则返回 True, 如果不小于 400, 则返回 False |
raise_for_status() | 如果发生错误, 方法返回一个 HTTPError 对象 |
reason | xxxxxxxxxx3 1print(os.path.isdir("F:/python/NoDir")) # False2print(os.path.isdir("F:/python")) # True3print(os.path.isfile('./test.txt')) # Truepython |
request | 返回请求此响应的请求对象 |
status_code | 返回 http 的状态码, 比如 404 和 200(200 是 OK,404 是 Not Found) |
text | 返回响应的内容, unicode 类型数据 |
url | 返回响应的 URL |
简单使用
import requests
url = "https://www.cnblogs.com/"
rsp = requests.get(url)
print(rsp.encoding) # utf-8
sc = rsp.text # 获取页面源代码
with open("博客园.html", 'w', encoding='utf-8') as f:
f.write(sc)
UA伪装
User-Agent:
- Http协议中的一部分, 属于头域的组成部分.
- UA是一种向访问网站提供你所使用的浏览器类型、操作系统、浏览器内核等信息的标识. 通过这个标识, 用户所访问的网站可以显示不同的排版, 从而为用户提供更好的体验或者进行信息统计. 例如, 百度、新浪等网站用手机访问和电脑访问是不一样的, 这是因为网站根据访问者的UA判断后, 进行了不同的设置和处理.
- 通俗地讲, UA是请求载体的身份标识.
UA检测: 门户网站的服务器会检测对应请求的载体身份标识, 如果UA不是基于某一款浏览器, 则请求可能被拒绝.
import requests
url0 = "https://cn.bing.com/search?q=爬虫"
# 将url携带的参数以及请求头信息封装到字典中
url = "https://cn.bing.com/search?"
kw = input("Enter a keyword: ")
params = {
'q': kw
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.42"
}
rsp = requests.get(url=url, params=params, headers=headers)
file_name = kw + '.html'
encoding = rsp.encoding
with open(file_name, 'w', encoding=encoding) as f:
f.write(rsp.text)
post 请求
- GET 请求的参数在url中可见, 隐私性安全性较差, 且参数长度有限
POST 请求传递参数放在Request body中, 不会在url中显示, 比 GET 要安全, 且参数长度无限制 - GET 请求只能进行url编码
POST 支持多种编码方式 - GET 请求刷新浏览器或回退时没有影响
POST 回退时会重新提交数据请求 - GET 请求可被缓存
POST 请求不会被缓存 - GET 请求比较常见的方式是通过url地址栏请求
POST 最常见是通过form表单发送数据请求
import requests
# 请求行显示: POST /sug HTTP/1.1
url = 'https://fanyi.baidu.com/sug'
kw = input("输入要翻译的内容: ")
data = {
"kw": kw
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 "
"Safari/537.36 Edg/106.0.1370.42 "
}
rsp = requests.post(url, data, headers=headers)
# 响应头显示: Content-Type: application/json
result_dic = rsp.json()
result = result_dic.get('data', "没有结果")
print(result)
JSON 数据
import requests
import json
url = 'https://movie.douban.com/j/chart/top_list?'
params = {
'type': '17', # '17'代表科幻类型
'interval_id': '100:90', # 好于100%-90%的科幻片
'action': '', # "playable+unwatched": "我没看过"以及"可在线播放"
'start': '0', # 索引从0开始
'limit': '5' # 5个结果
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 "
"Safari/537.36 Edg/106.0.1370.42"
}
rsp = requests.get(url, params, headers=headers)
result_dic = rsp.json() # 响应结果是json类型数据
# result_str = rsp.text 以字符串的类型返回结果
with open('douban_rank.json', 'w', encoding='utf-8') as f:
json.dump(result_dic, fp=f, ensure_ascii=False)