码迷,mamicode.com
首页 > 编程语言 > 详细

Python 使用BrowserMob Proxy + selenium 获取Ajax加密数据

时间:2020-07-15 23:28:47      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:form   ror   adl   com   cert   color   span   erro   二进制   

BrowserMob Proxy,简称 BMP,它是一个 HTTP 代理服务,我们可以利用它截获 HTTP 请求和响应内容。

第一步:先安装 BrowserMob Proxy 的包。

pip install browsermob-proxy

技术图片

 

 

 第二步:下载 browsermob-proxy 的二进制文件,用于启动 BrowserMob Proxy。

下载地址:https://github.com/lightbody/browsermob-proxy/releases

技术图片

 

 

 第三步:将下载好的文件直接放到项目目录下。

代码走起:

# _*_ coding:utf-8 _*_
import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from browsermobproxy import Server
import time
import json


class BaseFramework(object):

    def __init__(self):
        self.server = Server(./browsermob-proxy-2.1.4/bin/browsermob-proxy)
        self.server.start()
        self.proxy = self.server.create_proxy()
        chrome_options = Options()
        chrome_options.add_argument(--ignore-certificate-errors)
        chrome_options.add_argument(--proxy-server={0}.format(self.proxy.proxy))
        chrome_options.add_argument(--headless)  # 无头模式
        self.browser = webdriver.Chrome(options=chrome_options)

    def process_request(self, request, response):
        pass

    def process_response(self, response, request):
        pass

    def run(self, func, *args):
        self.proxy.new_har(options={
            captureContent: True,
            captureHeaders: True
        })
        func(*args)
        result = self.proxy.har
        for entry in result[log][entries]:
            request = entry[request]
            response = entry[response]
            self.process_request(request, response)
            self.process_response(response, request)

    def __del__(self):
        self.proxy.close()
        self.browser.close()


class Framework(BaseFramework):

    def load(self, url):
        self.browser.get(url)
        time.sleep(3)

    def process_request(self, request, response):
        pass

    def process_response(self, response, request):
        # print(request[‘url‘])
        if /item/timemap/cn/ in request[url]:
     # 找到你所需数据的url即可快乐的解析数据了
try: text = response[content][text] text_dict = json.loads(text) data_result = text_dict[data] except KeyError: print(----KeyError: text----) return name = data_result[name] # 姓名 id_name = name_id + _ + name print(id_name) time_map_list = data_result[timeMap] if time_map_list: time_map_dict = {} for i in range(len(time_map_list)): time_map = time_map_list[i] time_map_dict[str(i)] = time_map else: return path = f./****/{id_name}.json if os.path.exists(path): print(f------{id_name}--已存在------) return with open(path, w, encoding=utf-8) as f: f.write(json.dumps(time_map_dict, ensure_ascii=False, indent=4)) if __name__ == __main__: Framework = Framework() id_list = [********] for name_id in id_list: url = "************************" Framework.run(Framework.load, url)

 

注意:如果没有装java,可能会报错,自行百度安装java,并将配置java环境。

结果如下:

技术图片

 

 

 

 

 

解释解释:

代码一共分了四步:

•第一步便是启动 BrowserMob Proxy,它会在本地启动一个代理服务,这里注意 Server 的第一个参数需要指定 BrowserMob Proxy 的可执行文件路径,这里我就指定了下载下来的 BrowserMob Proxy 的 bin 目录的 browsermob-proxy 的路径。
•第二步便是启动 Selenium 了,它可以设置 Proxy Server 为 BrowserMob Proxy 的地址。
•第三步便是访问页面同时监听结果,这里我们需要调用 new_har 方法,同时指定捕获 Resopnse Body 和 Headers 信息,紧接着调用 Selenium 的 get 方法访问一个页面,这时候浏览器便会加载这个页面,同时所有的请求和响应信息都会被记录到 HAR 中。
•第四步便是读取 HAR 到内容了,我们调用 log 到 entries 字段,里面便包含了请求和响应的具体结果,这样所有的请求和响应信息我们便能获取到了,Ajax 的内容也不在话下。

有了这个我们就不需要非得等页面加载出来之后再根据页面渲染结果提取信息了,Ajax 请求直接拿原始数据,爽歪歪!

 

Python 使用BrowserMob Proxy + selenium 获取Ajax加密数据

标签:form   ror   adl   com   cert   color   span   erro   二进制   

原文地址:https://www.cnblogs.com/loren880898/p/13307090.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!