百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

Selenium爬虫实践:ajax请求抓包、浏览器退出

ztj100 2024-12-03 20:02 14 浏览 0 评论

前言

  最近在搞公司内部系统,累的一批,需要从另一个内部系统导出数据存到数据库做分析,有大量的数据采集工作,又没办法去直接拿到那个系统的接口,太难了,只能爬虫,但是cookie还经常失效,为了不每次登录失效就来找我重新注入Cookie,我写了一个手机版的网页,用来控制后台的selenium自动登录,截取token和cookie。


  ajax请求抓包方案

  搜索资料的过程真的痛苦,不过还好这时间没有白花,最终还是解决了问题……

  根据找到的资料,有以下几种方法可以在Selenium中抓取ajax请求中的数据。

  ·使用本地代理:browsermob-proxy

  · 使用selenium的执行js功能注入 ajax hook 并执行,然后本地开一个服务器接收拦截到的ajax数据

  · 用第三方库selenium-wire,这个是一个GitHub上的开源项目,可以直接截取response_code和body,原理应该走的也是代理

  · 开启selenium的性能抓取,在性能日志里面可以做改动,以拦截response_body

  使用本地代理

  本文使用Browsermob-Proxy这个代理服务器,这个是用Java写的,有一个python封装的接口包可以方便交互……

  先去下载:https://github.com/lightbody/browsermob-proxy/releases

  安装python包:

  pip install browsermob-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的代理

  options = ChromeOptions()

  options.add_argument('--ignore-certificate-errors')

  options.add_argument(f'--proxy-server={self.proxy.proxy}')

  self.driver = webdriver.Chrome(options=options)

  使用代理来进行抓包,我这个项目需要在ajax请求的header里面提取出token和cookie,截取了关键部分的代码如下:

  self.proxy.new_har('抓包名称 自己起一个', 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.har

  data = {}

  for entry in result['log']['entries']:

   url = entry['request']['url']

   # 根据URL找到数据接口

   if 'xxx/query' in url:

   _response = entry['response']

   _content = _response['content']['text']

   for item in entry['request']['headers']:

   # 提取出header里面的 token

   if item['name'] == 'Authorization':

   data['authorization'] = item['value']

   # 提取出header里面的 cookie

   if item['name'] == 'Cookie':

   data['cookie'] = item['value']

   break

  print(data)

  以上代码同样不是完整代码,不过已经将具体抓包的过程完整表达出来,需要的同学可以根据自己的实际需求进行编码,只要能抓到数据,一切都好说~

  浏览器和代理服务器退出

  这个没啥好写的,但是也有一个小坑,水一下吧~

  从上面的代码里也可以看出来,我写了一个类来操作Selenium,程序执行完了肯定要把代理和服务器关了,不然selenium会留着一个 chromedriver.exe 的进程在后台占用资源,时间一长,系统内存都满了。

  我在类的__del__方法中加入了关闭代理服务器和浏览器的代码,如下:

  def __del__(self):

   print('SeleniumFxxkUnicom has been deleted.')

   self.proxy.close()

   self.server.stop()

   for win in self.driver.window_handles:

   self.driver.switch_to.window(win)

   self.driver.close()

   os.system('taskkill /im chromedriver.exe /F')

  注意这个循环的driver.close(),在__del__里是没办法正常执行driver.quit()的,按理说quit才是最好的退出方法,但是他还要导入什么鬼乱七八糟的模块,导致我在这个__del__里执行失败,于是只好曲线救国,先把全部标签页关闭,然后用系统命令结束掉进程……

相关推荐

电脑装系统用GHOST好,还是原装版本好?老司机都是这么装的

Hello大家好,我是兼容机之家的咖啡。安装Windows系统是原版ISO好还是ghost好呢?针对这个的问题,我们先来科普一下什么是ghost系统,和原版ISO镜像两者之间有哪些优缺点。如果是很了解...

苹果 iOS 14.5.1/iPadOS 14.5.1 正式版发布

IT之家5月4日消息今日凌晨,苹果发布了iOS14.5.1与iPadOS14.5.1正式版更新。这一更新距iOS14.5正式版发布过去了一周时间。IT之家了解到,苹果表示,...

iOS 13.1.3 正式版发布 包含错误修复和改进

苹果今天发布了iOS13.1.3和iPadOS13.1.3,这是iOS13发布之后第四个升级补丁。iOS13.1.2两周前发布。iOS13.1.3主要包括针对iPad和...

还不理解 Error 和 Exception 吗,看这篇就够了

在Java中的基本理念是结构不佳的代码不能运行,发现错误的理想时期是在编译期间,因为你不用运行程序,只是凭借着对Java基本理念的理解就能发现问题。但是编译期并不能找出所有的问题,有一些N...

Linux 开发人员发现了导致 MacBook“无法启动”的 macOS 错误

“多个严重”错误影响配备ProMotion显示屏的MacBookPro。...

启动系统时无法正常启动提示\windows\system32\winload.efi

启动系统时无法正常启动提示\windows\system32\winload.efi。该怎么解决?  最近有用户遇到了开机遇到的问题,是Windows未能启动。原因可能是最近更改了硬件或软件。虽然提...

离线部署之两种构建Ragflow镜像的方式,dify同理

在实际项目交付过程中,经常遇到要离线部署的问题,生产服务器无法连接外网,这时就需要先构建好ragflow镜像,然后再拷到U盘或刻盘,下面介绍两种构建ragflow镜像的方式。性能测试(网络情况好的情况...

Go语言 error 类型详解(go语言 异常)

Go语言的error类型是用于处理程序运行中错误情况的核心机制。它通过显式的返回值(而非异常抛出)来管理错误,强调代码的可控性和清晰性。以下是详细说明及示例:一、error类型的基本概念内置接口...

Mac上“闪烁的问号”错误提示如何修复?

现在Mac电脑的用户越来越多,Mac电脑在使用过程中也会出现系统故障。当苹果电脑无法找到系统软件时,Mac会给出一个“闪烁的问号”的标志。很多用户受到过闪烁问号这一常见的错误提示的影响,如何解决这个问...

python散装笔记——177 sys 模块(python sys模块详解)

sys模块提供了访问程序运行时环境的函数和值,例如命令行参数...

30天自制操作系统:第一天(30天自制操作系统电子书)

因为咱们的目的是为了研究操作系统的组成,所以直接从系统启动的第二阶段的主引导记录开始。前提是将编译工具放在该文件目录的同级目录下,该工具为日本人川合秀实自制的编译程序,优化过的nasm编译工具。...

五大原因建议您现在不要升级iOS 13或iPadOS

今天苹果放出了iPadOS和iOS13的公测版本,任何对新版功能感兴趣的用户都可以下载安装参与测试。除非你想要率先体验Dark模式,以及使用AppleID来登陆Facebook等服务,那么外媒CN...

Python安装包总报错?这篇解决指南让你告别pip烦恼!

在Python开发中,...

苹果提供了在M1 Mac上修复macOS重装错误的方案

#AppleM1芯片#在苹果新的M1Mac推出后不久,我们看到有报道称,在这些机器上恢复和重新安装macOS,可能会导致安装错误,使你的Mac无法使用。具体来说,错误信息如下:"An...

黑苹果卡代码篇三:常见卡代码问题,满满的干货

前言...

取消回复欢迎 发表评论: