前言

很多时候使用爬虫时并不能或许到我们想要的信息,这是因为有些数据是用json代码书写,并通过xhr异步加载到网页。
因此我们并不能在页面中获取,此时可通过解析json代码获取目标信息。


一、如何找到目标xhr地址?

以抖音中的canvas图片信息为例,从下图可以看出,图中有数字出现,但定位到canvas中却并没附带这些数据:
这个时候我们可以通过查找网络中的xhr请求,找到初始数据的链接,如下图操作,在出现的xhr请求中寻找到目标文件,如果xhr下没有所需数据,可以尝试刷新页面:

经尝试后不难找到初始数据存放位置,可以看出请求方法为get,从图中很容以看到我们所需要的性别数据:


接下来就是用代码实现这一步骤。

二、代码实现

1.准备条件

安装Browsermob-Proxy和chromedriver.exe:

下载Browsermobproxy

下载chromedriver驱动
将下载好后的brosermob-proxy-2.1.4和浏览器对应版本的chromedriver保存至main.py的同级目录下:

2.编写代码

引入库:

import json#读取json数据时需要用到
import os
import requests
from selenium import webdriver
from browsermobproxy import Server

配置代理环境和chrome浏览器:

path=os.getcwd()#获取当前路径
server = Server(path+"\\browsermob-proxy-2.1.4\\bin\\browsermob-proxy")
server.start()
proxy = server.create_proxy()
chrome_options =webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server={0}'.format(proxy.proxy))
chrome_options.add_argument('--ignore-certificate-errors')
chrome_options.add_argument("---kiosk")#设置全屏
driver = webdriver.Chrome(options=chrome_options)
#
proxy.new_har(options={'captureHeaders': True, 'captureContent': True})

使用cookie给chrome浏览器增加用户信息:

因为我这里是以抖音为例,抖音里的json数据需要登陆账号才能获取,否则会报“无操作权限”,可根据自己的需求选择是否使用。

cookie=driver.get_cookies()jsonCookies=json.dumps(cookie)
with open ("driver.json",'w') as f:f.write(jsonCookies)
with open('driver.json','r',encoding='utf-8') as f:listCookies=json.loads(f.read())
cookie = [item["name"] + "=" + item["value"] for item in listCookies]
cookiestr = '; '.join(item for item in cookie)

获取的网络请求和读取数据:

result = proxy.har#读取当前网页信息
for rs in result['log']['entries']:a=rs['request']['url']#获取url链接if "aweme/v1/creator/data/item/audience" in a:#查找目标关键字(这里可根据自己的需求更改搜索内容)url=a#得到目标url#以下是使用cookie获取到get请求中的json数据headers = {'cookie': cookiestr,#若不使用cookie可去掉这句话"User_Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36'}      html=requests.get(url=url,headers=headers)#用request登陆目标urldata=html.textdata=json.loads(data)#将json数据转为字典数据,以便使用

使用获取到的数据:

查看数据如下:

此处用字典的获取方法或用正则表达式获取均可

for k in data:if k == 'gender_data':gender = data.get(k)for i in gender:for j in i.values():if j == '1':dict['gender_num'] =dict.get('gender_num',0) + int(i.get('value'))dict['male'] = int(i.get('value'))if j == '2':dict['female'] = int(i.get('value'))dict['gender_num'] =dict.get('gender_num',0) +int(i.get('value'))

打印数据

print(dict['gender_num'])
print(dict['male'])
print(dict['female'])


总结

这是寒假做一个项目时遇到的问题,网上没找到完整的方法,自己到处查阅资料最后做出来的。
browsermobproxy的使用稍显麻烦,希望可以给大家一个参考,当然这里我只是提供了一些必要的流程,有些使用爬虫的细节我略去了,比如在不同的网页中可以都使用一次proxy.new_har(),可以避免proxy.har获取到的信息重复出现等等。

