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

56次阅读

共计 2946 个字符,预计需要花费 8 分钟才能阅读完成。

前言

最近在搞公司外部零碎,累的一批,须要从另一个外部零碎导出数据存到数据库做剖析,有大量的数据采集工作,又没方法去间接拿到那个零碎的接口,太难了,只能爬虫,然而 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/…

装置 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__ 里执行失败,于是只好曲线救国,先把全副标签页敞开,而后用系统命令完结掉过程…… 有点硬编码了,就这样吧,累了

参考资料

  • 利用 selenium 抓取网页的 ajax 申请:https://www.cnblogs.com/fish-…
  • Selenium 爬虫 - 获取浏览器 Network 申请和响应:http://www.spiderpy.cn/blog/d…
  • 如何用 Hook 实时处理和保留 Ajax 数据
  • 教你轻松截获 Selenium 中的 Ajax 数据
  • selenium 框架中 driver.close()和 driver.quit()敞开浏览器: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

正文完
 0