之前我在《使用MitmProxy离线缓存360度全景网页》一文中演示了如何搭建python代理服务器MitmProxy。

但之前是纯手工访问网页缓存数据,如果我们希望能够自动访问网页并对接代理下载数据,可以通过selenium控制游览器实现自动访问。

对接selenium的代理服务器,有种用法是使用 browsermobproxy,它基于Java开发,需要在https://chromedevtools.github.io/devtools-protocol/tot/Network/下载对应文件。

参考:https://blog.csdn.net/u010741112/article/details/118674293

不过个人在研究后发现它只是一个基于Java开发的代理服务器,对编码的处理不够准确经常出现乱码,而且难以还原。

解决他的乱码问题,得添加Java代码的拦截器设置编码,例如设置文本都以GBK编码解码:

proxy = server.create_proxy()
# 根据实际网站设置
proxy.response_interceptor('''if (contents.isText() ) {response.headers().set("Content-Type", "text/json;charset=GBK");}
''')

整体而言,个人感觉很难用。远远不如selenium直接对接MitmProxy代理用的方便。

selenium使用代理服务器的代码示例:

from selenium import webdriveroption = webdriver.ChromeOptions()
option.add_argument(f'--proxy-server=127.0.0.1:8080')
browser = webdriver.Chrome(options=option)
browser.get('https://www.baidu.com/')

这样只有我们就通过MitmProxy代理服务器获取所有经过selenium控制的游览器访问的数据,这样我们同时还实现自动化控制和数据获取之间的解耦,mitmdump加载的脚本专门复杂拦截数据并处理,selenium代码专门负责自动化控制。

而今天我要介绍的是seleniumwire这个库,关于这个库的完整用法可以参考:https://pypi.org/project/selenium-wire/

安装:

pip install selenium-wire

注意:Linux和Mac系统必须额外安装openssl用于解码https的数据。

CentOS:yum install openssl

Mac:brew install openssl

这个库基本上可以使用被控制的游览器访问留下的历史记录,可随意的下载,但是默认仅保存原始的字节数据,若遇到压缩数据需要自行解压。

下面我们以网易财经的行情中心数据演示一下,完整代码如下:

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from seleniumwire import webdriver
import json
import gzip
import time
import pandas as pdbrowser = webdriver.Chrome()browser.get('http://quotes.money.163.com/old/#query=dy019000&DataType=HS_RANK&sort=PERCENT&order=desc&count=24&page=0')
wait = WebDriverWait(browser, 30)
# 等待表格组件加载完毕
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "table.ID_table")))def fetch_data():for request in reversed(browser.requests):if not request.url.startswith("http://quotes.money.163.com/hs/service/diyrank.php"):continueres = request.responseif not res or res.status_code != 200:continueif res.headers["content-encoding"] == "gzip":# gzip解压res.body = gzip.decompress(res.body)return json.loads(res.body.decode('u8'))def wait_loading():"等待 等待组件的消失"for _ in range(150):if not browser.find_elements_by_css_selector("div.loading-cover"):breaktime.sleep(0.2)data = []
for i in range(100):wait_loading()  # 等待加载完毕page = fetch_data()  # 从历史游览记录中获取数据if page:print(i, len(page['list']), page['list'][0]['CODE'])  # 检测数据data.extend(page['list'])  # 插入数据a_tag = browser.find_element_by_css_selector("div.ID_pages a:nth-last-of-type(1)")del browser.requests  # 清空游览器缓存if a_tag.text != "下一页":breaka_tag.click()
df = pd.DataFrame(data)
df

1048 rows × 25 columns

重点代码解释:

if res.headers["content-encoding"] == "gzip":res.body = gzip.decompress(res.body)

这段代码实现对gzip压缩的网络数据进行自动解压,若存在其他类型的压缩还需要编写针对性代码,通用的解压缩代码:

import gzip
import zlib
import brotlicontent_encoding = res.headers["content-encoding"]
if content_encoding == "gzip":res.body = gzip.decompress(res.body)
elif content_encoding == "deflate":res.body = zlib.decompress(res.body)
elif content_encoding == "br":res.body = brotli.decompress(res.body)

wait_loading方法用于检测数据是否已经加载完毕,原理时每隔0.2秒查看一下loading组件是否还存在,不存在则说明加载数据的过程已经结束。

browser.requests缓存了游览器在访问过程获取的所有数据,就好像游览器开发者工具的Network,reversed(browser.requests)的目的是倒着查看数据,即优先查看最新获取的数据。通过这次方式,即使不清理历史缓存,也能较为正确获取数据。

del browser.requests的作用是清理缓存,目的是在下一次点击访问前先清理历史缓存,从而使数据获取的速度变得更快。

