request-解析json、代理、代理池搭建
1.解析json
当我们发送http请求,返回的数据会有xml格式,也有json格式。json格式的数据我们转成字符串用res.json():
import requests
data = {
'cname': '',
'pid': '',
'keyword': '500',
'pageIndex': 1,
'pageSize': 10,
}
res = requests.post('http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword',data=data)
# print(res.text) # json 格式字符串---》json.cn
print(type(res.json())) # 转成对象 字典对象
2.正向代理和反向代理
1.什么是代理
代理就是一个中介,A和B本来可以直连,中间插入一个C,C就是中介
刚开始的时候,多数代理是帮助国内的客户端访问外网的服务端用的,houlaichule反向代理,也就是来自国外的客户端的请求转发到国内的服务端,从外到内。
2.正向代理
正向代理类似一个跳板机,直接访问访问不到,我们可以通过一个正向代理服务器,请求发送到代理,代理能够直接访问谷歌(或其他国外服务端),由代理发送请求到谷歌那到的数据再返回给我们,这样我们就能访问谷歌了。
正向代理的用途:
(1)访问原来无法访问的资源,如google
(2) 可以做缓存,加速访问资源
(3)对客户端访问授权,上网进行认证
(4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
3.反向代理
反向代理实际运行方式是指以代理服务器来接收internet的连接请求,然后转发给内部网络上的服务器。并从服务器上得到的返回结果返回给internet对的客户端,次时代的代理服务器对外就表现为一个服务器。
4.总结:
正向代理即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端。使用:vpn,爬虫中代理池。
反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端。使用:nginx,用nginx将请求转发给框架。
3.使用代理
如果爬虫使用自身的ip地址,很有可能ip地址被封了,以后就访问不了了,我们可以使用代理ip。
语法结构:
res = requests.post('https://www.cnblogs.com',proxies={'http':'地址+端口'})
import requests
res = requests.post('https://www.cnblogs.com', proxies={'http': '36.6.145.246:8089'})
print(res.status_code) # 200
# 现在我们发送请求就是以代理的36.6.145.246来访问的
高匿代理和透明代理:
高匿代理:服务端拿不到真实ip地址
透明代理:服务端能拿到真实客户端的ip地址,也能看到代理的ip地址
后端如何拿到真实的客户端ip地址?
http请求头中有个:X-Forwarded-For: client1, proxy1, proxy2, proxy3。
如果是高匿代理,那么第一个client1就是真实地客户端地址,proxy1, proxy2, proxy3就是其代理的ip。可以通过X-Forwarded-For拿到客户端真实地ip。
4.超时设置
import requests
respone=requests.get('https://www.baidu.com',timeout=0.0001)
# 超过0.0001秒就不再继续访问直接断开连接
5.异常处理
import requests
from requests.exceptions import * #可以查看requests.exceptions获取异常类型
try:
r=requests.get('http://www.baidu.com',timeout=0.00001)
except ReadTimeout:
print('===:')
# except ConnectionError: #网络不通
# print('-----')
# except Timeout:
# print('aaaaa')
except RequestException:
print('Error')
"""
我们正常使用一般加一个exceptException就可以了
"""
6.上传文件
import requests
files = {'file': open('美女.png', 'rb')}
respone = requests.post('http://httpbin.org/post', files=files)
print(respone.status_code)
# 一般会使用这个将文件提交给同事
7.代理池搭建
我们使用requests发送请求需要使用的代理,代理可以是公司花钱买,也可以自己搭建免费的代理池。
参考项目:https://github.com/jhao104/proxy_pool
修改settings.py中的如下配置:
DB_CONN = 'redis://127.0.0.1:6379/0'
输入命令启动项目:
python proxyPool.py schedule
ok就是可以使用的代理:
这些成功的代理可以被加入到缓存:
启动webApi服务:
python proxyPool.py server
输入路由all可以拿到所有的路由:
import requests
import urllib3
# 关闭警告
urllib3.disable_warnings()
res = requests.get('http://192.168.1.45:5010/get/').json()
# 想获取代理的项目发送方get请求,获取代理,get请求是随机拿到一个代理。通过.json()拿到的就是一个字典
proxies = {}
if res['https']:
proxies['https'] = res['proxy']
else:
proxies['http'] = res['proxy']
print(proxies) # {'https': '175.10.205.67:4780'} 每次拿到的结果都是不一样的,随机拿到一个代理
res = requests.post('https://www.cnblogs.com',proxies=proxies,verify=False)
print(res) # <Response [200]>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律