提取仅在 Network>XHR >角度响应中可见的 JSON 响应数据

Extract JSON response data only visible in Network>XHR > angular response

提问人:Gurjeet Buttar 提问时间:6/13/2022 最后编辑:JagjotGurjeet Buttar 更新时间:10/16/2022 访问量:507

问:

提前感谢您查看此查询。

我正在尝试使用 Chrome 浏览器的检查功能从响应中提取在 HTML 代码中不可见的数据。angular

我研究并寻找解决方案,并且能够在(屏幕截图)中找到数据,并且还根据我在研究该主题中获得的知识编写了代码。响应Network (tab)>Fetch/XHR>Response

为了读取响应,我正在尝试以下代码,方法是传递从主 URL 获取的参数和 cookie,并通过下面进一步共享的主代码中的以下代码段将它们传递到请求中。这些参数是根据我在选项卡下找到的信息创建的Network (tab)>Fetch/XHR>Header

http = urllib3.PoolManager()
r = http.request('GET', 
             'https://www.barchart.com/proxies/core-api/v1/quotes/get?' + urlencode(params),
             headers=headers
            )

问题

  1. 请帮助确认我遗漏了什么或做错了什么?我想读取和存储json响应,我该怎么办?要提取的 JSON
  2. 还有没有办法使用函数读取参数?,而不是像我在下面所做的那样分配它们。我的意思是类似于我对 cookie 所做的(标头 = x.cookies.get_dict()),有没有办法读取和分配参数?

以下是我正在使用的完整代码。

import requests
import urllib3
from urllib.parse import urlencode

url  = 'https://www.barchart.com/etfs-funds/performance/percent-change/advances?viewName=main&timeFrame=5d&orderBy=percentChange5d&orderDir=desc'

header = {'accept': 'application/json', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'} 

s = requests.Session()
x = s.get(url, headers=header)

headers = x.cookies.get_dict()
params = {    'lists': 'etfs.us.percent.advances.unleveraged.5d',
    'orderDir': 'desc',
    'fields': 'symbol,symbolName,lastPrice,weightedAlpha,percentChangeYtd,percentChange1m,percentChange3m,percentChange1y,symbolCode,symbolType,hasOptions',
    'orderBy': 'percentChange',
    'meta': 'field.shortName,field.type,field.description,lists.lastUpdate',
    'hasOptions': 'true',
    'page': '1',
    'limit': '100',
    'in(leverage%2C(1x))':'',
    'raw': '1'}


http = urllib3.PoolManager()
r = http.request('GET', 
                 'https://www.barchart.com/proxies/core-api/v1/quotes/get?' + urlencode(params),
                 headers=headers
                )
r.data

r.data响应如下,返回错误。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">\n<HTML><HEAD><META
HTTP-EQUIV="Content-Type" CONTENT="text/html;
charset=iso-8859-1">\n<TITLE>ERROR: The request could not be
satisfied</TITLE>\n</HEAD><BODY>\n<H1>403 ERROR</H1>\n<H2>The request
could not be satisfied.</H2>\n<HR noshade size="1px">\nRequest
blocked.\nWe can\'t connect to the server for this app or website at
this time. There might be too much traffic or a configuration error.
Try again later, or contact the app or website owner.\n<BR
clear="all">\nIf you provide content to customers through CloudFront,
you can find steps to troubleshoot and help prevent this error by
reviewing the CloudFront documentation.\n<BR clear="all">\n<HR noshade
size="1px">\n<PRE>\nGenerated by cloudfront (CloudFront)\nRequest ID:
vcjzkFEpvdtf6ihDpy4dVkYx1_lI8SUu3go8mLqJ8MQXR-KRpCvkng==\n</PRE>\n<ADDRESS>\n</ADDRESS>\n</BODY></HTML>
python json angularjs

评论

0赞 oruchkin 10/14/2022
你解决了这个问题吗?
0赞 Gurjeet Buttar 10/16/2022
不,这没有解决

答:

1赞 oruchkin 10/16/2022 #1

你可以通过名字得到回应,在你的屏幕截图上的名字是你需要的,你还需要安装get?lists=etfs.usplaywright

这里有一个指南:https://www.zenrows.com/blog/web-scraping-intercepting-xhr-requests#use-case-nseindiacom

from playwright.sync_api import sync_playwright 

url = "https://www.barchart.com/etfs-funds/performance/percent-change/advances?viewName=main&timeFrame=5d&orderBy=percentChange5d&orderDir=desc"
with sync_playwright() as p: 
    def handle_response(response): 
        # the endpoint we are insterested in 
        
        if ("get?lists=etfs.us" in response.url): 
            print(response.json())
   
    browser = p.chromium.launch() 
    page = browser.new_page() 
    
    page.on("response", handle_response) 
    page.goto(url, wait_until="networkidle")  
    page.context.close() 
    browser.close()

评论

0赞 Gurjeet Buttar 10/22/2022
Oruchkin,感谢您抽出宝贵时间回复。我采取了必要的步骤让剧作家工作。然后尝试使用上面的代码,也尝试了代码链接。在这两种情况下,print 语句都不会返回任何内容。我错过了什么
0赞 Gurjeet Buttar 10/22/2022
在进一步调查中,我发现函数应该遍历响应中的每个 url 并查找具有“get?lists=etfs.us”的 url,但似乎响应没有提供上述情况的 url,也没有提供示例链接中的 NSE 示例。我尝试了 twitter 示例,响应确实返回了 url。知道为什么 barchart.com 和 nse.com 不返回网址吗?def handle_response(response):
0赞 oruchkin 10/22/2022
尝试执行文章中的每个示例,您可能会逐步解决您的问题。它应该可以工作,至少它在我的网站上工作
1赞 Gurjeet Buttar 10/25/2022
我之前收到 403 错误。必须更改此行中的参数,现在它返回所需的数据集。谢谢browser = p.chromium.launch(headless=False)