前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Selenium爬虫-获取浏览器Network请求和响应

Selenium爬虫-获取浏览器Network请求和响应

作者头像
jhao104
发布2019-12-05 22:49:36
26.7K5
发布2019-12-05 22:49:36
举报
文章被收录于专栏:烂笔头

1.问题

自从发现 Selenium 这块新大陆后,许多异步加载、js加密、动态Cookie等问题都变得非常简单,大大简化了爬虫的难度。

但是有些时候使用 Selenium 仍然有一些缺陷,比如现在很多网站数据都是通过json结构的接口来交互,通过分析报文的方式直接发包可以直接拿到json数据,数据不但全而且还很好解析,这比解析html网页容易多了。另一个非常重要的问题就是,很多时候一些接口返回的关键信息是不在html网页上显示的,通过 Selenium 拿到的 page_source 便没有这些字段。

那么如何解决这些问题呢?我们在做爬虫开发的时候经常用到浏览器的开发者工具,分析网页元素,查看资源加载(Network)等。Selenium + Webdriver 虽然能够定位DOM元素、操作页面、获取网页等。但是 Selenium 终归只能处理“结果”,它无法得知浏览器请求的数据接口信息。如果我们能像浏览器Network那样获取到所有接口的请求和返回信息,那么问题不都解决了么。

而本文介绍的解决方案是:使用 webdriver 通过proxy访问网络,再收集proxy端的请求和返回内容,从而获取到数据,而这个proxy就类似于 fiddler 抓包软件。而文本介绍使用的是 Browsermob-Proxy

2.Browsermob-Proxy

Browsermob-Proxy是一个开源的Java编写的基于LittleProxy的代理服务。Browsermob-Proxy的具体流程有点类似与Flidder或Charles。即开启一个端口并作为一个标准代理存在,当HTTP客户端(浏览器等)设置了这个代理,则可以抓取所有的请求细节并获取返回内容。

安装

直接到项目的github上下载打好的压缩包即可:https://github.com/lightbody/browsermob-proxy/releases ,支持Linux和Windows。

安装对应的python包:

代码语言:javascript
复制
pip install browsermob-proxy

3.例子

这里以抓取抖音用户视频为例,目标url:https://www.iesdouyin.com/share/user/63174596206 ,使用Selenium + Webdriver + Browsermob-Proxy 获取接口返回的数据。

开启Proxy
代码语言:javascript
复制
from browsermobproxy import Server

server = Server(r'Browsermob-Proxy下载包解压路径\browsermob-proxy-2.1.4\bin\browsermob-proxy.bat')
server.start()
proxy = server.create_proxy()
配置Proxy启动WebDriver
代码语言:javascript
复制
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--proxy-server={0}'.format(proxy.proxy))

driver = webdriver.Chrome(chrome_options=chrome_options)
获取返回内容
代码语言:javascript
复制
base_url = "https://www.iesdouyin.com/share/user/63174596206"
proxy.new_har("douyin", options={'captureHeaders': True, 'captureContent': True})

driver.get(base_url)
result = proxy.har

for entry in result['log']['entries']:
    _url = entry['request']['url']
    # 根据URL找到数据接口
    if "/api/v2/aweme/post" in _url:
        _response = entry['response']
        _content = _response['content']['text']
        # 获取接口返回内容
        print(_content)

server.stop()
driver.quit()

通过har就能获取浏览器所有的请求,然后过滤出数据接口就OK,而且拿到的结构和在浏览器开发者模式Network中看到的是一样的。

下面是完整代码:

代码语言:javascript
复制
from selenium import webdriver
from browsermobproxy import Server

from selenium.webdriver.chrome.options import Options

server = Server(r'Browsermob-Proxy下载包解压路径\browsermob-proxy-2.1.4\bin\browsermob-proxy.bat')
server.start()
proxy = server.create_proxy()

chrome_options = Options()
chrome_options.add_argument('--proxy-server={0}'.format(proxy.proxy))

driver = webdriver.Chrome(chrome_options=chrome_options)

base_url = "https://www.iesdouyin.com/share/user/63174596206"
proxy.new_har("douyin", options={'captureHeaders': True, 'captureContent': True})
driver.get(base_url)


result = proxy.har

for entry in result['log']['entries']:
    _url = entry['request']['url']
    # 根据URL找到数据接口
    if "/api/v2/aweme/post" in _url:
        _response = entry['response']
        _content = _response['content']['text']
        # 获取接口返回内容
        print(_content)

server.stop()
driver.quit()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年7月11日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.问题
  • 2.Browsermob-Proxy
    • 安装
    • 3.例子
      • 开启Proxy
        • 配置Proxy启动WebDriver
          • 获取返回内容
          相关产品与服务
          云开发 CLI 工具
          云开发 CLI 工具(Cloudbase CLI Devtools,CCLID)是云开发官方指定的 CLI 工具,可以帮助开发者快速构建 Serverless 应用。CLI 工具提供能力包括文件储存的管理、云函数的部署、模板项目的创建、HTTP Service、静态网站托管等,您可以专注于编码,无需在平台中切换各类配置。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档