记录原因:
对于做爬虫练习的时候部分网站获取不到内容,所以想到了使用中间人来获取网站 Response
mitmproxy 是什么?
mitmproxy 简单来说就是一个代理,相当于让你多走了一个转接,而它的作用就是在转接的过程中 记录 / 存储 / 修改 内容。
具体讲解自行百度
我的使用方法:
"""
flow.request.scheme 请求协议
flow.request.host 请求host
flow.request.url 请求URL链接
flow.request.method 请求方法
flow.request.query 请求URL查询参数
flow.request.path 请求URL https://www.baidu.com/
flow.request.path_components #请求URL不包含域名的元祖 ('project', 'classify', 'list')
flow.request.urlencoded_form 请求POST数据
flow.response.status_code HTTP响应状态码
flow.response.headers HTTP响应头信息
flow.response.get_text HTTP响应内容
"""
import asyncio
import os
import signal
import redis
from mitmproxy import proxy, options
from mitmproxy.tools.dump import DumpMaster
from mitmproxy.http import HTTPFlow
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
TENDIS_HOST = "127.0.0.1"
TENDIS_PORT = 6379
def get_tendis_client():
return redis.StrictRedis(
host=TENDIS_HOST,
port=TENDIS_PORT,
# password=TENDIS_DATA_PASSWD,
retry_on_timeout=True
)
class AddHeader:
def __init__(self):
self.asin_sets = set()
self.redis = get_tendis_client()
self.redis_quene_name = "【填一个Redis Key】"
self.logger = logger
def send_asin_to_redis(self, response):
self.redis.set(self.redis_quene_name, {"response": response})
def request(self, flow: HTTPFlow):
if "【填写请求网址的过滤条件】" in flow.request.url:
"""
【这里对此类网站的需求】
"""
pass
if __name__ == "__main__":
addons = [
AddHeader()
]
opts = options.Options(listen_host='0.0.0.0', listen_port=8888, mode="upstream:http://127.0.0.1:11111")
pconf = proxy.config.ProxyConfig(opts)
m = DumpMaster(opts)
m.server = proxy.server.ProxyServer(pconf)
m.addons.add(*addons)
try:
loop = asyncio.get_event_loop()
try:
loop.add_signal_handler(signal.SIGINT, getattr(m, "prompt_for_exit", m.shutdown))
loop.add_signal_handler(signal.SIGTERM, m.shutdown)
except NotImplementedError:
# Not supported on Windows
pass
m.run()
except (KeyboardInterrupt, RuntimeError):
pass
这个简单的脚本很好理解,listen_port 是转接你计算机的地址,你需要让它的端口与计算机开放的代理端口一致,如果需要开飞机的话,就需要使用mode 中代理地址了。
流程简化:
计算机提供端口 ----> 中间人监听(再此处操作开飞机) ----->请求目标网站
目标网站返回 -------> 中间人监听(在此处修改 / 存储 ) ------> 结果返回计算机
建议跟我一样的小白们去了解《三次握手四次挥手》,这充分讲解了计算机如何将内容展示给我们的具体过程。