selenium对接代理与seleniumwire访问开发者工具NetWork相关推荐

  1. 「Python爬虫系列讲解」十四、基于开发者工具 Network 的数据抓包技术

    本专栏是以杨秀璋老师爬虫著作<Python网络数据爬取及分析「从入门到精通」>为主线.个人学习理解为主要内容,以学习笔记形式编写的. 本专栏不光是自己的一个学习分享,也希望能给您普及一些关 ...

  2. chrome浏览器开发者工具network面板过滤、隐藏指定的请求

    在我的这篇文章中介绍了,怎么在开发者工具network面板中屏蔽请求,但是屏蔽请求的意思是这个请求不会再发出去,如果是功能性请求,直接屏蔽掉会影响功能,所以我们一般很少用到. 我们常用的方法其实是过滤 ...

  3. Chrome开发者工具network标签页里的transferred over network和resources loaded by the page的区别

    如下图所示: network底部有1.1 MB transferred over network和5.1 MB resources loaded by the page. 这两个大小有何区别? 有中文 ...

  4. Chrome开发者工具Network标签页中观察到的set-cookie jsessionid是什么东西

    在Chrome开发者工具里经常能观察到HTTP响应里包含的字段: Set-Cookie: JSESSIONID= XXX 之后,就能在客户端cookie里观察到JSESSIONID=后面的值. 根据G ...

  5. 谷歌开发者工具 Network:Disable cache 和 Preserve log

    参考博文地址:https://my.oschina.net/af666/blog/871793 Network Disable cache(禁止缓存):勾上,修改代码之后,刷新页面没有更新,看有没有禁 ...

  6. Angular http client发起的请求在Chrome开发者工具network标签页里观察到的界面

    源代码: import { Injectable } from '@angular/core'; import {HttpClient} from '@angular/common/http';@In ...

  7. Chrome 开发者工具无法显示服务器正常返回的 HTTP 请求 - Failed to load response data

    今天做开发时遇到一个问题,Chrome 开发者工具 network 标签里,虽然一个 HTTP 请求已经成功从服务器端返回,但是 Chrome 开发者工具里,仍然显示 Failed to load r ...

  8. 使用 Chrome 开发者工具研究一个基于 Angular 开发的网站源代码

    Chrome 开发者工具是前端开发工程师工具箱里使用频率最高的工具之一. 本文通过一个具体的例子,给大家分享笔者工作中,是如何通过 Chrome 开发者工具,分析一个网站的实现明细. 下图是 SAP ...

  9. 微信开发者工具,出现“当前系统代理不是安全代理,是否信任?”

    网上找了很多种方法,如:在目录下找"当前系统代理不是安全代理",最新版(1.03.2010240),发现搜索不到,还有方法就是改注册表的,看过评论也没有用,当然过于麻烦没有尝试,最 ...

最新文章

  1. 前端如何转换 schema 和 xml
  2. hdu-4539 郑厂长系列故事――排兵布阵(状态压缩)
  3. mysql平均值函数保留两位小数点_用sql的avg(score)求完平均值后,保存两位小数的方法(用于查询或视图)...
  4. ubuntu-基本命令篇-18-压缩包管理
  5. (转)C++的 RTTI 概念和用途
  6. Oracle 10g RAC 升级(CPU Update)之--升级CRS
  7. Codeforces Round #281 (Div. 2) A. Vasya and Football 模拟
  8. 三星U-Boot-1.1.6源码分析lowlevel_init.S (board\samsung\smdk6410)
  9. python调用perl_文本处理,用perl 还是python?
  10. 上大计算机专业,高校“计算机”专业排行榜,东大完成逆袭,上交大不敌哈工大...
  11. Java程序设计基础——cmd编译运行java文件详细步骤
  12. 含泪整理上万射击枪战游戏源码素材,你想要的这里都有!
  13. 微信小程序实现图片上传功能
  14. 考虑购买的 DELL 配置
  15. 实战来了!聊聊电商系统中红包雨功能的设计与实现
  16. Leetcode刷题100天—5855. 找出数组中的第 K 大整数(优先队列)—day22
  17. 【绝对好玩】我编过最好的游戏 o( ̄▽ ̄)d
  18. java 中的锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁
  19. java/kafka的使用,生产者 ,发布/发送消息,自定义数据/json数据,实战。
  20. ad19原理图标注_AD19如何让原理图的栅格显示更加清晰醒目

热门文章

  1. TCP协议:SYN、ACK、ISN、SeqNumber
  2. 这里稍稍记录一下null和undefined
  3. 开源网安亮相粤港澳大湾区CIO高峰论坛,保障企业数字化安全转型
  4. 金莹江苏省计算机学会教授,2020年江苏省大学生程序设计大赛在我校举办
  5. 游戏测试的工作(来自网络)
  6. ECharts 2.27学习笔记:地图标线markLine炫光特效,模拟百度迁徙
  7. 模拟电磁曲射炮_H题 方案分析【2019年电赛】【刘新宇qq522414928】
  8. 一文读懂区块链隐私技术系列之环签名
  9. JSON基础入门实战讲解在线视频课程-JSON 使用 JavaScript 语法
  10. python自动化测试之unittest简介讲解