专栏首页烂笔头Selenium爬虫-获取浏览器Network请求和响应

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

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包:

pip install browsermob-proxy

3.例子

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

开启Proxy

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

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)

获取返回内容

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中看到的是一样的。

下面是完整代码:

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()
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:http://www.spiderpy.cn/复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 「Python爬虫系列讲解」十四、基于开发者工具 Network 的数据抓包技术

    前文回顾: 「Python爬虫系列讲解」一、网络数据爬取概述 「Python爬虫系列讲解」二、Python知识初学 「Python爬虫系列讲解」三、正则表...

    荣仔_最靓的仔
  • 教你轻松截获 Selenium 中的 Ajax 数据

    之前我们介绍了 ajax-hook 来实现爬虫的过程中截获 Ajax 请求,在这里再另外介绍一个工具 BrowserMob Proxy,利用它我们同样可以实现 ...

    崔庆才
  • 项目实战 | Python爬虫概述与实践(一)

    爬虫,又称为网络蜘蛛、网络机器人等,简单来说,就是请求网站并提取数据的自动化程序,可以代替人工在互联网上收集数据。

    用户3946442
  • 走过路过不容错过,Python爬虫面试总结

    Selenium 是一个Web 的自动化测试工具,可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。Sel...

    公众号---人生代码
  • 常见的爬虫的攻防策略

    从网络开始的那一刻起,爬虫就肩负了她的使命,数据收集!尤其是大数据时代的到来,越来越多的企业认识到数据的重要性,数据成了一个企业的重要资产,数据的多样性给了爬虫...

    C4rpeDime
  • Python 网页抓取库和框架

    作为 Python 开发人员,您可以使用许多 Web 抓取工具。现在就来探索这些工具并学习如何使用它们。

    用户8847084
  • scrapy中selenium的应用

      在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加...

    py3study
  • Python爬虫从入门到精通——爬虫基础(一):爬虫基本原理[通俗易懂]

    我们可以把互联网比作一张大网,而爬虫便是在网上爬行的蜘蛛。把网的节点比作一个个网页,爬虫爬到这就相当于访问了该页面,获取了其信息。可以把节点间的连线比作网页与网...

    全栈程序员站长
  • Selenium Webdriver 3.X源码分析之Proxy.py代理能力

    在使用selenium webdriver测试或进行爬虫动作时,如果未在目标服务的白名单内,随着爬取的频率增多会被禁止访问目标服务。

    苦叶子
  • Python爬虫系列(六)外国图库Unsplash图片自动化下载

    再做一个网站,要找一些高清图片,然后同学推荐了这个网站:Unsplash 。但是每张图片下载要手动点,然后下拉加载更多图片,效率不高,所以自己写了爬虫程序,进...

    致Great
  • Python网络爬虫精要

    requests负责向网页发送HTTP请求并得到响应,parsel负责解析响应字符串,selenium负责JavaScript的渲染。

    全栈程序员站长
  • Python下利用Selenium获取动态页面数据

      利用python爬取网站数据非常便捷,效率非常高,但是常用的一般都是使用BeautifSoup、requests搭配组合抓取静态页面(即网页上显示的数据都可...

    小老鼠
  • 爬虫与反爬虫的博弈

    近来这两三个月,我陆续将自己学到的爬虫技术分享出来。以标准网络库 urllib 的用法起笔,接着介绍各种内容提供工具,再到后续的 scrapy 爬虫框架系列。我...

    猴哥yuri
  • 如何轻松爬取网页数据?

    在实际工作中,难免会遇到从网页爬取数据信息的需求,如:从微软官网上爬取最新发布的系统版本。很明显这是个网页爬虫的工作。本文将根据网站特性进行分类介绍几种使用py...

    腾讯移动品质中心TMQ
  • Python爬虫 selenium自动化 利用搜狗搜索爬取微信公众号文章信息

    下面以在搜狗里搜索 网易云热评墙 为例,爬取得到的全部文章信息(包括标题、日期、链接),并保存到Excel,使用Selenium来实现。

    叶庭云
  • PHP高级爬虫实践|记一次失败的淘宝自动登录尝试

    笔者最近在逛sf.gg的时候,发现了一个关于每天“自动登录淘宝网站”的问题,很久没玩采集数据的我手有点痒痒,于是开始了自动登录淘宝网站的爬虫之旅。

    猿哥
  • Python 网络爬虫概述

    几乎每个网站都有一个名为robots.txt的文档,当然也有有些网站没有设定。对于没有设定robots.txt的网站可以通过网络爬虫获取没有口令加密的数据,也就...

    Python知识大全
  • 外行学 Python 爬虫 第二篇 获取内容

    一个无法获取内容的爬虫不是一个真正的爬虫,爬虫的首要目标是从网络上获取内容。目前我们所看到的网页都是通过超文本传输协议「英语:HyperText Transfe...

    keinYe
  • 【爬虫军火库】Chrome F12使用Network分析异步请求

    昨天在知乎收到一条邀答(https://www.zhihu.com/question/263298910): 我想做一个web scrape,用requests...

    不二小段

扫码关注腾讯云开发者

领取腾讯云代金券