前言最近一直在做公司内部系统。很多人需要从另一个内部系统导出数据,存入数据库进行分析。收集数据的工作很多,而且没办法直接拿到那个系统的接口,太难了,只能爬虫,但是cookie经常失败,为了不让我每隔一段时间重新注入cookie登录失败的时候,我写了一个手机版的网页,用于控制selenium在后台自动登录,拦截token和cookie。ajax请求抓包方案找资料的过程真是痛苦,幸好没有浪费时间,问题终于解决了。。。根据查到的资料,抓包中的数据有以下几种方式Selenium中的ajax请求。本地代理:browsermob-proxy(本文使用的方法)利用selenium的执行js功能注入ajaxhook并执行,然后在本地开启一个服务器接收拦截的ajax数据(见参考三)并使用第三方库selenium-wire,这是GitHub上的一个开源项目,可以直接拦截response_code和body。原理应该是让agent能够捕获selenium的性能。可以在性能日志中进行修改,拦截response_body(详见第一篇参考资料)使用本地代理本文使用代理服务器Browsermob-Proxy,是用Java编写的。有python封装的接口包方便交互...首先下载:https://github.com/lightbody/...安装python包:代码中使用了pipinstallbrowsermob-proxy,这里我截取了部分项目的代码,随便看看,完整的代码可以在官网文档或者参考资料中找到~有几个坑需要注意,我在代码中标注了#创建代理服务器self.server=Server(#Windows是bat,如果linux是另外一个没有后缀的r'path\bin\browsermob-proxy.bat',#这里可以自定义端口options={'port':9090})#开始这里的服务器,稍后关闭它,否则下次端口会占用冲突。self.server.start()#注意这里必须trustAllServers,否则selenium会报error_tunnel错误self.proxy=self.server.create_proxy(params={'trustAllServers':'true'})#设置selenium的proxyoptions=ChromeOptions()options.add_argument('--ignore-certificate-errors')options.add_argument(f'--proxy-server={self.proxy.proxy}')self.driver=webdriver.Chrome(options=options)使用proxy抓包,我的项目需要从ajax请求的header中提取token和cookie,关键部分代码截取如下:self.proxy.new_har('Createanameforthecapturedpacket',options={'captureHeaders':True,'captureContent':True})#找到需要的元素点击elem_query=self.driver.find_element_by_css_selector(elem_css_selector)elem_query.click()#点击按钮后等待获取数据time.sleep(5)result=self.proxy.hardata={}forentryinresult['log']['entries']:url=entry['request']['url']#根据url查找数据接口if'xxx/query'inurl:_response=entry['response']_content=_response['content']['text']foriteminentry['request']['headers']:#在header中提取tokenifitem['name']=='Authorization':data['authorization']=item['value']#提取header中的cookieifitem['name']=='Cookie':data['cookie']=item['value']breakprint(data)上面的代码也不是完整的代码,但是具体抓包的抓包过程已经表述完整,需要的同学可以按照根据自己的实际需要编码,只要能抓到数据,一切都好说~浏览器和代理服务器的退出没什么好写的,不过也有个小坑,一起来看看~从上面的代码中,我们也可以看出,我写了一个类来操作Selenium。程序执行后,必须关闭代理和服务器。否则Selenium会在后台留下一个chromedriver.exe进程占用资源。时间一长,系统内存就满了。我在类的__del__方法中添加了关闭代理服务器和浏览器的代码,如下:def__del__(self):print('SeleniumFxxkUnicomhasbeendeleted.')self.proxy.close()self.server.stop()forwininself.driver.window_handles:self.driver.switch_to.window(win)self.driver.close()os.system('taskkill/imchromedriver.exe/F')注意这个的driver.closeloop(),在__del__中是没办法正常执行driver.quit()的。按理说quit是最好的退出方式,但是他还是要import一些乱七八糟的模块,导致我这个__del__执行失败,只好曲线救国,先关闭所有的tabs,然后使用系统命令结束进程...有点硬编码,就这样吧,我累了。www.cnblogs.com/fish-...seleniumcrawler-getbrowser网络请求和响应:http://www.spiderpy.cn/blog/d...如何使用Hook实时处理和保存Ajax数据教你轻松拦截Selenium框架中SeleniumDriver.close()和driver.quit()中的Ajax数据关闭浏览器:https://blog.csdn.net/yangfen...欢迎来到专注于通信编程实验室互联网热点新技术探索和团队敏捷开发实践,在公众号“编程实验室”后台回复linux、flutter、c#、netcore、android、kotlin、java、python等获取相关技术文章和资料,还有问题可以在公众号后台留言~博客园:https://www.cnblogs.com/deali/代码直播间:https://live.bilibili.com/11883038知乎:https://www.zhihu.com/people/dealiaxy