详解python使用browsermobproxy获取当前网页xhr的get数据方法相关推荐

  1. python读取中文文件乱码-详解Python的json文件读取及中文乱码显示问题解决方法...

    Python的json文件读取及解决中文乱码显示问题 本文实例讲述了Python实现的json文件读取及中文乱码显示问题解决方法.分享给大家供大家参考,具体如下: city.json文件的内容如下: ...

  2. python 文件流转base64_详解Python中使用base64模块来处理base64编码的方法

    base64模块是用来作base64编码解码的.这种编码方式在电子邮件中是很常见的. 它可以把不能作为文本显示的二进制数据编码为可显示的文本信息.编码后的文本大小会增大1/3. 闲话不说了,base6 ...

  3. python手机壁纸超清_详解Python静态网页爬取获取高清壁纸

    前言 在设计爬虫项目的时候,首先要在脑内明确人工浏览页面获得图片时的步骤 一般地,我们去网上批量打开壁纸的时候一般操作如下: 1.打开壁纸网页 2.单击壁纸图(打开指定壁纸的页面) 3.选择分辨率(我 ...

  4. python获取mp3音频数据_详解python进行mp3格式判断 python怎么读取mp3文件

    python中哪个库有em算法 EM算法初稿2016-4-28 初始化三个一维的高斯分布 from numpy import * import numpy as np import matplotli ...

  5. python gil 解除_详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案

    先看一道GIL面试题: 描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐明多线程抓取程序是否可比单线程性能有提升,并解释原因. GIL:又叫全局解 ...

  6. python import io_详解Python IO编程

    文件读写 读文件 try: # windows下utf8 f = open('./README.md', 'r', encoding='utf8', errors='ignore') print(f. ...

  7. scrapy爬虫储存到mysql_详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库

    获取要爬取的URL 爬虫前期工作 用Pycharm打开项目开始写爬虫文件 字段文件items # Define here the models for your scraped items # # S ...

  8. 文件不能断点 webstorm_详解python使用金山词霸的翻译功能(调试工具断点的使用)...

    这篇文章主要介绍了详解python使用金山词霸的翻译功能(调试工具断点的使用),本文给大家介绍得非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 今天试着用python获取金山 ...

  9. python中list[1啥意思_详解Python中list[::-1]的几种用法

    本文主要介绍了Python中list[::-1]的几种用法,分享给大家,具体如下: s = "abcde" list的[]中有三个参数,用冒号分割 list[param1:para ...

  10. pythonnamedtuple定义类型_详解Python中namedtuple的使用

    namedtuple是Python中存储数据类型,比较常见的数据类型还有有list和tuple数据类型.相比于list,tuple中的元素不可修改,在映射中可以当键使用. namedtuple: na ...

最新文章

  1. 【进阶玩法】Angular用emit()实现类似Vue.js的v-model双向绑定[(ngModel)]功能
  2. thinkJava@第五章@隐藏实施过程
  3. 初识LVS(一)——LVS介绍和LVS的NAT工作模式
  4. arcgis 出图背景_ArcGIS中导出数据时老显示导出失败,显示“保存对象时出错”什么原因?...
  5. 4种实例 advice aop_Java动态代理在Spring的应用:AOP编程与动态代理知识
  6. umi权限路由_Umi 小白纪实(三)—— 震惊!路由竟然如此强大!
  7. Vue-Router的路由实例构造配置
  8. 监听器第一篇【基本概念、Servlet各个监听器】
  9. UPDATE INNER JOIN 两表联合更新
  10. 免费文件分发服务器,文件分发服务器 AWS CloudFront(CDN)使用入门-以S3为例 Lebal:Research...
  11. 台式计算机卡拉ok点歌系统,如何用现有的台式电脑改造歌厅点歌系统
  12. 聚集索引与非聚集索引
  13. [JPA错误]javax.persistence.EntityNotFoundException: Unable to find xxx
  14. 区间缩放,标准化,归一化
  15. java泛型的上界下界
  16. 为什么说社群团购时代来临了?
  17. react 中 ref 管理列表
  18. 编译android平台libyuv库(使用ndk)
  19. 在html中设置margin属性,margin
  20. RichView 文档 段落 项目 ITEM

热门文章

  1. C++ gflags
  2. 华为:一个中国民族企业的“下半场”在哪里?
  3. 任正非亲自参与,2021数字化转型再造华为!
  4. 西门子g120变频器接线图_西门子变频器G120如何通过速度限幅来避免飞车的发生...
  5. 晨曦记账本记账收支,统计结余
  6. 使用DebenuPDFLibrary导出微信中的照片
  7. 抖音广告怎么投放【抖音广告投放教程】
  8. wav格式怎么转换成flac?
  9. Javascript实现视频文件播放功能
  10. 高阶整车域控制器的详细设计方案