前言
我有些时候想要我们公司组织架构和人员名单,但是又不能从企业微信直接导出,就想着能不能从OA里爬出来,在分析浏览器请求时,我发现这是Ajax异步请求得到的:

Yaodo·2023-03-17·151 次阅读
我有些时候想要我们公司组织架构和人员名单,但是又不能从企业微信直接导出,就想着能不能从OA里爬出来,在分析浏览器请求时,我发现这是Ajax异步请求得到的:

然而,这个请求被加密过了,完全看不出来怎么做的:

所以我就想能不能截取Selenium的请求,网上查了一圈,好像BrowserMob Proxy最靠谱。
前往官网下载:https://www.oracle.com/cn/java/technologies/downloads/
我安装的是jdk19-windows,链接是https://download.oracle.com/java/19/latest/jdk-19_windows-x64_bin.exe
安装好之后,记得把java的安装路径加到环境变量中

pip install browsermob-proxy
项目地址:https://github.com/lightbody/browsermob-proxy
我是直接在Jupyter Notebook中测试的
from browsermobproxy import Server server = Server(r"C:\jupyter\browsermob-proxy-2.1.4\bin\browsermob-proxy.bat") # 注意替换路径 server.start() proxy = server.create_proxy()
没有报错的话就差不多了。
# 导入相关模块
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from browsermobproxy import Server
import json
# 创建browsermobproxy监听服务器
server = Server(r"C:\jupyter\browsermob-proxy-2.1.4\bin\browsermob-proxy.bat") # 注意替换路径
server.start()
proxy = server.create_proxy()
# 打开Chrome
chrome_options = Options()
chrome_options.add_argument('--ignore-certificate-errors')
chrome_options.add_argument('--proxy-server={}'.format(proxy.proxy))
driver = webdriver.Chrome(options=chrome_options)
开始监听(这里不写a=也可以,但是有些时候在JupyterNotebook中会有输出结果,看起来不太美观)
a = proxy.new_har(options={
'captureContent': True,
'captureHeaders': True
})
使用Selenium控制Chrome进行一些操作触发Ajax,也可以直接用鼠标点点点
然后看下已经截取了多少操作
print(len(proxy.har['log']['entries'])) > 25
看下其中一条响应的结构
proxy.har['log']['entries'][6]['response']['content']
> {'size': 10425,
'mimeType': 'application/json;charset=utf-8',
'text': '[{"fname":"******","avatarUrl":"***","sortNumber":***,"username":"***"…………………………
看样子返回的是Json格式的数据,只不过以字符串的形式存储在text中,而且每条员工信息中都有username字段,那我就写一个生成器,把监听到的结果都解析出来。
# 定义一个解析截取的response的生成器
def parse_response(proxy):
for entry in proxy.har['log']['entries']:
if 'text' in entry['response']['content'].keys():
if 'username' in entry['response']['content']['text']:
yield json.loads(entry['response']['content']['text'])
# 根据生成器整合json到列表li中
gen = parse_response(proxy)
li = []
for x in gen:
li = li+x
# 看下采集了多少信息
print(len(li))
> 283
接下来稍微改成自动化的,就可以把所有人的信息都爬下来了,还可以设成定时任务呢。
Comments | NOTHING