浏览器抓取网页(如何找到json代码获取目标信息?(一))

优采云 发布时间: 2022-03-13 21:08

  浏览器抓取网页(如何找到json代码获取目标信息?(一))

  前言

  很多情况下,使用爬虫时无法获取到我们想要的信息,因为有些数据是用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})

  使用cookies向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登陆目标url

data=html.text

data=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等获取的信息重复。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线