之前有写过一篇文章,使用Selenium+Browsermob-Proxy 获取浏览器Network请求和响应(地址:https://blog.csdn.net/qq_32502511/article/details/101536325),发现评论里面有很多同志都说获取不到内容或者对HTTPS请求不行,今天在这里重新写个简单的例子给大家参考,这里以模拟登陆华润通H5页面为例。

华润通页面地址:https://cloud.huaruntong.cn/web/m/#/homePage (注意:说HTTPS不行的同志注意了,这里演示的网址也是个HTTPS的)

首先我们来看一下手动登录时候是什么样的流程,打开华润通页面如图1所示。

图1

点击下面菜单栏的【我的】选项,将会引导我们跳转到登录页面,如图2和图3所示:

图2

图3

在登录页面我们看到有几种登录方式,这里我们选择页面底部的【快捷登录】,之后会进入到快捷登录页面,如图4所示。

图4

输入手机号和验证码即可完成登录,我们打开F12看一下发送验证码的时候会发送什么请求,如图5和图6所示。

图5

图6

可以从图中看到,当点击发送验证码按钮的时候,会触发一个事件,向:https://mid.huaruntong.cn/api/user/validateCodeSend 发送一个POST请求,获得的返回内容为:{"code":"S0A00000","data":{},"msg":"操作成功!"}  ,接下来我们要演示的就是使用Browsermob-Proxy拦截这个请求的响应内容。相关的步骤如下:

步骤1:环境准备,确保电脑安装了JDK,最好是JDK1.8版本的,因为Browsermob-Proxy的运行需要JDK的支持,然后去:https://github.com/lightbody/browsermob-proxy/releases 这个地址下载 browsermob-proxy,我这里下载的版本如图7所示。

图7

下载好browsermob-proxy-2.1.4-bin.zip后,解压,在bin目录下能够看到有 browsermob-proxy.bat 文件表示正确。最后还需要确保Selenium环境也要正确,作者这里面使用的相关环境版本为:

1.Python3.8

2.selenium ==3.141.0

3.用到的谷歌浏览器及其驱动版本为:76 版本的

步骤2:确保环境以及准备好后,现在开始编写代码进行模拟发送验证码并且拦截打印请求响应内容这个操作,相关的代码步骤如下:

(1)引入需要用到的方法

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
from comm.get_user_agent import get_ua
import time
import json
import urllib.parse
from browsermobproxy import Server

这里引用到的 get_ua中的代码为:

import randomdef get_ua():first_num = random.randint(55, 76)third_num = random.randint(0, 3800)fourth_num = random.randint(0, 140)os_type = ['(iPhone; CPU iPhone OS 13_2_3 like Mac OS X)', '(iPad; CPU OS 11_0 like Mac OS X)','(Linux; Android 6.0.1; Moto G (4))']chrome_version = 'Chrome/{}.0.{}.{}'.format(first_num, third_num, fourth_num)ua = ' '.join(['Mozilla/5.0', random.choice(os_type), 'AppleWebKit/537.36','(KHTML, like Gecko)', chrome_version, 'Safari/537.36'])return ua

(2)创建  browsermobproxy 对像,主要目的是开启一个本地代理IP,后面所有请求都会从这个代理过,这里需要注意指定 browsermob-proxy.bat 的启动位置,代码如下:

server = Server(path="D:\\work\\huaruntong_porject\\browser_tools\\browsermob-proxy-2.1.4\\bin\\browsermob-proxy.bat")
server.start()
proxy = server.create_proxy()
print(proxy.proxy)

(3)初始化Selenium以及运行时相关的头部信息,如下:

chromedrive_path= "F:\\liuyanlin_work\\huaruntong\\huaruntong_porject\\browser_tools\\chromedriver.exe"
binary_location="F:\\liuyanlin_work\\huaruntong\\huaruntong_porject\\browser_tools\\Chrome-bin\\chrome.exe"
options = Options()
options.binary_location = binary_location
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_argument('--incognito')
options.add_argument('disable-infobars')
options.add_argument('log-level=3')
options.add_argument("--auto-open-devtools-for-tabs")
options.add_argument('--proxy-server={0}'.format(proxy.proxy))
# options.add_argument('--headless')
user_agent = get_ua()
options.add_argument('user-agent=%s' % (user_agent))
driver = Chrome(options=options, executable_path=chromedrive_path)

(4)接下来就可以进行正式的模拟操作了,但是这里还需要注意一下,在使用实例化好的driver 进行打开页面之前,还需要加上一句代码

proxy.new_har("huaruntong", options={'captureHeaders': True, 'captureContent': True})

这一步主要是告诉browsermobproxy我需要监听记录的是请求和响应,并对我这一个设置取了个名字叫:huaruntong 这个是自己随便取的。

(5)接下来我们开始用从 https://cloud.huaruntong.cn/web/m/#/homePage 这个入口进行一步步到登录页面发送验证码的地方,参考代码如下:

driver.get("https://cloud.huaruntong.cn/web/m/#/homePage")
time.sleep(0.5)
#模拟点击底部我的按钮
driver.find_element_by_xpath('//*[@id="app"]/div/div/div/div[3]/span').click()
time.sleep(0.5)
#点击立即登录按钮
driver.find_element_by_xpath('//*[@id="app"]/div/div[3]').click()
time.sleep(0.5)
#点击快捷登录按钮
driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/a[2]').click()
time.sleep(1)
#输入手机号
driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div[1]/div[2]/input').send_keys("18200157376")
#模拟点击发送验证码按钮
driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div[2]/div[2]/div').click()

(6)从 proxy.har 记录的请求日志重进行过滤打印出我们需要的的 https://mid.huaruntong.cn/api/user/validateCodeSend 请求响应内容

result = proxy.har
for entry in result['log']['entries']:_url = entry['request']['url']print("请求地址:",_url)if "https://mid.huaruntong.cn/api/user/validateCodeSend" in _url:_response = entry['response']_content = _response['content']print("---------https://mid.huaruntong.cn/api/user/validateCodeSend 请求响应内容:",_content)
server.stop()
driver.close()
driver.quit()

最后完整的代码为:

#coding=utf-8
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
from comm.get_user_agent import get_ua
import time
from browsermobproxy import Serverserver = Server(path="D:\\work\\huaruntong_porject\\browser_tools\\browsermob-proxy-2.1.4\\bin\\browsermob-proxy.bat")
server.start()
proxy = server.create_proxy()
print(proxy.proxy)
chromedrive_path= "F:\\liuyanlin_work\\huaruntong\\huaruntong_porject\\browser_tools\\chromedriver.exe"
binary_location="F:\\liuyanlin_work\\huaruntong\\huaruntong_porject\\browser_tools\\Chrome-bin\\chrome.exe"
options = Options()
options.binary_location = binary_location
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_argument('--incognito')
options.add_argument('disable-infobars')
options.add_argument('log-level=3')
options.add_argument("--auto-open-devtools-for-tabs")
options.add_argument('--proxy-server={0}'.format(proxy.proxy))
# options.add_argument('--headless')
user_agent = get_ua()
options.add_argument('user-agent=%s' % (user_agent))
driver = Chrome(options=options, executable_path=chromedrive_path)
proxy.new_har("huaruntong", options={'captureHeaders': True, 'captureContent': True})
driver.get("https://cloud.huaruntong.cn/web/m/#/homePage")
time.sleep(0.5)
#模拟点击底部我的按钮
driver.find_element_by_xpath('//*[@id="app"]/div/div/div/div[3]/span').click()
time.sleep(0.5)
#点击立即登录按钮
driver.find_element_by_xpath('//*[@id="app"]/div/div[3]').click()
time.sleep(0.5)
#点击快捷登录按钮
driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/a[2]').click()
time.sleep(1)
#输入手机号
driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div[1]/div[2]/input').send_keys("18200157376")
#模拟点击发送验证码按钮
driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div[2]/div[2]/div').click()
#----------------------
#
result = proxy.har
for entry in result['log']['entries']:_url = entry['request']['url']print("请求地址:",_url)if "https://mid.huaruntong.cn/api/user/validateCodeSend" in _url:_response = entry['response']_content = _response['content']print("---------https://mid.huaruntong.cn/api/user/validateCodeSend 请求响应内容:",_content)
server.stop()
driver.close()
driver.quit()

运行结果如图8所示:

补充知识点:

1.由于Browsermob-Proxy本身自己就是一个代理服务,那么有时候我们有这种需求,比如某个网站封ip封得厉害,这时候就需要使用代理ip了,那么怎么将Browsermob-Proxy的出口ip改成一个买的代理ip了,也就是所谓的实现二级代理。例如我这里有个代理ip是可以用的:61.155.141.13:20345  接下来我要将这个代理ip挂到Browsermob-Proxy服务上,其实很简单,只需要在创建server的时候带上一个参数,例如下面的代码:

proxy = server.create_proxy({"httpProxy":"61.155.141.13:20345"})

2.这里再告诉大家一个Browsermob-Proxy的小坑,就是每次打开Browsermob-Proxy后,都会使用一个新端口,直接调用 server.stop() 方法并不能真正的关闭这个端口,我们可以通过按住ctrl建点击 server.stop() 底层进去找到如图10所示部分添加一段代码进行强制杀掉每次使用完毕后不用的端口:

###添加以下内容
find_port = 'netstat -aon|findstr %s' % self.port
result = os.popen(find_port)
text = result.read()
pid_line = text.split('\n', 1)[0]
pid = pid_line.replace(" ", "").split("LISTENING")[1]
find_kill = 'taskkill -f -pid %s' % pid
result = os.popen(find_kill)
cmd = result.read()
cmd.close()

Selenium+Browsermob-Proxy 爬虫-获取浏览器Network请求和响应(新示例)相关推荐

  1. 【PHP】获取浏览器HTTP请求header信息、获取服务器HTTP响应header信息

    一.认识HTTP HTTP协议历史及设计思路(点击浏览) 二.获取浏览器HTTP请求header信息 1. Apach服务器下可以直接使用 PHP自带函数获取客户端HTTP请求头信息 /*作用:获取客 ...

  2. 爬虫工作流程、请求与响应原理、requests库讲解

    爬虫工作流程.请求与响应原理.requests库讲解 爬虫分类主要分为两大板块 web爬虫(浏览器爬虫) APP爬虫(手机端爬虫) 在这两大板块中又可以把爬虫归类为聚焦爬虫和通用爬虫 聚焦爬虫:针对某 ...

  3. python+selenium小结5:获取浏览器版本号,当前URL,当前页面title

    from selenium import webdriver import timeoptions = webdriver.ChromeOptions() prefs = {'profile.defa ...

  4. Python爬虫(一)_HTTP的请求与响应

    HTTP和HTTPS HTTP(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收HTML页面的方法 HTTPS(HyperText Transfer Prot ...

  5. python爬虫(二)_HTTP的请求和响应

    HTTP和HTTPS HTTP(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收HTML页面的方法 HTTPS(HyperText Transfer Prot ...

  6. 记录因为端口号使用6000,造成浏览器GET请求无响应

    java项目使用6000端口,造成的问题记录! 网页可能暂时无法连接,或者它已永久性地移动到了新网址. ERR_UNSAFE_PORT 同事Springboot项目的Get接口,可以在postman访 ...

  7. 对于苹果手机(ios)微信浏览器 ajax请求无法响应问题

    最近在项目中遇到一个问题,ajax请求一切都是正常的,但是移到了 苹果手机上就出问题了,难了我好久都没发现问题所在,后来测试用get 方式发现 几乎是没有问题的!那么是哪里出了问题了!于是到ios 的 ...

  8. 浏览器查看请求与响应报文

    首先打开开发者模式(右键检查)再按照图示顺序:

  9. scrapy如何获取network请求相关信息

    browsermob-proxy +selenium使用 - 知乎 Selenium+Browsermob-Proxy获取浏览器Network请求和响应_MingT-L的博客-CSDN博客_brows ...

最新文章

  1. 独家 | 谷歌医学AI在生活中的精确度(附链接)
  2. 关于异常Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
  3. Python Numba CPU下加速
  4. 设计模式 策略模式
  5. VMware vSphere Client WIN10安装问题
  6. python怎么将png转为tif_png转tif
  7. python删除列表一段元素_Python基础--list列表删除元素
  8. 精通 TensorFlow 1.x·翻译完成
  9. linux 扫描开放的端口命令,在Linux系统中检查(扫描)开放端口的方法
  10. 大数据平台应用 17 个关键技术处理
  11. 金禄电子通过注册:年营收13亿 二股东麦睿明因走私被判刑
  12. 区块链网络管理平台WeBASE双节点可视化部署
  13. CLIP-对比图文多模态预训练的读后感
  14. IPFS系列 - 体验 IPFS Docker
  15. 滚动(scroll)操作的应用
  16. 《全球通史》读书笔记2
  17. 虚拟桌面的服务器,虚拟桌面与集合
  18. correl函数_WPS表格办公— CORREL 函数的用法
  19. 安卓桌面软件_银河麒麟桌面操作系统V10
  20. matlab里real,matlab中real和imag

热门文章

  1. 一款java游戏收齐绿宝石哈,我的世界:十年来这是我见过最富的峡谷,12颗钻石外加5颗绿宝石...
  2. 理解单点登录和多点登录原理以及重点
  3. pow函数有四样写法,你知道吗
  4. java 操作svn_java操作svn工具类SvnUtil
  5. reaver 使用方法
  6. 【linux运维】用户管理并赋管理员权限
  7. Ubuntu下使用python读取doc和docx文档的内容
  8. XML代码读取,插入数据
  9. 社区团购重启,有钱的巨头们不能再为所欲为
  10. MySQL模糊查询:LIKE模式和REGEXP模式