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()))  # 转成对象  字典对象

image
image

2.正向代理和反向代理

1.什么是代理
代理就是一个中介,A和B本来可以直连,中间插入一个C,C就是中介
刚开始的时候,多数代理是帮助国内的客户端访问外网的服务端用的,houlaichule反向代理,也就是来自国外的客户端的请求转发到国内的服务端,从外到内。
2.正向代理
正向代理类似一个跳板机,直接访问访问不到,我们可以通过一个正向代理服务器,请求发送到代理,代理能够直接访问谷歌(或其他国外服务端),由代理发送请求到谷歌那到的数据再返回给我们,这样我们就能访问谷歌了。
正向代理的用途:
(1)访问原来无法访问的资源,如google
(2) 可以做缓存,加速访问资源
(3)对客户端访问授权,上网进行认证
(4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
image
3.反向代理
反向代理实际运行方式是指以代理服务器来接收internet的连接请求,然后转发给内部网络上的服务器。并从服务器上得到的返回结果返回给internet对的客户端,次时代的代理服务器对外就表现为一个服务器。
image
4.总结:
正向代理即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端。使用:vpn,爬虫中代理池。
反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端。使用:nginx,用nginx将请求转发给框架。
image

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
image
修改settings.py中的如下配置:

DB_CONN = 'redis://127.0.0.1:6379/0'

输入命令启动项目:

python proxyPool.py schedule

image
ok就是可以使用的代理:
image
这些成功的代理可以被加入到缓存:
image
启动webApi服务:

python proxyPool.py server

image
输入路由all可以拿到所有的路由:
image

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]>
posted @ 2023-03-16 17:21  ERROR404Notfound  阅读(44)  评论(0编辑  收藏  举报
Title